[backport 1.0] add backend support for js bigint (#16606)
* add backend support for js bigint * cleanup * add tests * add -d:nimHasJsBigIntBackend * cleanup * more tests
This commit is contained in:
parent
21dfa04cbf
commit
025ca660f7
3 changed files with 63 additions and 1 deletions
|
|
@ -123,3 +123,4 @@ proc initDefines*(symbols: StringTableRef) =
|
||||||
defineSymbol("nimHasEffectTraitsModule")
|
defineSymbol("nimHasEffectTraitsModule")
|
||||||
defineSymbol("nimHasCastPragmaBlocks")
|
defineSymbol("nimHasCastPragmaBlocks")
|
||||||
defineSymbol("nimHasDeclaredLocs")
|
defineSymbol("nimHasDeclaredLocs")
|
||||||
|
defineSymbol("nimHasJsBigIntBackend")
|
||||||
|
|
|
||||||
|
|
@ -1677,7 +1677,10 @@ proc createVar(p: PProc, typ: PType, indirect: bool): Rope =
|
||||||
var t = skipTypes(typ, abstractInst)
|
var t = skipTypes(typ, abstractInst)
|
||||||
case t.kind
|
case t.kind
|
||||||
of tyInt..tyInt64, tyUInt..tyUInt64, tyEnum, tyChar:
|
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:
|
of tyFloat..tyFloat128:
|
||||||
result = putToSeq("0.0", indirect)
|
result = putToSeq("0.0", indirect)
|
||||||
of tyRange, tyGenericInst, tyAlias, tySink, tyOwned:
|
of tyRange, tyGenericInst, tyAlias, tySink, tyOwned:
|
||||||
|
|
|
||||||
58
tests/js/tbigint_backend.nim
Normal file
58
tests/js/tbigint_backend.nim
Normal file
|
|
@ -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"
|
||||||
Loading…
Add table
Add a link
Reference in a new issue