summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/pure/hashes.nim15
-rw-r--r--lib/std/private/jsutils.nim4
2 files changed, 14 insertions, 5 deletions
diff --git a/lib/pure/hashes.nim b/lib/pure/hashes.nim
index 7ac62174c..3cf0a8f82 100644
--- a/lib/pure/hashes.nim
+++ b/lib/pure/hashes.nim
@@ -141,13 +141,18 @@ when defined(js):
       res = hiXorLoJs(hiXorLoJs(P0, x xor P1), P58)
     cast[Hash](toNumber(wrapToInt(res, 32)))
 
-  template asBigInt(num: float): JsBigInt =
+  template toBits(num: float): JsBigInt =
     let
       x = newArrayBuffer(8)
       y = newFloat64Array(x)
-      z = newBigUint64Array(x)
-    y[0] = num
-    z[0]
+    if hasBigUint64Array():
+      let z = newBigUint64Array(x)
+      y[0] = num
+      z[0]
+    else:
+      let z = newUint32Array(x)
+      y[0] = num
+      big(z[0]) + big(z[1]) shl big(32)
 
 proc hashWangYi1*(x: int64|uint64|Hash): Hash {.inline.} =
   ## Wang Yi's hash_v1 for 64-bit ints (see https://github.com/rurban/smhasher for
@@ -237,7 +242,7 @@ proc hash*(x: float): Hash {.inline.} =
     when not defined(js):
       result = hashWangYi1(cast[Hash](y))
     else:
-      result = hashWangYiJS(asBigInt(y))
+      result = hashWangYiJS(toBits(y))
 
 # Forward declarations before methods that hash containers. This allows
 # containers to contain other containers
diff --git a/lib/std/private/jsutils.nim b/lib/std/private/jsutils.nim
index 296533a49..47a6caa2b 100644
--- a/lib/std/private/jsutils.nim
+++ b/lib/std/private/jsutils.nim
@@ -16,5 +16,9 @@ when defined(js):
   func `[]`*(arr: BigUint64Array, i: int): JsBigInt {.importjs: "#[#]".}
   func `[]=`*(arr: Float64Array, i: int, v: float) {.importjs: "#[#] = #".}
 
+
   proc hasJsBigInt*(): bool =
     asm """`result` = typeof BigInt != 'undefined'"""
+
+  proc hasBigUint64Array*(): bool =
+    asm """`result` = typeof BigUint64Array != 'undefined'"""