From cc37fee0ab744e035510498024e4fee016560ab8 Mon Sep 17 00:00:00 2001 From: flywind Date: Tue, 9 Mar 2021 19:22:26 +0800 Subject: [PATCH] fix #17275 (#17276) --- lib/pure/json.nim | 9 ++++++--- lib/std/private/jsutils.nim | 4 ++++ 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 b556f7ccf5..51d4bb8151 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 b858e150e9..cf58b3b816 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 eb31fcef9d..5508509ba0 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