JS: represent long as BigInt if available

This commit is contained in:
Alexey Andreev 2021-03-08 22:59:45 +03:00
parent 1eab7e41b1
commit ca23da939a
6 changed files with 765 additions and 530 deletions

View File

@ -312,8 +312,10 @@ class NameFrequencyEstimator extends RecursiveVisitor implements MethodNodeVisit
if (expr.getSource() == OperationType.LONG) { if (expr.getSource() == OperationType.LONG) {
if (expr.getTarget() == OperationType.DOUBLE || expr.getTarget() == OperationType.FLOAT) { if (expr.getTarget() == OperationType.DOUBLE || expr.getTarget() == OperationType.FLOAT) {
consumer.consumeFunction("Long_toNumber"); consumer.consumeFunction("Long_toNumber");
} else if (expr.getTarget() == OperationType.INT) {
consumer.consumeFunction("Long_lo");
} }
} else { } else if (expr.getTarget() == OperationType.LONG) {
switch (expr.getSource()) { switch (expr.getSource()) {
case INT: case INT:
consumer.consumeFunction("Long_fromInt"); consumer.consumeFunction("Long_fromInt");
@ -339,7 +341,7 @@ class NameFrequencyEstimator extends RecursiveVisitor implements MethodNodeVisit
} else if ((int) value == value) { } else if ((int) value == value) {
consumer.consumeFunction("Long_fromInt"); consumer.consumeFunction("Long_fromInt");
} else { } else {
consumer.consumeFunction("Long"); consumer.consumeFunction("Long_create");
} }
} }
} }

View File

