mirror of
https://github.com/nim-lang/Nim.git
synced 2026-02-12 06:18:51 +00:00
@@ -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
|
||||
@@ -937,6 +937,7 @@ when defined(js):
|
||||
if isSafeInteger(x):
|
||||
return JInt
|
||||
else:
|
||||
isRawNumber = true
|
||||
return JString
|
||||
else:
|
||||
return JFloat
|
||||
@@ -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:
|
||||
@@ -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:
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user