blob: 8f2f6c4f49c85b1450f34b79a9bba6e5b3b45141 (
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
import std/private/jsutils
type JsBigIntImpl {.importc: "bigint".} = int
type JsBigInt = distinct JsBigIntImpl
doAssert JsBigInt isnot int
func big*(integer: SomeInteger): JsBigInt {.importjs: "BigInt(#)".}
func big*(integer: cstring): JsBigInt {.importjs: "BigInt(#)".}
func `<=`*(x, y: JsBigInt): bool {.importjs: "(# $1 #)".}
func `==`*(x, y: JsBigInt): bool {.importjs: "(# === #)".}
func inc*(x: var JsBigInt) {.importjs: "[#][0][0]++".}
func inc2*(x: var JsBigInt) {.importjs: "#++".}
func toCstring*(this: JsBigInt): cstring {.importjs: "#.toString()".}
func `$`*(this: JsBigInt): string =
$toCstring(this)
block:
doAssert defined(nimHasJsBigIntBackend)
let z1 = big"10"
let z2 = big"15"
doAssert z1 == big"10"
doAssert z1 == z1
doAssert z1 != z2
var s: seq[cstring]
for i in z1 .. z2:
s.add $i
doAssert s == @["10".cstring, "11", "12", "13", "14", "15"]
block:
var a=big"3"
a.inc
doAssert a == big"4"
block:
var z: JsBigInt
doAssert $z == "0"
doAssert z.jsTypeOf == "bigint" # would fail without codegen change
doAssert z != big(1)
doAssert z == big"0" # ditto
# ditto below
block:
let z: JsBigInt = big"1"
doAssert $z == "1"
doAssert z.jsTypeOf == "bigint"
doAssert z == big"1"
block:
let z = JsBigInt.default
doAssert $z == "0"
doAssert z.jsTypeOf == "bigint"
doAssert z == big"0"
block:
var a: seq[JsBigInt]
a.setLen 3
doAssert a[^1].jsTypeOf == "bigint"
doAssert a[^1] == big"0"
|