Fixed bad JS codegen for new json with tables. Added json to JS tests.

This commit is contained in:
Yuriy Glukhov 2016-02-29 16:57:30 +02:00
commit 1b4fc744db
3 changed files with 38 additions and 30 deletions

View file

@ -891,10 +891,12 @@ proc genFieldAccess(p: PProc, n: PNode, r: var TCompRes) =
r.res = "$1['$2']" % [r.res, f.loc.r] r.res = "$1['$2']" % [r.res, f.loc.r]
r.kind = resExpr r.kind = resExpr
proc genAddr(p: PProc, n: PNode, r: var TCompRes)
proc genCheckedFieldAddr(p: PProc, n: PNode, r: var TCompRes) = proc genCheckedFieldAddr(p: PProc, n: PNode, r: var TCompRes) =
let m = if n.kind == nkHiddenAddr: n.sons[0] else: n let m = if n.kind == nkHiddenAddr: n.sons[0] else: n
internalAssert m.kind == nkCheckedFieldExpr internalAssert m.kind == nkCheckedFieldExpr
genFieldAddr(p, m.sons[0], r) # XXX genAddr(p, m, r) # XXX
proc genCheckedFieldAccess(p: PProc, n: PNode, r: var TCompRes) = proc genCheckedFieldAccess(p: PProc, n: PNode, r: var TCompRes) =
genFieldAccess(p, n.sons[0], r) # XXX genFieldAccess(p, n.sons[0], r) # XXX

View file

