diff options
author | ringabout <43030857+ringabout@users.noreply.github.com> | 2024-03-09 18:41:39 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-09 11:41:39 +0100 |
commit | f80a5a30b4a73efb3a7da162f57a259dd69e02c2 (patch) | |
tree | 2c4a6e0aea5aacbf6aa0138f9d03381fca445ab6 | |
parent | 6ebad30e7a96c67cc7a55aa3248849313c9f4e52 (diff) | |
download | Nim-f80a5a30b4a73efb3a7da162f57a259dd69e02c2.tar.gz |
fixes #23378; fixes js abs negative int64 (#23379)
fixes #23378
-rw-r--r-- | compiler/jsgen.nim | 8 | ||||
-rw-r--r-- | tests/int/tints.nim | 8 |
2 files changed, 15 insertions, 1 deletions
diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index 471d51c0f..ffc11789f 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -788,7 +788,13 @@ proc arithAux(p: PProc, n: PNode, r: var TCompRes, op: TMagic) = of mEqProc: applyFormat("($1 == $2)", "($1 == $2)") of mUnaryMinusI: applyFormat("negInt($1)", "-($1)") of mUnaryMinusI64: applyFormat("negInt64($1)", "-($1)") - of mAbsI: applyFormat("absInt($1)", "Math.abs($1)") + of mAbsI: + let typ = n[1].typ.skipTypes(abstractVarRange) + if typ.kind == tyInt64 and optJsBigInt64 in p.config.globalOptions: + useMagic(p, "absInt64") + applyFormat("absInt64($1)", "absInt64($1)") + else: + applyFormat("absInt($1)", "Math.abs($1)") of mNot: applyFormat("!($1)", "!($1)") of mUnaryPlusI: applyFormat("+($1)", "+($1)") of mBitnotI: diff --git a/tests/int/tints.nim b/tests/int/tints.nim index a7d27d736..5c071c21d 100644 --- a/tests/int/tints.nim +++ b/tests/int/tints.nim @@ -1,5 +1,6 @@ discard """ matrix: "; --backend:js --jsbigint64:off; --backend:js --jsbigint64:on" + targets: "c js" output: ''' 0 0 0 0 @@ -7,6 +8,8 @@ Success''' """ # Test the different integer operations +# TODO: fixme --backend:js cannot change targets!!! + import std/private/jsutils var testNumber = 0 @@ -141,4 +144,9 @@ block: # shl when not defined(js) or (defined(js) and compileOption("jsbigint64")): doAssert u64 shl 1 == u64 - 1 +block: # bug #23378 + var neg = -1 # prevent compile-time evaluation + let n = abs BiggestInt neg + doAssert n == 1 + echo("Success") #OUT Success |