summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--lib/pure/json.nim9
-rw-r--r--lib/std/private/jsutils.nim4
-rw-r--r--tests/stdlib/tjson.nim5
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