diff options
-rw-r--r-- | compiler/ccgstmts.nim | 6 | ||||
-rw-r--r-- | compiler/jsgen.nim | 6 | ||||
-rw-r--r-- | lib/pure/json.nim | 62 | ||||
-rw-r--r-- | tests/misc/tupcomingfeatures.nim | 2 | ||||
-rw-r--r-- | tests/testament/categories.nim | 2 |
5 files changed, 44 insertions, 34 deletions
diff --git a/compiler/ccgstmts.nim b/compiler/ccgstmts.nim index 529e59273..f2ceadcce 100644 --- a/compiler/ccgstmts.nim +++ b/compiler/ccgstmts.nim @@ -928,8 +928,10 @@ proc genTry(p: BProc, t: PNode, d: var TLoc) = for j in countup(0, blen - 2): assert(t.sons[i].sons[j].kind == nkType) if orExpr != nil: add(orExpr, "||") - appcg(p.module, orExpr, - "#isObj(#getCurrentException()->Sup.m_type, $1)", + let isObjFormat = if not p.module.compileToCpp: + "#isObj(#getCurrentException()->Sup.m_type, $1)" + else: "#isObj(#getCurrentException()->m_type, $1)" + appcg(p.module, orExpr, isObjFormat, [genTypeInfo(p.module, t.sons[i].sons[j].typ)]) if i > 1: line(p, cpsStmts, "else ") startBlock(p, "if ($1) {$n", [orExpr]) diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index 8f1f8a832..d6b546d8b 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -192,7 +192,7 @@ proc mangleName(s: PSym; target: TTarget): Rope = x.add("HEX" & toHex(ord(c), 2)) inc i result = rope(x) - if s.name.s != "this": + if s.name.s != "this" and s.kind != skField: add(result, "_") add(result, rope(s.id)) s.loc.r = result @@ -891,10 +891,12 @@ proc genFieldAccess(p: PProc, n: PNode, r: var TCompRes) = r.res = "$1['$2']" % [r.res, f.loc.r] r.kind = resExpr +proc genAddr(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 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) = genFieldAccess(p, n.sons[0], r) # XXX diff --git a/lib/pure/json.nim b/lib/pure/json.nim index 2da14c363..c5b1a21e9 100644 --- a/lib/pure/json.nim +++ b/lib/pure/json.nim @@ -1123,9 +1123,9 @@ else: proc parseNativeJson(x: cstring): JSObject {.importc: "JSON.parse".} - proc getVarType(x): JsonNodeKind = + proc getVarType(x: JSObject): JsonNodeKind = result = JNull - proc getProtoName(y): cstring + proc getProtoName(y: JSObject): cstring {.importc: "Object.prototype.toString.call".} case $getProtoName(x) # TODO: Implicit returns fail here. of "[object Array]": return JArray @@ -1216,23 +1216,27 @@ when false: # To get that we shall use, obj["json"] when isMainModule: - var parsed = parseFile("tests/testdata/jsontest.json") - var parsed2 = parseFile("tests/testdata/jsontest2.json") + when not defined(js): + var parsed = parseFile("tests/testdata/jsontest.json") - try: - discard parsed["key2"][12123] - assert(false) - except IndexError: assert(true) + try: + discard parsed["key2"][12123] + doAssert(false) + 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"}""" # nil passthrough - assert(testJson{"doesnt_exist"}{"anything"}.isNil) + doAssert(testJson{"doesnt_exist"}{"anything"}.isNil) testJson{["e", "f"]} = %true - assert(testJson["e"]["f"].bval) + doAssert(testJson["e"]["f"].bval) # make sure UTF-16 decoding works. - assert(testJson["c"].str == "🎃") - assert(testJson["d"].str == "æ") + when not defined(js): # TODO: The following line asserts in JS + doAssert(testJson["c"].str == "🎃") + doAssert(testJson["d"].str == "æ") # make sure no memory leek when parsing invalid string let startMemory = getOccupiedMem() @@ -1242,41 +1246,43 @@ when isMainModule: except: discard # memory diff should less than 2M - assert(abs(getOccupiedMem() - startMemory) < 2 * 1024 * 1024) + doAssert(abs(getOccupiedMem() - startMemory) < 2 * 1024 * 1024) # test `$` let stringified = $testJson let parsedAgain = parseJson(stringified) - assert(parsedAgain["b"].str == "asd") + doAssert(parsedAgain["b"].str == "asd") + + parsedAgain["abc"] = %5 + doAssert parsedAgain["abc"].num == 5 # Bounds checking try: let a = testJson["a"][9] - assert(false, "EInvalidIndex not thrown") + doAssert(false, "EInvalidIndex not thrown") except IndexError: discard try: let a = testJson["a"][-1] - assert(false, "EInvalidIndex not thrown") + doAssert(false, "EInvalidIndex not thrown") except IndexError: discard 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: - 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 {}") - assert(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 {}") - assert(isNil(testJson{"a", "b"}), "Indexing through a list should return nil") - assert(isNil(testJson{"a", "b"}), "Indexing through a list should return nil") - assert(testJson{"a"}==parseJson"[1, 2, 3, 4]", "Didn't return a non-JObject when there was one to be found") - assert(isNil(parseJson("[1, 2, 3]"){"foo"}), "Indexing directly into a list should return nil") + doAssert(testJson{"b"}.str=="asd", "Couldn't fetch a singly nested key with {}") + doAssert(isNil(testJson{"nonexistent"}), "Non-existent keys should return nil") + doAssert(isNil(testJson{"a", "b"}), "Indexing through a list should return nil") + doAssert(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") + doAssert(isNil(parseJson("[1, 2, 3]"){"foo"}), "Indexing directly into a list should return nil") # Generator: 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 = %* [ @@ -1289,7 +1295,7 @@ when isMainModule: "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" let herAge = 30 @@ -1303,4 +1309,4 @@ when isMainModule: , "age": hisAge } ] - assert j3 == %[%{"name": %"John", "age": %30}, %{"name": %"Susan", "age": %31}] + doAssert j3 == %[%{"name": %"John", "age": %30}, %{"name": %"Susan", "age": %31}] diff --git a/tests/misc/tupcomingfeatures.nim b/tests/misc/tupcomingfeatures.nim index 9a99e769a..cf07b06df 100644 --- a/tests/misc/tupcomingfeatures.nim +++ b/tests/misc/tupcomingfeatures.nim @@ -1,6 +1,6 @@ discard """ output: '''0 -2 0 - 0 -2''' +0 -2''' """ {.this: self.} diff --git a/tests/testament/categories.nim b/tests/testament/categories.nim index ff83379b8..150c55edc 100644 --- a/tests/testament/categories.nim +++ b/tests/testament/categories.nim @@ -223,7 +223,7 @@ proc jsTests(r: var TResults, cat: Category, options: string) = "varres/tvartup", "misc/tints", "misc/tunsignedinc"]: test "tests/" & testfile & ".nim" - for testfile in ["pure/strutils"]: + for testfile in ["pure/strutils", "pure/json"]: test "lib/" & testfile & ".nim" # ------------------------- manyloc ------------------------------------------- |