From 6acd2da8c8498c672f1ab924e1d6a304914fc6ce Mon Sep 17 00:00:00 2001 From: flywind Date: Fri, 15 Jan 2021 16:39:23 +0800 Subject: [PATCH] perpare for more compact bit operations in JS --- lib/pure/math.nim | 15 ++++++++------- lib/std/private/jsutils.nim | 12 ++++++++++++ 2 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 lib/std/private/jsutils.nim diff --git a/lib/pure/math.nim b/lib/pure/math.nim index bcda68afe1ea..45277d0a7950 100644 --- a/lib/pure/math.nim +++ b/lib/pure/math.nim @@ -159,14 +159,15 @@ func isNaN*(x: SomeFloat): bool {.inline, since: (1,5,1).} = else: result = c_isnan(x) when defined(js): + import std/private/jsutils + proc toBitsImpl(x: float): array[2, uint32] = - asm """ - const buffer = new ArrayBuffer(8); - const floatBuffer = new Float64Array(buffer); - const uintBuffer = new Uint32Array(buffer); - floatBuffer[0] = `x`; - `result` = uintBuffer - """ + let buffer = newArrayBuffer(8) + let floatBuffer = newFloat64Array(buffer) + let uintBuffer = newUint32Array(buffer) + floatBuffer[0] = x + {.emit: "`result` = `uintBuffer`;".} + # result = cast[array[2, uint32]](uintBuffer) proc signbit*(x: SomeFloat): bool {.inline, since: (1, 5, 1).} = ## Returns true if `x` is negative, false otherwise. diff --git a/lib/std/private/jsutils.nim b/lib/std/private/jsutils.nim new file mode 100644 index 000000000000..cc463ac7404a --- /dev/null +++ b/lib/std/private/jsutils.nim @@ -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: "#[#] = #".}