summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--lib/pure/json.nim5
-rw-r--r--lib/std/private/jsutils.nim1
-rw-r--r--tests/stdlib/t15835.nim22
-rw-r--r--tests/stdlib/tjson.nim40
-rw-r--r--tests/stdlib/tjson_unmarshall.nim32
5 files changed, 43 insertions, 57 deletions
diff --git a/lib/pure/json.nim b/lib/pure/json.nim
index 1d2b20176..b556f7ccf 100644
--- a/lib/pure/json.nim
+++ b/lib/pure/json.nim
@@ -908,14 +908,13 @@ proc parseJson*(s: Stream, filename: string = ""; rawIntegers = false, rawFloats
 
 when defined(js):
   from std/math import `mod`
-  import std/jsffi
+  from std/jsffi import JSObject, `[]`, to
+  from std/private/jsutils import getProtoName
 
   proc parseNativeJson(x: cstring): JSObject {.importjs: "JSON.parse(#)".}
 
   proc getVarType(x: JSObject): JsonNodeKind =
     result = JNull
-    proc getProtoName(y: JSObject): cstring
-      {.importjs: "Object.prototype.toString.call(#)".}
     case $getProtoName(x) # TODO: Implicit returns fail here.
     of "[object Array]": return JArray
     of "[object Object]": return JObject
diff --git a/lib/std/private/jsutils.nim b/lib/std/private/jsutils.nim
index 14104261e..b858e150e 100644
--- a/lib/std/private/jsutils.nim
+++ b/lib/std/private/jsutils.nim
@@ -36,3 +36,4 @@ when defined(js):
   proc hasBigUint64Array*(): bool =
     asm """`result` = typeof BigUint64Array != 'undefined'"""
 
+  proc getProtoName*[T](a: T): cstring {.importjs: "Object.prototype.toString.call(#)".}
diff --git a/tests/stdlib/t15835.nim b/tests/stdlib/t15835.nim
deleted file mode 100644
index ba3405780..000000000
--- a/tests/stdlib/t15835.nim
+++ /dev/null
@@ -1,22 +0,0 @@
-discard """
-  targets: "c js"
-"""
-
-
-import std/json
-
-type
-  Foo = object
-    ii*: int
-    data*: JsonNode
-
-block:
-  const jt = """{"ii": 123, "data": ["some", "data"]}"""
-  let js = parseJson(jt)
-  discard js.to(Foo)
-
-block:
-  const jt = """{"ii": 123}"""
-  let js = parseJson(jt)
-  doAssertRaises(KeyError):
-    echo js.to(Foo)
diff --git a/tests/stdlib/tjson.nim b/tests/stdlib/tjson.nim
index b71961554..eb31fcef9 100644
--- a/tests/stdlib/tjson.nim
+++ b/tests/stdlib/tjson.nim
@@ -244,3 +244,43 @@ when defined(js): # xxx fixme
   doAssert x.kind == JInt
 else:
   doAssert x.kind == JString
+
+block: # bug #15835
+  type
+    Foo = object
+      ii*: int
+      data*: JsonNode
+
+  block:
+    const jt = """{"ii": 123, "data": ["some", "data"]}"""
+    let js = parseJson(jt)
+    discard js.to(Foo)
+
+  block:
+    const jt = """{"ii": 123}"""
+    let js = parseJson(jt)
+    doAssertRaises(KeyError):
+      echo js.to(Foo)
+
+type
+  ContentNodeKind* = enum
+    P,
+    Br,
+    Text,
+  ContentNode* = object
+    case kind*: ContentNodeKind
+    of P: pChildren*: seq[ContentNode]
+    of Br: nil
+    of Text: textStr*: string
+
+let mynode = ContentNode(kind: P, pChildren: @[
+  ContentNode(kind: Text, textStr: "mychild"),
+  ContentNode(kind: Br)
+])
+
+doAssert $mynode == """(kind: P, pChildren: @[(kind: Text, textStr: "mychild"), (kind: Br)])"""
+
+let jsonNode = %*mynode
+doAssert $jsonNode == """{"kind":"P","pChildren":[{"kind":"Text","textStr":"mychild"},{"kind":"Br"}]}"""
+doAssert $jsonNode.to(ContentNode) == """(kind: P, pChildren: @[(kind: Text, textStr: "mychild"), (kind: Br)])"""
+
diff --git a/tests/stdlib/tjson_unmarshall.nim b/tests/stdlib/tjson_unmarshall.nim
deleted file mode 100644
index 4353d1ee2..000000000
--- a/tests/stdlib/tjson_unmarshall.nim
+++ /dev/null
@@ -1,32 +0,0 @@
-discard """
-  targets: "c js"
-  output: '''
-Original: (kind: P, pChildren: @[(kind: Text, textStr: "mychild"), (kind: Br)])
-jsonNode: {"kind":"P","pChildren":[{"kind":"Text","textStr":"mychild"},{"kind":"Br"}]}
-Reversed: (kind: P, pChildren: @[(kind: Text, textStr: "mychild"), (kind: Br)])
-'''
-"""
-
-import std/json
-
-type
-  ContentNodeKind* = enum
-    P,
-    Br,
-    Text,
-  ContentNode* = object
-    case kind*: ContentNodeKind
-    of P: pChildren*: seq[ContentNode]
-    of Br: nil
-    of Text: textStr*: string
-
-let mynode = ContentNode(kind: P, pChildren: @[
-  ContentNode(kind: Text, textStr: "mychild"),
-  ContentNode(kind: Br)
-])
- 
-echo "Original: " & $mynode
-
-let jsonNode = %*mynode
-echo "jsonNode: " & $jsonNode
-echo "Reversed: " & $jsonNode.to(ContentNode)