JS: make hash float support IE/Safari (#16872)

This commit is contained in:
flywind
2021-02-01 06:19:25 -06:00
committed by GitHub
parent 206ad43cdc
commit a2855b66ae
2 changed files with 14 additions and 5 deletions

View File

@@ -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

View File

@@ -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'"""