bs-platform
Version:
bucklescript compiler, ocaml standard libary by bucklescript and its required runtime support
587 lines (537 loc) • 13.7 kB
JavaScript
'use strict';
var Caml_int32 = require("./caml_int32.js");
var Caml_utils = require("./caml_utils.js");
var Caml_primitive = require("./caml_primitive.js");
var Caml_builtin_exceptions = require("./caml_builtin_exceptions.js");
var min_int = /* record */[
/* hi */-2147483648,
/* lo */0
];
var max_int = /* record */[
/* hi */2147483647,
/* lo */1
];
var one = /* record */[
/* hi */0,
/* lo */1
];
var zero = /* record */[
/* hi */0,
/* lo */0
];
var neg_one = /* record */[
/* hi */-1,
/* lo */4294967295
];
function neg_signed(x) {
return (x & 2147483648) !== 0;
}
function add(param, param$1) {
var other_low_ = param$1[/* lo */1];
var this_low_ = param[/* lo */1];
var lo = this_low_ + other_low_ & 4294967295;
var overflow = neg_signed(this_low_) && (neg_signed(other_low_) || !neg_signed(lo)) || neg_signed(other_low_) && !neg_signed(lo) ? 1 : 0;
var hi = param[/* hi */0] + param$1[/* hi */0] + overflow & 4294967295;
return /* record */[
/* hi */hi,
/* lo */(lo >>> 0)
];
}
function not(param) {
var hi = param[/* hi */0] ^ -1;
var lo = param[/* lo */1] ^ -1;
return /* record */[
/* hi */hi,
/* lo */(lo >>> 0)
];
}
function eq(x, y) {
if (x[/* hi */0] === y[/* hi */0]) {
return x[/* lo */1] === y[/* lo */1];
} else {
return false;
}
}
function equal_null(x, y) {
if (y !== null) {
return eq(x, y);
} else {
return false;
}
}
function equal_undefined(x, y) {
if (y !== undefined) {
return eq(x, y);
} else {
return false;
}
}
function equal_nullable(x, y) {
if (y == null) {
return false;
} else {
return eq(x, y);
}
}
function neg(x) {
if (eq(x, min_int)) {
return min_int;
} else {
return add(not(x), one);
}
}
function sub(x, y) {
return add(x, neg(y));
}
function lsl_(x, numBits) {
if (numBits === 0) {
return x;
} else {
var lo = x[/* lo */1];
if (numBits >= 32) {
return /* record */[
/* hi */(lo << (numBits - 32 | 0)),
/* lo */0
];
} else {
var hi = (lo >>> (32 - numBits | 0)) | (x[/* hi */0] << numBits);
return /* record */[
/* hi */hi,
/* lo */((lo << numBits) >>> 0)
];
}
}
}
function lsr_(x, numBits) {
if (numBits === 0) {
return x;
} else {
var hi = x[/* hi */0];
var offset = numBits - 32 | 0;
if (offset === 0) {
return /* record */[
/* hi */0,
/* lo */(hi >>> 0)
];
} else if (offset > 0) {
var lo = (hi >>> offset);
return /* record */[
/* hi */0,
/* lo */(lo >>> 0)
];
} else {
var hi$1 = (hi >>> numBits);
var lo$1 = (hi << (-offset | 0)) | (x[/* lo */1] >>> numBits);
return /* record */[
/* hi */hi$1,
/* lo */(lo$1 >>> 0)
];
}
}
}
function asr_(x, numBits) {
if (numBits === 0) {
return x;
} else {
var hi = x[/* hi */0];
if (numBits < 32) {
var hi$1 = (hi >> numBits);
var lo = (hi << (32 - numBits | 0)) | (x[/* lo */1] >>> numBits);
return /* record */[
/* hi */hi$1,
/* lo */(lo >>> 0)
];
} else {
var lo$1 = (hi >> (numBits - 32 | 0));
return /* record */[
/* hi */hi >= 0 ? 0 : -1,
/* lo */(lo$1 >>> 0)
];
}
}
}
function is_zero(param) {
if (param[/* hi */0] !== 0 || param[/* lo */1] !== 0) {
return false;
} else {
return true;
}
}
function mul(_this, _other) {
while(true) {
var other = _other;
var $$this = _this;
var lo;
var this_hi = $$this[/* hi */0];
var exit = 0;
var exit$1 = 0;
var exit$2 = 0;
if (this_hi !== 0 || $$this[/* lo */1] !== 0) {
exit$2 = 4;
} else {
return zero;
}
if (exit$2 === 4) {
if (other[/* hi */0] !== 0 || other[/* lo */1] !== 0) {
exit$1 = 3;
} else {
return zero;
}
}
if (exit$1 === 3) {
if (this_hi !== -2147483648 || $$this[/* lo */1] !== 0) {
exit = 2;
} else {
lo = other[/* lo */1];
}
}
if (exit === 2) {
var other_hi = other[/* hi */0];
var lo$1 = $$this[/* lo */1];
var exit$3 = 0;
if (other_hi !== -2147483648 || other[/* lo */1] !== 0) {
exit$3 = 3;
} else {
lo = lo$1;
}
if (exit$3 === 3) {
var other_lo = other[/* lo */1];
if (this_hi < 0) {
if (other_hi < 0) {
_other = neg(other);
_this = neg($$this);
continue ;
} else {
return neg(mul(neg($$this), other));
}
} else if (other_hi < 0) {
return neg(mul($$this, neg(other)));
} else {
var a48 = (this_hi >>> 16);
var a32 = this_hi & 65535;
var a16 = (lo$1 >>> 16);
var a00 = lo$1 & 65535;
var b48 = (other_hi >>> 16);
var b32 = other_hi & 65535;
var b16 = (other_lo >>> 16);
var b00 = other_lo & 65535;
var c48 = 0;
var c32 = 0;
var c16 = 0;
var c00 = a00 * b00;
c16 = (c00 >>> 16) + a16 * b00;
c32 = (c16 >>> 16);
c16 = (c16 & 65535) + a00 * b16;
c32 = c32 + (c16 >>> 16) + a32 * b00;
c48 = (c32 >>> 16);
c32 = (c32 & 65535) + a16 * b16;
c48 += (c32 >>> 16);
c32 = (c32 & 65535) + a00 * b32;
c48 += (c32 >>> 16);
c32 = c32 & 65535;
c48 = c48 + (a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48) & 65535;
var hi = c32 | (c48 << 16);
var lo$2 = c00 & 65535 | ((c16 & 65535) << 16);
return /* record */[
/* hi */hi,
/* lo */(lo$2 >>> 0)
];
}
}
}
if ((lo & 1) === 0) {
return zero;
} else {
return min_int;
}
};
}
function swap(param) {
var hi = Caml_int32.caml_int32_bswap(param[/* lo */1]);
var lo = Caml_int32.caml_int32_bswap(param[/* hi */0]);
return /* record */[
/* hi */hi,
/* lo */(lo >>> 0)
];
}
function xor(param, param$1) {
return /* record */[
/* hi */param[/* hi */0] ^ param$1[/* hi */0],
/* lo */((param[/* lo */1] ^ param$1[/* lo */1]) >>> 0)
];
}
function or_(param, param$1) {
return /* record */[
/* hi */param[/* hi */0] | param$1[/* hi */0],
/* lo */((param[/* lo */1] | param$1[/* lo */1]) >>> 0)
];
}
function and_(param, param$1) {
return /* record */[
/* hi */param[/* hi */0] & param$1[/* hi */0],
/* lo */((param[/* lo */1] & param$1[/* lo */1]) >>> 0)
];
}
function ge(param, param$1) {
var other_hi = param$1[/* hi */0];
var hi = param[/* hi */0];
if (hi > other_hi) {
return true;
} else if (hi < other_hi) {
return false;
} else {
return param[/* lo */1] >= param$1[/* lo */1];
}
}
function neq(x, y) {
return !eq(x, y);
}
function lt(x, y) {
return !ge(x, y);
}
function gt(x, y) {
if (x[/* hi */0] > y[/* hi */0]) {
return true;
} else if (x[/* hi */0] < y[/* hi */0]) {
return false;
} else {
return x[/* lo */1] > y[/* lo */1];
}
}
function le(x, y) {
return !gt(x, y);
}
function min(x, y) {
if (ge(x, y)) {
return y;
} else {
return x;
}
}
function max(x, y) {
if (gt(x, y)) {
return x;
} else {
return y;
}
}
function to_float(param) {
return param[/* hi */0] * (0x100000000) + param[/* lo */1];
}
function of_float(x) {
if (isNaN(x) || !isFinite(x)) {
return zero;
} else if (x <= -9.22337203685477581e+18) {
return min_int;
} else if (x + 1 >= 9.22337203685477581e+18) {
return max_int;
} else if (x < 0) {
return neg(of_float(-x));
} else {
var hi = x / 4294967296 | 0;
var lo = x % 4294967296 | 0;
return /* record */[
/* hi */hi,
/* lo */(lo >>> 0)
];
}
}
function div(_self, _other) {
while(true) {
var other = _other;
var self = _self;
var self_hi = self[/* hi */0];
var exit = 0;
if (other[/* hi */0] !== 0 || other[/* lo */1] !== 0) {
exit = 2;
} else {
throw Caml_builtin_exceptions.division_by_zero;
}
if (exit === 2) {
if (self_hi !== -2147483648) {
if (self_hi === 0 && self[/* lo */1] === 0) {
return zero;
}
} else if (self[/* lo */1] === 0) {
if (eq(other, one) || eq(other, neg_one)) {
return self;
} else if (eq(other, min_int)) {
return one;
} else {
var other_hi = other[/* hi */0];
var half_this = asr_(self, 1);
var approx = lsl_(div(half_this, other), 1);
var exit$1 = 0;
if (approx[/* hi */0] !== 0 || approx[/* lo */1] !== 0) {
exit$1 = 3;
} else if (other_hi < 0) {
return one;
} else {
return neg(one);
}
if (exit$1 === 3) {
var y = mul(other, approx);
var rem = add(self, neg(y));
return add(approx, div(rem, other));
}
}
}
}
var other_hi$1 = other[/* hi */0];
if (other_hi$1 === -2147483648 && other[/* lo */1] === 0) {
return zero;
}
if (self_hi < 0) {
if (other_hi$1 < 0) {
_other = neg(other);
_self = neg(self);
continue ;
} else {
return neg(div(neg(self), other));
}
} else if (other_hi$1 < 0) {
return neg(div(self, neg(other)));
} else {
var res = zero;
var rem$1 = self;
while(ge(rem$1, other)) {
var approx$1 = Caml_primitive.caml_float_max(1, Math.floor(to_float(rem$1) / to_float(other)));
var log2 = Math.ceil(Math.log(approx$1) / Math.LN2);
var delta = log2 <= 48 ? 1 : Math.pow(2, log2 - 48);
var approxRes = of_float(approx$1);
var approxRem = mul(approxRes, other);
while(approxRem[/* hi */0] < 0 || gt(approxRem, rem$1)) {
approx$1 -= delta;
approxRes = of_float(approx$1);
approxRem = mul(approxRes, other);
};
if (is_zero(approxRes)) {
approxRes = one;
}
res = add(res, approxRes);
rem$1 = add(rem$1, neg(approxRem));
};
return res;
}
};
}
function mod_(self, other) {
var y = mul(div(self, other), other);
return add(self, neg(y));
}
function div_mod(self, other) {
var quotient = div(self, other);
var y = mul(quotient, other);
return /* tuple */[
quotient,
add(self, neg(y))
];
}
function compare(self, other) {
var v = Caml_primitive.caml_nativeint_compare(self[/* hi */0], other[/* hi */0]);
if (v === 0) {
return Caml_primitive.caml_nativeint_compare(self[/* lo */1], other[/* lo */1]);
} else {
return v;
}
}
function of_int32(lo) {
return /* record */[
/* hi */lo < 0 ? -1 : 0,
/* lo */(lo >>> 0)
];
}
function to_int32(x) {
return x[/* lo */1] | 0;
}
function to_hex(x) {
var x_lo = x[/* lo */1];
var x_hi = x[/* hi */0];
var aux = function (v) {
return (v >>> 0).toString(16);
};
if (x_hi === 0 && x_lo === 0) {
return "0";
}
if (x_lo !== 0) {
if (x_hi !== 0) {
var lo = aux(x_lo);
var pad = 8 - lo.length | 0;
if (pad <= 0) {
return aux(x_hi) + lo;
} else {
return aux(x_hi) + (Caml_utils.repeat(pad, "0") + lo);
}
} else {
return aux(x_lo);
}
} else {
return aux(x_hi) + "00000000";
}
}
function discard_sign(x) {
return /* record */[
/* hi */2147483647 & x[/* hi */0],
/* lo */x[/* lo */1]
];
}
function float_of_bits (x){
return new Float64Array(new Int32Array([x[1],x[0]]).buffer)[0]
};
function bits_of_float(x) {
var buf = (new Int32Array(new Float64Array([x]).buffer));
return /* record */[
/* hi */buf[1],
/* lo */(buf[0] >>> 0)
];
}
function get64(s, i) {
var hi = (s.charCodeAt(i + 4 | 0) << 32) | (s.charCodeAt(i + 5 | 0) << 40) | (s.charCodeAt(i + 6 | 0) << 48) | (s.charCodeAt(i + 7 | 0) << 56);
var lo = s.charCodeAt(i) | (s.charCodeAt(i + 1 | 0) << 8) | (s.charCodeAt(i + 2 | 0) << 16) | (s.charCodeAt(i + 3 | 0) << 24);
return /* record */[
/* hi */hi,
/* lo */(lo >>> 0)
];
}
exports.min_int = min_int;
exports.max_int = max_int;
exports.one = one;
exports.zero = zero;
exports.not = not;
exports.of_int32 = of_int32;
exports.to_int32 = to_int32;
exports.add = add;
exports.neg = neg;
exports.sub = sub;
exports.lsl_ = lsl_;
exports.lsr_ = lsr_;
exports.asr_ = asr_;
exports.is_zero = is_zero;
exports.mul = mul;
exports.xor = xor;
exports.or_ = or_;
exports.and_ = and_;
exports.swap = swap;
exports.ge = ge;
exports.eq = eq;
exports.neq = neq;
exports.lt = lt;
exports.gt = gt;
exports.le = le;
exports.equal_null = equal_null;
exports.equal_undefined = equal_undefined;
exports.equal_nullable = equal_nullable;
exports.min = min;
exports.max = max;
exports.to_float = to_float;
exports.of_float = of_float;
exports.div = div;
exports.mod_ = mod_;
exports.compare = compare;
exports.float_of_bits = float_of_bits;
exports.bits_of_float = bits_of_float;
exports.get64 = get64;
exports.div_mod = div_mod;
exports.to_hex = to_hex;
exports.discard_sign = discard_sign;
/* Caml_int32 Not a pure module */