diff options
-rw-r--r-- | lib/pure/json.nim | 9 | ||||
-rw-r--r-- | lib/std/private/jsutils.nim | 4 | ||||
-rw-r--r-- | tests/stdlib/tjson.nim | 5 |
3 files changed, 11 insertions, 7 deletions
diff --git a/lib/pure/json.nim b/lib/pure/json.nim index b556f7ccf..51d4bb815 100644 --- a/lib/pure/json.nim +++ b/lib/pure/json.nim @@ -909,7 +909,7 @@ proc parseJson*(s: Stream, filename: string = ""; rawIntegers = false, rawFloats when defined(js): from std/math import `mod` from std/jsffi import JSObject, `[]`, to - from std/private/jsutils import getProtoName + from std/private/jsutils import getProtoName, isInteger, isSafeInteger proc parseNativeJson(x: cstring): JSObject {.importjs: "JSON.parse(#)".} @@ -919,8 +919,11 @@ when defined(js): of "[object Array]": return JArray of "[object Object]": return JObject of "[object Number]": - if cast[float](x) mod 1.0 == 0: - return JInt + if isInteger(x): + if isSafeInteger(x): + return JInt + else: + return JString else: return JFloat of "[object Boolean]": return JBool diff --git a/lib/std/private/jsutils.nim b/lib/std/private/jsutils.nim index b858e150e..cf58b3b81 100644 --- a/lib/std/private/jsutils.nim +++ b/lib/std/private/jsutils.nim @@ -37,3 +37,7 @@ when defined(js): asm """`result` = typeof BigUint64Array != 'undefined'""" proc getProtoName*[T](a: T): cstring {.importjs: "Object.prototype.toString.call(#)".} + + proc isInteger*[T](x: T): bool {.importjs: "Number.isInteger(#)".} + + proc isSafeInteger*[T](x: T): bool {.importjs: "Number.isSafeInteger(#)".} diff --git a/tests/stdlib/tjson.nim b/tests/stdlib/tjson.nim index eb31fcef9..5508509ba 100644 --- a/tests/stdlib/tjson.nim +++ b/tests/stdlib/tjson.nim @@ -240,10 +240,7 @@ doAssert isRefSkipDistinct(MyOtherDistinct) let x = parseJson("9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999") -when defined(js): # xxx fixme - doAssert x.kind == JInt -else: - doAssert x.kind == JString +doAssert x.kind == JString block: # bug #15835 type |