@ -1123,9 +1123,9 @@ else:
proc parseNativeJson(x: cstring): JSObject {.importc: "JSON.parse".} proc parseNativeJson(x: cstring): JSObject {.importc: "JSON.parse".}
proc getVarType(x): JsonNodeKind = proc getVarType(x: JSObject): JsonNodeKind =
result = JNull result = JNull
proc getProtoName(y): cstring proc getProtoName(y: JSObject): cstring
{.importc: "Object.prototype.toString.call".} {.importc: "Object.prototype.toString.call".}
case $getProtoName(x) # TODO: Implicit returns fail here. case $getProtoName(x) # TODO: Implicit returns fail here.
of "[object Array]": return JArray of "[object Array]": return JArray
@ -1216,23 +1216,27 @@ when false:
# To get that we shall use, obj["json"] # To get that we shall use, obj["json"]
when isMainModule: when isMainModule:
var parsed = parseFile("tests/testdata/jsontest.json") when not defined(js):
var parsed2 = parseFile("tests/testdata/jsontest2.json") var parsed = parseFile("tests/testdata/jsontest.json")
try: try:
discard parsed["key2"][12123] discard parsed["key2"][12123]
assert(false) doAssert(false)
except IndexError: assert(true) except IndexError: doAssert(true)
var parsed2 = parseFile("tests/testdata/jsontest2.json")
doAssert(parsed2{"repository", "description"}.str=="IRC Library for Haskell", "Couldn't fetch via multiply nested key using {}")
let testJson = parseJson"""{ "a": [1, 2, 3, 4], "b": "asd", "c": "\ud83c\udf83", "d": "\u00E6"}""" let testJson = parseJson"""{ "a": [1, 2, 3, 4], "b": "asd", "c": "\ud83c\udf83", "d": "\u00E6"}"""
# nil passthrough # nil passthrough
assert(testJson{"doesnt_exist"}{"anything"}.isNil) doAssert(testJson{"doesnt_exist"}{"anything"}.isNil)
testJson{["e", "f"]} = %true testJson{["e", "f"]} = %true
assert(testJson["e"]["f"].bval) doAssert(testJson["e"]["f"].bval)
# make sure UTF-16 decoding works. # make sure UTF-16 decoding works.
assert(testJson["c"].str == "🎃") when not defined(js): # TODO: The following line asserts in JS
assert(testJson["d"].str == "æ") doAssert(testJson["c"].str == "🎃")
doAssert(testJson["d"].str == "æ")
# make sure no memory leek when parsing invalid string # make sure no memory leek when parsing invalid string
let startMemory = getOccupiedMem() let startMemory = getOccupiedMem()
@ -1242,41 +1246,43 @@ when isMainModule:
except: except:
discard discard
# memory diff should less than 2M # memory diff should less than 2M
assert(abs(getOccupiedMem() - startMemory) < 2 * 1024 * 1024) doAssert(abs(getOccupiedMem() - startMemory) < 2 * 1024 * 1024)
# test `$` # test `$`
let stringified = $testJson let stringified = $testJson
let parsedAgain = parseJson(stringified) let parsedAgain = parseJson(stringified)
assert(parsedAgain["b"].str == "asd") doAssert(parsedAgain["b"].str == "asd")
parsedAgain["abc"] = %5
doAssert parsedAgain["abc"].num == 5
# Bounds checking # Bounds checking
try: try:
let a = testJson["a"][9] let a = testJson["a"][9]
assert(false, "EInvalidIndex not thrown") doAssert(false, "EInvalidIndex not thrown")
except IndexError: except IndexError:
discard discard
try: try:
let a = testJson["a"][-1] let a = testJson["a"][-1]
assert(false, "EInvalidIndex not thrown") doAssert(false, "EInvalidIndex not thrown")
except IndexError: except IndexError:
discard discard
try: try:
assert(testJson["a"][0].num == 1, "Index doesn't correspond to its value") doAssert(testJson["a"][0].num == 1, "Index doesn't correspond to its value")
except: except:
assert(false, "EInvalidIndex thrown for valid index") doAssert(false, "EInvalidIndex thrown for valid index")
assert(testJson{"b"}.str=="asd", "Couldn't fetch a singly nested key with {}") doAssert(testJson{"b"}.str=="asd", "Couldn't fetch a singly nested key with {}")
assert(isNil(testJson{"nonexistent"}), "Non-existent keys should return nil") doAssert(isNil(testJson{"nonexistent"}), "Non-existent keys should return nil")
assert(parsed2{"repository", "description"}.str=="IRC Library for Haskell", "Couldn't fetch via multiply nested key using {}") doAssert(isNil(testJson{"a", "b"}), "Indexing through a list should return nil")
assert(isNil(testJson{"a", "b"}), "Indexing through a list should return nil") doAssert(isNil(testJson{"a", "b"}), "Indexing through a list should return nil")
assert(isNil(testJson{"a", "b"}), "Indexing through a list should return nil") doAssert(testJson{"a"}==parseJson"[1, 2, 3, 4]", "Didn't return a non-JObject when there was one to be found")
assert(testJson{"a"}==parseJson"[1, 2, 3, 4]", "Didn't return a non-JObject when there was one to be found") doAssert(isNil(parseJson("[1, 2, 3]"){"foo"}), "Indexing directly into a list should return nil")
assert(isNil(parseJson("[1, 2, 3]"){"foo"}), "Indexing directly into a list should return nil")
# Generator: # Generator:
var j = %* [{"name": "John", "age": 30}, {"name": "Susan", "age": 31}] var j = %* [{"name": "John", "age": 30}, {"name": "Susan", "age": 31}]
assert j == %[%{"name": %"John", "age": %30}, %{"name": %"Susan", "age": %31}] doAssert j == %[%{"name": %"John", "age": %30}, %{"name": %"Susan", "age": %31}]
var j2 = %* var j2 = %*
[ [
@ -1289,7 +1295,7 @@ when isMainModule:
"age": 31 "age": 31
} }
] ]
assert j2 == %[%{"name": %"John", "age": %30}, %{"name": %"Susan", "age": %31}] doAssert j2 == %[%{"name": %"John", "age": %30}, %{"name": %"Susan", "age": %31}]
var name = "John" var name = "John"
let herAge = 30 let herAge = 30
@ -1303,4 +1309,4 @@ when isMainModule:
, "age": hisAge , "age": hisAge
} }
] ]
assert j3 == %[%{"name": %"John", "age": %30}, %{"name": %"Susan", "age": %31}] doAssert j3 == %[%{"name": %"John", "age": %30}, %{"name": %"Susan", "age": %31}]

View file

@ -223,7 +223,7 @@ proc jsTests(r: var TResults, cat: Category, options: string) =
"varres/tvartup", "misc/tints", "misc/tunsignedinc"]: "varres/tvartup", "misc/tints", "misc/tunsignedinc"]:
test "tests/" & testfile & ".nim" test "tests/" & testfile & ".nim"
for testfile in ["pure/strutils"]: for testfile in ["pure/strutils", "pure/json"]:
test "lib/" & testfile & ".nim" test "lib/" & testfile & ".nim"
# ------------------------- manyloc ------------------------------------------- # ------------------------- manyloc -------------------------------------------