Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
ringabout authored and ardek66 committed Mar 26, 2021
1 parent 123dfe8 commit 3e5c3db
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 4 deletions.
14 changes: 10 additions & 4 deletions lib/pure/json.nim
Original file line number Diff line number Diff line change
Expand Up @@ -927,7 +927,7 @@ when defined(js):

proc parseNativeJson(x: cstring): JSObject {.importjs: "JSON.parse(#)".}

proc getVarType(x: JSObject): JsonNodeKind =
proc getVarType(x: JSObject, isRawNumber: var bool): JsonNodeKind =
result = JNull
case $getProtoName(x) # TODO: Implicit returns fail here.
of "[object Array]": return JArray
Expand All @@ -937,6 +937,7 @@ when defined(js):
if isSafeInteger(x):
return JInt
else:
isRawNumber = true
return JString
else:
return JFloat
Expand All @@ -946,13 +947,13 @@ when defined(js):
else: assert false

proc len(x: JSObject): int =
assert x.getVarType == JArray
asm """
`result` = `x`.length;
"""

proc convertObject(x: JSObject): JsonNode =
case getVarType(x)
var isRawNumber = false
case getVarType(x, isRawNumber)
of JArray:
result = newJArray()
for i in 0 ..< x.len:
Expand All @@ -973,7 +974,12 @@ when defined(js):
result = newJFloat(x.to(float))
of JString:
# Dunno what to do with isUnquoted here
result = newJString($x.to(cstring))
if isRawNumber:
var value: cstring
{.emit: "`value` = `x`.toString();".}
result = newJRawNumber($value)
else:
result = newJString($x.to(cstring))
of JBool:
result = newJBool(x.to(bool))
of JNull:
Expand Down
11 changes: 11 additions & 0 deletions tests/stdlib/tjson.nim
Original file line number Diff line number Diff line change
Expand Up @@ -300,3 +300,14 @@ block: # bug #17383
when not defined(js):
testRoundtrip(int64.high): "9223372036854775807"
testRoundtrip(uint64.high): "18446744073709551615"


block:
let a = "18446744073709551615"
let b = a.parseJson
doAssert b.kind == JString
let c = $b
when defined(js):
doAssert c == "18446744073709552000"
else:
doAssert c == "18446744073709551615"

0 comments on commit 3e5c3db

Please sign in to comment.