Skip to content

Commit

Permalink
update bignum code with bugfix from upstream, and add i64Math code to…
Browse files Browse the repository at this point in the history
… parse
  • Loading branch information
kripken committed Dec 30, 2012
1 parent 29d1e22 commit ea655d0
Showing 1 changed file with 36 additions and 7 deletions.
43 changes: 36 additions & 7 deletions src/long.js
Expand Up @@ -1053,7 +1053,7 @@ var i64Math = (function() { // Emscripten wrapper
if(r != 0) return r;
var i = this.t;
r = i-a.t;
if(r != 0) return r;
if(r != 0) return (this.s<0)?-r:r;
while(--i >= 0) if((r=this[i]-a[i]) != 0) return r;
return 0;
}
Expand Down Expand Up @@ -1552,9 +1552,15 @@ var i64Math = (function() { // Emscripten wrapper
Wrapper.result[0] = ret.low_;
Wrapper.result[1] = ret.high_;
},
makeTwo32: function() {
ensureTemps: function() {
if (Wrapper.ensuredTemps) return;
Wrapper.ensuredTemps = true;
Wrapper.two32 = new BigInteger();
Wrapper.two32.fromString('4294967296', 10);
Wrapper.two64 = new BigInteger();
Wrapper.two64.fromString('18446744073709551616', 10);
Wrapper.temp1 = new BigInteger();
Wrapper.temp2 = new BigInteger();
},
lh2bignum: function(l, h) {
var a = new BigInteger();
Expand All @@ -1568,7 +1574,7 @@ var i64Math = (function() { // Emscripten wrapper
return d;
},
divide: function(xl, xh, yl, yh, unsigned) {
if (!Wrapper.two32) Wrapper.makeTwo32();
Wrapper.ensureTemps();
if (!unsigned) {
var x = new goog.math.Long(xl, xh);
var y = new goog.math.Long(yl, yh);
Expand Down Expand Up @@ -1613,17 +1619,40 @@ var i64Math = (function() { // Emscripten wrapper
var ret = new goog.math.Long(l, h).toString();
if (unsigned && ret[0] == '-') {
// unsign slowly using jsbn bignums
if (!Wrapper.two64) {
Wrapper.two64 = new BigInteger();
Wrapper.two64.fromString('18446744073709551616', 10);
}
Wrapper.ensureTemps();
var bignum = new BigInteger();
bignum.fromString(ret, 10);
ret = new BigInteger();
Wrapper.two64.addTo(bignum, ret);
ret = ret.toString(10);
}
return ret;
},
fromString: function(str, base, min, max, unsigned) {
Wrapper.ensureTemps();
var bignum = new BigInteger();
bignum.fromString(str, base);
var bigmin = new BigInteger();
bigmin.fromString(min, 10);
var bigmax = new BigInteger();
bigmax.fromString(max, 10);
if (unsigned && bignum.compareTo(BigInteger.ZERO) < 0) {
var temp = new BigInteger();
bignum.addTo(Wrapper.two64, temp);
bignum = temp;
}
var error = false;
if (bignum.compareTo(bigmin) < 0) {
bignum = bigmin;
error = true;
} else if (bignum.compareTo(bigmax) > 0) {
bignum = bigmax;
error = true;
}
var ret = goog.math.Long.fromString(bignum.toString()); // min-max checks should have clamped this to a range goog.math.Long can handle well
Wrapper.result[0] = ret.low_;
Wrapper.result[1] = ret.high_;
if (error) throw 'range error';
}
};
return Wrapper;
Expand Down

0 comments on commit ea655d0

Please sign in to comment.