summary refs log tree commit diff stats
path: root/lib/std/private/jsutils.nim
blob: cf58b3b816a907f3c67d1c1d77b960ac9927239b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
when defined(js):
  import std/jsbigints

  type
    ArrayBuffer* = ref object of JsRoot
    Float64Array* = ref object of JsRoot
    Uint32Array* = ref object of JsRoot
    Uint8Array* = ref object of JsRoot
    BigUint64Array* = 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 newBigUint64Array*(buffer: ArrayBuffer): BigUint64Array {.importjs: "new BigUint64Array(#)".}


  func newUint8Array*(n: int): Uint8Array {.importjs: "new Uint8Array(#)".}

  func `[]`*(arr: Uint32Array, i: int): uint32 {.importjs: "#[#]".}
  func `[]`*(arr: Uint8Array, i: int): uint8 {.importjs: "#[#]".}
  func `[]`*(arr: BigUint64Array, i: int): JsBigInt {.importjs: "#[#]".}
  func `[]=`*(arr: Float64Array, i: int, v: float) {.importjs: "#[#] = #".}


  proc jsTypeOf*[T](x: T): cstring {.importjs: "typeof(#)".}
  ## Returns the name of the JsObject's JavaScript type as a cstring.
  # xxx replace jsffi.jsTypeOf with this definition and add tests

  proc jsConstructorName*[T](a: T): cstring =
    asm """`result` = `a`.constructor.name"""

  proc hasJsBigInt*(): bool =
    asm """`result` = typeof BigInt != 'undefined'"""

  proc hasBigUint64Array*(): bool =
    asm """`result` = typeof BigUint64Array != 'undefined'"""

  proc getProtoName*[T](a: T): cstring {.importjs: "Object.prototype.toString.call(#)".}

  proc isInteger*[T](x: T): bool {.importjs: "Number.isInteger(#)".}

  proc isSafeInteger*[T](x: T): bool {.importjs: "Number.isSafeInteger(#)".}