Skip to content

Commit

Permalink
[backport 1.0] add backend support for js bigint (#16606)
Browse files Browse the repository at this point in the history
* add backend support for js bigint

* cleanup

* add tests

* add -d:nimHasJsBigIntBackend

* cleanup

* more tests

(cherry picked from commit 025ca66)
  • Loading branch information
timotheecour authored and narimiran committed Feb 1, 2021
1 parent 822c7ac commit c346c0b
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 1 deletion.
1 change: 1 addition & 0 deletions compiler/condsyms.nim
Original file line number Diff line number Diff line change
Expand Up @@ -123,3 +123,4 @@ proc initDefines*(symbols: StringTableRef) =
defineSymbol("nimHasStacktracesModule")
defineSymbol("nimHasEffectTraitsModule")
defineSymbol("nimHasCastPragmaBlocks")
defineSymbol("nimHasJsBigIntBackend")
5 changes: 4 additions & 1 deletion compiler/jsgen.nim
Original file line number Diff line number Diff line change
Expand Up @@ -1672,7 +1672,10 @@ proc createVar(p: PProc, typ: PType, indirect: bool): Rope =
var t = skipTypes(typ, abstractInst)
case t.kind
of tyInt..tyInt64, tyUInt..tyUInt64, tyEnum, tyChar:
result = putToSeq("0", indirect)
if $t.sym.loc.r == "bigint":
result = putToSeq("0n", indirect)
else:
result = putToSeq("0", indirect)
of tyFloat..tyFloat128:
result = putToSeq("0.0", indirect)
of tyRange, tyGenericInst, tyAlias, tySink, tyOwned:
Expand Down
58 changes: 58 additions & 0 deletions tests/js/tbigint_backend.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
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

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"

0 comments on commit c346c0b

Please sign in to comment.