Skip to content

Commit

Permalink
JS: make hash float support IE/Safari (nim-lang#16872)
Browse files Browse the repository at this point in the history
  • Loading branch information
ringabout authored and ardek66 committed Mar 26, 2021
1 parent 879b979 commit e03cb37
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 5 deletions.
15 changes: 10 additions & 5 deletions lib/pure/hashes.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions lib/std/private/jsutils.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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'"""

0 comments on commit e03cb37

Please sign in to comment.