perpare for more compact bit operations in JS (#16728)

This commit is contained in:
flywind 2021-01-19 07:57:16 -06:00 • committed by GitHub
commit a0fddfecd4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 7 deletions

View file

@ -159,14 +159,15 @@ func isNaN*(x: SomeFloat): bool {.inline, since: (1,5,1).} =
else: result = c_isnan(x) else: result = c_isnan(x)
when defined(js): when defined(js):
import std/private/jsutils
proc toBitsImpl(x: float): array[2, uint32] = proc toBitsImpl(x: float): array[2, uint32] =
asm """ let buffer = newArrayBuffer(8)
const buffer = new ArrayBuffer(8); let floatBuffer = newFloat64Array(buffer)
const floatBuffer = new Float64Array(buffer); let uintBuffer = newUint32Array(buffer)
const uintBuffer = new Uint32Array(buffer); floatBuffer[0] = x
floatBuffer[0] = `x`; {.emit: "`result` = `uintBuffer`;".}
`result` = uintBuffer # result = cast[array[2, uint32]](uintBuffer)
"""
proc signbit*(x: SomeFloat): bool {.inline, since: (1, 5, 1).} = proc signbit*(x: SomeFloat): bool {.inline, since: (1, 5, 1).} =
## Returns true if `x` is negative, false otherwise. ## Returns true if `x` is negative, false otherwise.

View file

@ -0,0 +1,12 @@
when defined(js):
type
ArrayBuffer* = ref object of JsRoot
Float64Array* = ref object of JsRoot
Uint32Array* = ref object of JsRoot
func newArrayBuffer*(n: int): ArrayBuffer {.importjs: "new ArrayBuffer(#)".}
func newFloat64Array*(buffer: ArrayBuffer): Float64Array {.importjs: "new Float64Array(#)".}
func newUint32Array*(buffer: ArrayBuffer): Uint32Array {.importjs: "new Uint32Array(#)".}
func `[]`*(arr: Uint32Array, i: int): uint32 {.importjs: "#[#]".}
func `[]=`*(arr: Float64Array, i: int, v: float) {.importjs: "#[#] = #".}