@ -261,7 +261,8 @@ public class Renderer implements RenderingManager {
"$rt_createLongArrayFromData", "$rt_createBooleanArray", "$rt_createByteArray", "$rt_createLongArrayFromData", "$rt_createBooleanArray", "$rt_createByteArray",
"$rt_createShortArray", "$rt_createCharArray", "$rt_createIntArray", "$rt_createLongArray", "$rt_createShortArray", "$rt_createCharArray", "$rt_createIntArray", "$rt_createLongArray",
"$rt_createFloatArray", "$rt_createDoubleArray", "$rt_compare", "$rt_createFloatArray", "$rt_createDoubleArray", "$rt_compare",
"Long_toNumber", "Long_fromInt", "Long_fromNumber", "Long", "Long_ZERO"); "Long_toNumber", "Long_fromInt", "Long_fromNumber", "Long_create", "Long_ZERO",
"Long_hi", "Long_lo");
} }
public void renderLongRuntimeAliases() throws IOException { public void renderLongRuntimeAliases() throws IOException {

View File

@ -239,7 +239,7 @@ public class RenderingContext {
} else if ((int) value == value) { } else if ((int) value == value) {
writer.appendFunction("Long_fromInt").append("(").append(String.valueOf(value)).append(")"); writer.appendFunction("Long_fromInt").append("(").append(String.valueOf(value)).append(")");
} else { } else {
writer.append("new ").appendFunction("Long").append("(" + (value & 0xFFFFFFFFL) writer.appendFunction("Long_create").append("(" + (value & 0xFFFFFFFFL)
+ ", " + (value >>> 32) + ")"); + ", " + (value >>> 32) + ")");
} }
} else if (cst instanceof Character) { } else if (cst instanceof Character) {

View File

@ -929,11 +929,13 @@ public class StatementRenderer implements ExprVisitor, StatementVisitor {
precedence = Precedence.MEMBER_ACCESS; precedence = Precedence.MEMBER_ACCESS;
Expr longShifted = extractLongRightShiftedBy32(expr.getValue()); Expr longShifted = extractLongRightShiftedBy32(expr.getValue());
if (longShifted != null) { if (longShifted != null) {
writer.appendFunction("Long_hi").append("(");
longShifted.acceptVisitor(this); longShifted.acceptVisitor(this);
writer.append(".hi"); writer.append(")");
} else { } else {
writer.appendFunction("Long_lo").append("(");
expr.getValue().acceptVisitor(this); expr.getValue().acceptVisitor(this);
writer.append(".lo"); writer.append(")");
} }
break; break;
case FLOAT: case FLOAT:

View File

@ -14,13 +14,42 @@
* limitations under the License. * limitations under the License.
*/ */
"use strict"; "use strict";
function Long_eq(a, b) {
var Long_eq;
var Long_ne;
var Long_gt;
var Long_ge;
var Long_lt;
var Long_le;
var Long_compare;
var Long_add;
var Long_sub;
var Long_inc;
var Long_dec;
var Long_mul;
var Long_div;
var Long_rem;
var Long_udiv;
var Long_urem;
var Long_neg;
var Long_and;
var Long_or;
var Long_xor;
var Long_shl;
var Long_shr;
var Long_shru;
var Long_not;
if (typeof BigInt !== 'function') {
Long_eq = function(a, b) {
return a.hi === b.hi && a.lo === b.lo; return a.hi === b.hi && a.lo === b.lo;
} }
function Long_ne(a, b) {
Long_ne = function(a, b) {
return a.hi !== b.hi || a.lo !== b.lo; return a.hi !== b.hi || a.lo !== b.lo;
} }
function Long_gt(a, b) {
Long_gt = function(a, b) {
if (a.hi < b.hi) { if (a.hi < b.hi) {
return false; return false;
} }
@ -34,7 +63,8 @@ function Long_gt(a, b) {
} }
return (a.lo & 1) > (b.lo & 1); return (a.lo & 1) > (b.lo & 1);
} }
function Long_ge(a, b) {
Long_ge = function(a, b) {
if (a.hi < b.hi) { if (a.hi < b.hi) {
return false; return false;
} }
@ -48,7 +78,8 @@ function Long_ge(a, b) {
} }
return (a.lo & 1) >= (b.lo & 1); return (a.lo & 1) >= (b.lo & 1);
} }
function Long_lt(a, b) {
Long_lt = function(a, b) {
if (a.hi > b.hi) { if (a.hi > b.hi) {
return false; return false;
} }
@ -62,7 +93,8 @@ function Long_lt(a, b) {
} }
return (a.lo & 1) < (b.lo & 1); return (a.lo & 1) < (b.lo & 1);
} }
function Long_le(a, b) {
Long_le = function(a, b) {
if (a.hi > b.hi) { if (a.hi > b.hi) {
return false; return false;
} }
@ -77,7 +109,7 @@ function Long_le(a, b) {
return (a.lo & 1) <= (b.lo & 1); return (a.lo & 1) <= (b.lo & 1);
} }
function Long_add(a, b) { Long_add = function(a, b) {
if (a.hi === (a.lo >> 31) && b.hi === (b.lo >> 31)) { if (a.hi === (a.lo >> 31) && b.hi === (b.lo >> 31)) {
return Long_fromNumber(a.lo + b.lo); return Long_fromNumber(a.lo + b.lo);
} else if (Math.abs(a.hi) < Long_MAX_NORMAL && Math.abs(b.hi) < Long_MAX_NORMAL) { } else if (Math.abs(a.hi) < Long_MAX_NORMAL && Math.abs(b.hi) < Long_MAX_NORMAL) {
@ -98,7 +130,8 @@ function Long_add(a, b) {
var hihi = (a_hihi + b_hihi + (hilo >> 16)) | 0; var hihi = (a_hihi + b_hihi + (hilo >> 16)) | 0;
return new Long((lolo & 0xFFFF) | ((lohi & 0xFFFF) << 16), (hilo & 0xFFFF) | ((hihi & 0xFFFF) << 16)); return new Long((lolo & 0xFFFF) | ((lohi & 0xFFFF) << 16), (hilo & 0xFFFF) | ((hihi & 0xFFFF) << 16));
} }
function Long_inc(a) {
Long_inc = function(a) {
var lo = (a.lo + 1) | 0; var lo = (a.lo + 1) | 0;
var hi = a.hi; var hi = a.hi;
if (lo === 0) { if (lo === 0) {
@ -106,7 +139,8 @@ function Long_inc(a) {
} }
return new Long(lo, hi); return new Long(lo, hi);
} }
function Long_dec(a) {
Long_dec = function(a) {
var lo = (a.lo - 1) | 0; var lo = (a.lo - 1) | 0;
var hi = a.hi; var hi = a.hi;
if (lo === -1) { if (lo === -1) {
@ -114,10 +148,12 @@ function Long_dec(a) {
} }
return new Long(lo, hi); return new Long(lo, hi);
} }
function Long_neg(a) {
Long_neg = function(a) {
return Long_inc(new Long(a.lo ^ 0xFFFFFFFF, a.hi ^ 0xFFFFFFFF)); return Long_inc(new Long(a.lo ^ 0xFFFFFFFF, a.hi ^ 0xFFFFFFFF));
} }
function Long_sub(a, b) {
Long_sub = function(a, b) {
if (a.hi === (a.lo >> 31) && b.hi === (b.lo >> 31)) { if (a.hi === (a.lo >> 31) && b.hi === (b.lo >> 31)) {
return Long_fromNumber(a.lo - b.lo); return Long_fromNumber(a.lo - b.lo);
} }
@ -136,7 +172,8 @@ function Long_sub(a, b) {
var hihi = (a_hihi - b_hihi + (hilo >> 16)) | 0; var hihi = (a_hihi - b_hihi + (hilo >> 16)) | 0;
return new Long((lolo & 0xFFFF) | ((lohi & 0xFFFF) << 16), (hilo & 0xFFFF) | ((hihi & 0xFFFF) << 16)); return new Long((lolo & 0xFFFF) | ((lohi & 0xFFFF) << 16), (hilo & 0xFFFF) | ((hihi & 0xFFFF) << 16));
} }
function Long_compare(a, b) {
Long_compare = function(a, b) {
var r = a.hi - b.hi; var r = a.hi - b.hi;
if (r !== 0) { if (r !== 0) {
return r; return r;
@ -147,13 +184,8 @@ function Long_compare(a, b) {
} }
return (a.lo & 1) - (b.lo & 1); return (a.lo & 1) - (b.lo & 1);
} }
function Long_isPositive(a) {
return (a.hi & 0x80000000) === 0; Long_mul = function(a, b) {
}
function Long_isNegative(a) {
return (a.hi & 0x80000000) !== 0;
}
function Long_mul(a, b) {
var positive = Long_isNegative(a) === Long_isNegative(b); var positive = Long_isNegative(a) === Long_isNegative(b);
if (Long_isNegative(a)) { if (Long_isNegative(a)) {
a = Long_neg(a); a = Long_neg(a);
@ -191,30 +223,35 @@ function Long_mul(a, b) {
var result = new Long((lolo & 0xFFFF) | (lohi << 16), (hilo & 0xFFFF) | (hihi << 16)); var result = new Long((lolo & 0xFFFF) | (lohi << 16), (hilo & 0xFFFF) | (hihi << 16));
return positive ? result : Long_neg(result); return positive ? result : Long_neg(result);
} }
function Long_div(a, b) {
Long_div = function(a, b) {
if (Math.abs(a.hi) < Long_MAX_NORMAL && Math.abs(b.hi) < Long_MAX_NORMAL) { if (Math.abs(a.hi) < Long_MAX_NORMAL && Math.abs(b.hi) < Long_MAX_NORMAL) {
return Long_fromNumber(Long_toNumber(a) / Long_toNumber(b)); return Long_fromNumber(Long_toNumber(a) / Long_toNumber(b));
} }
return Long_divRem(a, b)[0]; return Long_divRem(a, b)[0];
} }
function Long_udiv(a, b) {
Long_udiv = function(a, b) {
if (a.hi >= 0 && a.hi < Long_MAX_NORMAL && b.hi >= 0 && b.hi < Long_MAX_NORMAL) { if (a.hi >= 0 && a.hi < Long_MAX_NORMAL && b.hi >= 0 && b.hi < Long_MAX_NORMAL) {
return Long_fromNumber(Long_toNumber(a) / Long_toNumber(b)); return Long_fromNumber(Long_toNumber(a) / Long_toNumber(b));
} }
return Long_udivRem(a, b)[0]; return Long_udivRem(a, b)[0];
} }
function Long_rem(a, b) {
Long_rem = function(a, b) {
if (Math.abs(a.hi) < Long_MAX_NORMAL && Math.abs(b.hi) < Long_MAX_NORMAL) { if (Math.abs(a.hi) < Long_MAX_NORMAL && Math.abs(b.hi) < Long_MAX_NORMAL) {
return Long_fromNumber(Long_toNumber(a) % Long_toNumber(b)); return Long_fromNumber(Long_toNumber(a) % Long_toNumber(b));
} }
return Long_divRem(a, b)[1]; return Long_divRem(a, b)[1];
} }
function Long_urem(a, b) {
Long_urem = function(a, b) {
if (a.hi >= 0 && a.hi < Long_MAX_NORMAL && b.hi >= 0 && b.hi < Long_MAX_NORMAL) { if (a.hi >= 0 && a.hi < Long_MAX_NORMAL && b.hi >= 0 && b.hi < Long_MAX_NORMAL) {
return Long_fromNumber(Long_toNumber(a) / Long_toNumber(b)); return Long_fromNumber(Long_toNumber(a) / Long_toNumber(b));
} }
return Long_udivRem(a, b)[1]; return Long_udivRem(a, b)[1];
} }
function Long_divRem(a, b) { function Long_divRem(a, b) {
if (b.lo === 0 && b.hi === 0) { if (b.lo === 0 && b.hi === 0) {
throw new Error("Division by zero"); throw new Error("Division by zero");
@ -233,6 +270,7 @@ function Long_divRem(a, b) {
q = new Long(q.lo, q.hi); q = new Long(q.lo, q.hi);
return positive ? [q, a] : [Long_neg(q), Long_neg(a)]; return positive ? [q, a] : [Long_neg(q), Long_neg(a)];
} }
function Long_udivRem(a, b) { function Long_udivRem(a, b) {
if (b.lo === 0 && b.hi === 0) { if (b.lo === 0 && b.hi === 0) {
throw new Error("Division by zero"); throw new Error("Division by zero");
@ -244,22 +282,28 @@ function Long_udivRem(a, b) {
q = new Long(q.lo, q.hi); q = new Long(q.lo, q.hi);
return [q, a]; return [q, a];
} }
function Long_shiftLeft16(a) { function Long_shiftLeft16(a) {
return new Long(a.lo << 16, (a.lo >>> 16) | (a.hi << 16)); return new Long(a.lo << 16, (a.lo >>> 16) | (a.hi << 16));
} }
function Long_shiftRight16(a) { function Long_shiftRight16(a) {
return new Long((a.lo >>> 16) | (a.hi << 16), a.hi >>> 16); return new Long((a.lo >>> 16) | (a.hi << 16), a.hi >>> 16);
} }
function Long_and(a, b) {
Long_and = function(a, b) {
return new Long(a.lo & b.lo, a.hi & b.hi); return new Long(a.lo & b.lo, a.hi & b.hi);
} }
function Long_or(a, b) {
Long_or = function(a, b) {
return new Long(a.lo | b.lo, a.hi | b.hi); return new Long(a.lo | b.lo, a.hi | b.hi);
} }
function Long_xor(a, b) {
Long_xor = function(a, b) {
return new Long(a.lo ^ b.lo, a.hi ^ b.hi); return new Long(a.lo ^ b.lo, a.hi ^ b.hi);
} }
function Long_shl(a, b) {
Long_shl = function(a, b) {
b &= 63; b &= 63;
if (b === 0) { if (b === 0) {
return a; return a;
@ -271,7 +315,8 @@ function Long_shl(a, b) {
return new Long(0, a.lo << (b - 32)); return new Long(0, a.lo << (b - 32));
} }
} }
function Long_shr(a, b) {
Long_shr = function(a, b) {
b &= 63; b &= 63;
if (b === 0) { if (b === 0) {
return a; return a;
@ -283,7 +328,8 @@ function Long_shr(a, b) {
return new Long((a.hi >> (b - 32)), a.hi >> 31); return new Long((a.hi >> (b - 32)), a.hi >> 31);
} }
} }
function Long_shru(a, b) {
Long_shru = function(a, b) {
b &= 63; b &= 63;
if (b === 0) { if (b === 0) {
return a; return a;
@ -295,7 +341,8 @@ function Long_shru(a, b) {
return new Long((a.hi >>> (b - 32)), 0); return new Long((a.hi >>> (b - 32)), 0);
} }
} }
function Long_not(a) {
Long_not = function(a) {
return new Long(~a.hi, ~a.lo); return new Long(~a.hi, ~a.lo);
} }
@ -305,6 +352,7 @@ function LongInt(lo, hi, sup) {
this.hi = hi; this.hi = hi;
this.sup = sup; this.sup = sup;
} }
function LongInt_mul(a, b) { function LongInt_mul(a, b) {
var a_lolo = ((a.lo & 0xFFFF) * b) | 0; var a_lolo = ((a.lo & 0xFFFF) * b) | 0;
var a_lohi = ((a.lo >>> 16) * b) | 0; var a_lohi = ((a.lo >>> 16) * b) | 0;
@ -320,6 +368,7 @@ function LongInt_mul(a, b) {
a.hi = (a_hilo & 0xFFFF) | (a_hihi << 16); a.hi = (a_hilo & 0xFFFF) | (a_hihi << 16);
a.sup = sup & 0xFFFF; a.sup = sup & 0xFFFF;
} }
function LongInt_sub(a, b) { function LongInt_sub(a, b) {
var a_lolo = a.lo & 0xFFFF; var a_lolo = a.lo & 0xFFFF;
var a_lohi = a.lo >>> 16; var a_lohi = a.lo >>> 16;
@ -339,6 +388,7 @@ function LongInt_sub(a, b) {
a.hi = (a_hilo & 0xFFFF) | (a_hihi << 16); a.hi = (a_hilo & 0xFFFF) | (a_hihi << 16);
a.sup = sup; a.sup = sup;
} }
function LongInt_add(a, b) { function LongInt_add(a, b) {
var a_lolo = a.lo & 0xFFFF; var a_lolo = a.lo & 0xFFFF;
var a_lohi = a.lo >>> 16; var a_lohi = a.lo >>> 16;
@ -358,6 +408,7 @@ function LongInt_add(a, b) {
a.hi = (a_hilo & 0xFFFF) | (a_hihi << 16); a.hi = (a_hilo & 0xFFFF) | (a_hihi << 16);
a.sup = sup; a.sup = sup;
} }
function LongInt_inc(a) { function LongInt_inc(a) {
a.lo = (a.lo + 1) | 0; a.lo = (a.lo + 1) | 0;
if (a.lo === 0) { if (a.lo === 0) {
@ -367,6 +418,7 @@ function LongInt_inc(a) {
} }
} }
} }
function LongInt_dec(a) { function LongInt_dec(a) {
a.lo = (a.lo - 1) | 0; a.lo = (a.lo - 1) | 0;
if (a.lo === -1) { if (a.lo === -1) {
@ -376,6 +428,7 @@ function LongInt_dec(a) {
} }
} }
} }
function LongInt_ucompare(a, b) { function LongInt_ucompare(a, b) {
var r = (a.sup - b.sup); var r = (a.sup - b.sup);
if (r !== 0) { if (r !== 0) {
@ -395,6 +448,7 @@ function LongInt_ucompare(a, b) {
} }
return (a.lo & 1) - (b.lo & 1); return (a.lo & 1) - (b.lo & 1);
} }
function LongInt_numOfLeadingZeroBits(a) { function LongInt_numOfLeadingZeroBits(a) {
var n = 0; var n = 0;
var d = 16; var d = 16;
@ -407,6 +461,7 @@ function LongInt_numOfLeadingZeroBits(a) {
} }
return 31 - n; return 31 - n;
} }
function LongInt_shl(a, b) { function LongInt_shl(a, b) {
if (b === 0) { if (b === 0) {
return; return;
@ -433,6 +488,7 @@ function LongInt_shl(a, b) {
a.lo = 0; a.lo = 0;
} }
} }
function LongInt_shr(a, b) { function LongInt_shr(a, b) {
if (b === 0) { if (b === 0) {
return; return;
@ -459,9 +515,11 @@ function LongInt_shr(a, b) {
a.sup = 0; a.sup = 0;
} }
} }
function LongInt_copy(a) { function LongInt_copy(a) {
return new LongInt(a.lo, a.hi, a.sup); return new LongInt(a.lo, a.hi, a.sup);
} }
function LongInt_div(a, b) { function LongInt_div(a, b) {
// Normalize divisor // Normalize divisor
var bits = b.hi !== 0 ? LongInt_numOfLeadingZeroBits(b.hi) : LongInt_numOfLeadingZeroBits(b.lo) + 32; var bits = b.hi !== 0 ? LongInt_numOfLeadingZeroBits(b.hi) : LongInt_numOfLeadingZeroBits(b.lo) + 32;
@ -502,3 +560,100 @@ function LongInt_div(a, b) {
LongInt_shr(a, bits + 16); LongInt_shr(a, bits + 16);
return q; return q;
} }
} else {
Long_eq = function(a, b) {
return a === b;
}
Long_ne = function(a, b) {
return a !== b;
}
Long_gt = function(a, b) {
return a > b;
}
Long_ge = function(a, b) {
return a >= b;
}
Long_lt = function(a, b) {
return a < b;
}
Long_le = function(a, b) {
return a <= b;
}
Long_add = function(a, b) {
return BigInt.asIntN(64, a + b);
}
Long_inc = function(a) {
return BigInt.asIntN(64, a + 1);
}
Long_dec = function(a) {
return BigInt.asIntN(64, a - 1);
}
Long_neg = function(a) {
return BigInt.asIntN(64, -a);
}
Long_sub = function(a, b) {
return BigInt.asIntN(64, a - b);
}
Long_compare = function(a, b) {
return a < b ? -1 : a > b ? 1 : 0;
}
Long_mul = function(a, b) {
return BigInt.asIntN(64, a * b);
}
Long_div = function(a, b) {
return BigInt.asIntN(64, a / b);
}
Long_udiv = function(a, b) {
return BigInt.asIntN(64, BigInt.asUintN(64, a) / BigInt.asUintN(64, b));
}
Long_rem = function(a, b) {
return BigInt.asIntN(64, a % b);
}
Long_urem = function(a, b) {
return BigInt.asIntN(64, BigInt.asUintN(64, a) % BigInt.asUintN(64, b));
}
Long_and = function(a, b) {
return BigInt.asIntN(64, a & b);
}
Long_or = function(a, b) {
return BigInt.asIntN(64, a | b);
}
Long_xor = function(a, b) {
return BigInt.asIntN(64, a ^ b);
}
Long_shl = function(a, b) {
return BigInt.asIntN(64, a << BigInt(b & 63));
}
Long_shr = function(a, b) {
return BigInt.asIntN(64, a >> BigInt(b & 63));
}
Long_shru = function(a, b) {
return BigInt.asIntN(64, BigInt.asUintN(64, a) >> BigInt(b & 63));
}
Long_not = function(a) {
return BigInt.asIntN(64, ~a);
}
}

View File

@ -74,17 +74,30 @@ function $rt_wrapArray(cls, data) {
function $rt_createUnfilledArray(cls, sz) { function $rt_createUnfilledArray(cls, sz) {
return new $rt_array(cls, new Array(sz)); return new $rt_array(cls, new Array(sz));
} }
function $rt_createLongArray(sz) { function $rt_createNumericArray(cls, nativeArray) {
return new $rt_array(cls, nativeArray);
}
var $rt_createLongArray;
var $rt_createLongArrayFromData;
if (typeof BigInt !== 'function') {
$rt_createLongArray = function(sz) {
var data = new Array(sz); var data = new Array(sz);
var arr = new $rt_array($rt_longcls(), data); var arr = new $rt_array($rt_longcls(), data);
data.fill(Long_ZERO); data.fill(Long_ZERO);
return arr; return arr;
} }
function $rt_createLongArrayFromData(init) { $rt_createLongArrayFromData = function(init) {
return new $rt_array($rt_longcls(), init); return new $rt_array($rt_longcls(), init);
} }
function $rt_createNumericArray(cls, nativeArray) { } else {
return new $rt_array(cls, nativeArray); $rt_createLongArray = function (sz) {
return $rt_createNumericArray($rt_longcls(), new BigInt64Array(sz));
}
$rt_createLongArrayFromData = function(data) {
var buffer = new BigInt64Array(data.length);
buffer.set(data);
return $rt_createNumericArray($rt_longcls(), buffer);
}
} }
function $rt_createCharArray(sz) { function $rt_createCharArray(sz) {
return $rt_createNumericArray($rt_charcls(), new Uint16Array(sz)); return $rt_createNumericArray($rt_charcls(), new Uint16Array(sz));
@ -630,15 +643,29 @@ function $rt_eraseClinit(target) {
var $rt_numberConversionView = new DataView(new ArrayBuffer(8)); var $rt_numberConversionView = new DataView(new ArrayBuffer(8));
function $rt_doubleToLongBits(n) { var $rt_doubleToLongBits;
var $rt_longBitsToDouble;
if (typeof BigInt !== 'function') {
$rt_doubleToLongBits = function(n) {
$rt_numberConversionView.setFloat64(0, n, true); $rt_numberConversionView.setFloat64(0, n, true);
return new Long($rt_numberConversionView.getInt32(0, true), $rt_numberConversionView.getInt32(4, true)); return new Long($rt_numberConversionView.getInt32(0, true), $rt_numberConversionView.getInt32(4, true));
} }
function $rt_longBitsToDouble(n) { $rt_longBitsToDouble = function(n) {
$rt_numberConversionView.setInt32(0, n.lo, true); $rt_numberConversionView.setInt32(0, n.lo, true);
$rt_numberConversionView.setInt32(4, n.hi, true); $rt_numberConversionView.setInt32(4, n.hi, true);
return $rt_numberConversionView.getFloat64(0, true); return $rt_numberConversionView.getFloat64(0, true);
} }
} else {
$rt_doubleToLongBits = function(n) {
$rt_numberConversionView.setFloat64(0, n, true);
return $rt_numberConversionView.getBigInt64(0, true);
}
$rt_longBitsToDouble = function(n) {
$rt_numberConversionView.setBigInt64(0, n, true);
return $rt_numberConversionView.getFloat64(0, true);
}
}
function $rt_floatToIntBits(n) { function $rt_floatToIntBits(n) {
$rt_numberConversionView.setFloat32(0, n); $rt_numberConversionView.setFloat32(0, n);
return $rt_numberConversionView.getInt32(0); return $rt_numberConversionView.getInt32(0);
@ -697,6 +724,15 @@ function $dbg_class(obj) {
} }
return clsName; return clsName;
} }
var Long_MAX_NORMAL = 1 << 18;
var Long_ZERO;
var Long_create;
var Long_fromInt;
var Long_fromNumber;
var Long_toNumber;
var Long_hi;
var Long_lo;
if (typeof BigInt !== "function") {
function Long(lo, hi) { function Long(lo, hi) {
this.lo = lo | 0; this.lo = lo | 0;
this.hi = hi | 0; this.hi = hi | 0;
@ -704,6 +740,15 @@ function Long(lo, hi) {
Long.prototype.__teavm_class__ = function() { Long.prototype.__teavm_class__ = function() {
return "long"; return "long";
}; };
function Long_isPositive(a) {
return (a.hi & 0x80000000) === 0;
}
function Long_isNegative(a) {
return (a.hi & 0x80000000) !== 0;
}
Long.prototype.toString = function() { Long.prototype.toString = function() {
var result = []; var result = [];
var n = this; var n = this;
@ -723,21 +768,51 @@ Long.prototype.toString = function() {
Long.prototype.valueOf = function() { Long.prototype.valueOf = function() {
return Long_toNumber(this); return Long_toNumber(this);
}; };
var Long_ZERO = new Long(0, 0);
var Long_MAX_NORMAL = 1 << 18; Long_ZERO = new Long(0, 0);
function Long_fromInt(val) { Long_fromInt = function(val) {
return new Long(val, (-(val < 0)) | 0); return new Long(val, (-(val < 0)) | 0);
} }
function Long_fromNumber(val) { Long_fromNumber = function(val) {
if (val >= 0) { if (val >= 0) {
return new Long(val | 0, (val / 0x100000000) | 0); return new Long(val | 0, (val / 0x100000000) | 0);
} else { } else {
return Long_neg(new Long(-val | 0, (-val / 0x100000000) | 0)); return Long_neg(new Long(-val | 0, (-val / 0x100000000) | 0));
} }
} }
function Long_toNumber(val) { Long_create = function(lo, hi) {
return new Long(hi, lo);
}
Long_toNumber = function(val) {
return 0x100000000 * val.hi + (val.lo >>> 0); return 0x100000000 * val.hi + (val.lo >>> 0);
} }
Long_hi = function(val) {
return val.hi;
}
Long_lo = function(val) {
return val.lo;
}
} else {
Long_ZERO = BigInt(0);
Long_create = function(lo, hi) {
return BigInt.asIntN(64, BigInt(lo) | (BigInt(hi) << BigInt(32)));
}
Long_fromInt = function(val) {
return BigInt(val);
}
Long_fromNumber = function(val) {
return BigInt(val >= 0 ? Math.floor(val) : Math.ceil(val));
}
Long_toNumber = function(val) {
return Number(val);
}
Long_hi = function(val) {
return Number(BigInt.asIntN(64, val >> BigInt(32))) | 0;
}
Long_lo = function(val) {
return Number(BigInt.asIntN(32, val)) | 0;
}
}
var $rt_imul = Math.imul || function(a, b) { var $rt_imul = Math.imul || function(a, b) {
var ah = (a >>> 16) & 0xFFFF; var ah = (a >>> 16) & 0xFFFF;
var al = a & 0xFFFF; var al = a & 0xFFFF;