Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(161)

Unified Diff: lib/runtime/dart_sdk.js

Side-by-side diff isn't available for this file because of its large size.
Issue 1952043002: Merge in JSNumber changes. (Closed) Base URL: https://github.com/dart-lang/dev_compiler@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
Download patch
« no previous file with comments | « no previous file | tool/input_sdk/lib/core/int.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/runtime/dart_sdk.js
diff --git a/lib/runtime/dart_sdk.js b/lib/runtime/dart_sdk.js
index 0a938f9351e677acd4fd5ae51ab73bc9d50737f2..c36a4606cadf368030f0faeb79cf0784c1c1721f 100644
--- a/lib/runtime/dart_sdk.js
+++ b/lib/runtime/dart_sdk.js
@@ -2593,6 +2593,9 @@ dart_library.library('dart_sdk', null, /* Imports */[
'toUnsigned',
'toSigned',
'bitLength',
+ 'modPow',
+ 'modInverse',
+ 'gcd',
'~'
]);
_interceptors.JSNumber = class JSNumber extends _interceptors.Interceptor {
@@ -2628,13 +2631,13 @@ dart_library.library('dart_sdk', null, /* Imports */[
return isNaN(this);
}
get [dartx.isInfinite]() {
- return this == Infinity || this == -Infinity;
+ return this == 1 / 0 || this == -1 / 0;
}
get [dartx.isFinite]() {
return isFinite(this);
}
[dartx.remainder](b) {
- _js_helper.checkNull(b);
+ if (!(typeof b == 'number')) dart.throw(_js_helper.argumentErrorValue(b));
return this % b;
}
[dartx.abs]() {
@@ -2650,7 +2653,7 @@ dart_library.library('dart_sdk', null, /* Imports */[
if (isFinite(this)) {
return this[dartx.truncateToDouble]() + 0;
}
- dart.throw(new core.UnsupportedError('' + this));
+ dart.throw(new core.UnsupportedError("" + this));
}
[dartx.truncate]() {
return this[dartx.toInt]();
@@ -2662,7 +2665,14 @@ dart_library.library('dart_sdk', null, /* Imports */[
return this[dartx.floorToDouble]()[dartx.toInt]();
}
[dartx.round]() {
- return this[dartx.roundToDouble]()[dartx.toInt]();
+ if (this > 0) {
+ if (this !== 1 / 0) {
+ return Math.round(this);
+ }
+ } else if (this > -1 / 0) {
+ return 0 - Math.round(0 - this);
+ }
+ dart.throw(new core.UnsupportedError("" + this));
}
[dartx.ceilToDouble]() {
return Math.ceil(this);
@@ -2682,7 +2692,7 @@ dart_library.library('dart_sdk', null, /* Imports */[
}
[dartx.clamp](lowerLimit, upperLimit) {
if (dart.notNull(lowerLimit[dartx.compareTo](upperLimit)) > 0) {
- dart.throw(new core.ArgumentError(lowerLimit));
+ dart.throw(_js_helper.argumentErrorValue(lowerLimit));
}
if (dart.notNull(this[dartx.compareTo](lowerLimit)) < 0) return lowerLimit;
if (dart.notNull(this[dartx.compareTo](upperLimit)) > 0) return upperLimit;
@@ -2694,7 +2704,7 @@ dart_library.library('dart_sdk', null, /* Imports */[
[dartx.toStringAsFixed](fractionDigits) {
_js_helper.checkInt(fractionDigits);
if (dart.notNull(fractionDigits) < 0 || dart.notNull(fractionDigits) > 20) {
- dart.throw(new core.RangeError(fractionDigits));
+ dart.throw(new core.RangeError.range(fractionDigits, 0, 20, "fractionDigits"));
}
let result = this.toFixed(fractionDigits);
if (this == 0 && dart.notNull(this[dartx.isNegative])) return `-${result}`;
@@ -2706,7 +2716,7 @@ dart_library.library('dart_sdk', null, /* Imports */[
if (fractionDigits != null) {
_js_helper.checkInt(fractionDigits);
if (dart.notNull(fractionDigits) < 0 || dart.notNull(fractionDigits) > 20) {
- dart.throw(new core.RangeError(fractionDigits));
+ dart.throw(new core.RangeError.range(fractionDigits, 0, 20, "fractionDigits"));
}
result = this.toExponential(fractionDigits);
} else {
@@ -2718,7 +2728,7 @@ dart_library.library('dart_sdk', null, /* Imports */[
[dartx.toStringAsPrecision](precision) {
_js_helper.checkInt(precision);
if (dart.notNull(precision) < 1 || dart.notNull(precision) > 21) {
- dart.throw(new core.RangeError(precision));
+ dart.throw(new core.RangeError.range(precision, 1, 21, "precision"));
}
let result = this.toPrecision(precision);
if (this == 0 && dart.notNull(this[dartx.isNegative])) return `-${result}`;
@@ -2726,7 +2736,9 @@ dart_library.library('dart_sdk', null, /* Imports */[
}
[dartx.toRadixString](radix) {
_js_helper.checkInt(radix);
- if (dart.notNull(radix) < 2 || dart.notNull(radix) > 36) dart.throw(new core.RangeError(radix));
+ if (dart.notNull(radix) < 2 || dart.notNull(radix) > 36) {
+ dart.throw(new core.RangeError.range(radix, 2, 36, "radix"));
+ }
let result = this.toString(radix);
let rightParenCode = 41;
if (result[dartx.codeUnitAt](dart.notNull(result[dartx.length]) - 1) != rightParenCode) {
@@ -2761,23 +2773,23 @@ dart_library.library('dart_sdk', null, /* Imports */[
return -this;
}
[dartx['+']](other) {
- _js_helper.checkNull(other);
+ if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
return this + other;
}
[dartx['-']](other) {
- _js_helper.checkNull(other);
+ if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
return this - other;
}
[dartx['/']](other) {
- _js_helper.checkNull(other);
+ if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
return this / other;
}
[dartx['*']](other) {
- _js_helper.checkNull(other);
+ if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
return this * other;
}
[dartx['%']](other) {
- _js_helper.checkNull(other);
+ if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
let result = this % other;
if (result == 0) return 0;
if (result > 0) return result;
@@ -2798,18 +2810,20 @@ dart_library.library('dart_sdk', null, /* Imports */[
}
}
[_tdivSlow](other) {
- _js_helper.checkNull(other);
+ if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
return (this / other)[dartx.toInt]();
}
[dartx['<<']](other) {
- if (dart.notNull(other) < 0) dart.throw(new core.ArgumentError(other));
+ if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
+ if (other < 0) dart.throw(_js_helper.argumentErrorValue(other));
return this[_shlPositive](other);
}
[_shlPositive](other) {
return other > 31 ? 0 : this << other >>> 0;
}
[dartx['>>']](other) {
- if (dart.notNull(other) < 0) dart.throw(new core.ArgumentError(other));
+ if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
+ if (other < 0) dart.throw(_js_helper.argumentErrorValue(other));
return this[_shrOtherPositive](other);
}
[_shrOtherPositive](other) {
@@ -2819,31 +2833,31 @@ dart_library.library('dart_sdk', null, /* Imports */[
return other > 31 ? 0 : this >>> other;
}
[dartx['&']](other) {
- _js_helper.checkNull(other);
+ if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
return (this & other) >>> 0;
}
[dartx['|']](other) {
- _js_helper.checkNull(other);
+ if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
return (this | other) >>> 0;
}
[dartx['^']](other) {
- _js_helper.checkNull(other);
+ if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
return (this ^ other) >>> 0;
}
[dartx['<']](other) {
- _js_helper.checkNull(other);
+ if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
return this < other;
}
[dartx['>']](other) {
- _js_helper.checkNull(other);
+ if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
return this > other;
}
[dartx['<=']](other) {
- _js_helper.checkNull(other);
+ if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
return this <= other;
}
[dartx['>=']](other) {
- _js_helper.checkNull(other);
+ if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
return this >= other;
}
get [dartx.isEven]() {
@@ -2867,6 +2881,131 @@ dart_library.library('dart_sdk', null, /* Imports */[
}
return _interceptors.JSNumber._bitCount(_interceptors.JSNumber._spread(nonneg));
}
+ [dartx.modPow](e, m) {
+ if (!(typeof e == 'number')) {
+ dart.throw(new core.ArgumentError.value(e, "exponent", "not an integer"));
+ }
+ if (!(typeof m == 'number')) {
+ dart.throw(new core.ArgumentError.value(m, "modulus", "not an integer"));
+ }
+ if (dart.notNull(e) < 0) dart.throw(new core.RangeError.range(e, 0, null, "exponent"));
+ if (dart.notNull(m) <= 0) dart.throw(new core.RangeError.range(m, 1, null, "modulus"));
+ if (e == 0) return 1;
+ let b = this;
+ if (dart.notNull(b) < 0 || dart.notNull(b) > dart.notNull(m)) {
+ b = b[dartx['%']](m);
+ }
+ let r = 1;
+ while (dart.notNull(e) > 0) {
+ if (dart.notNull(e[dartx.isOdd])) {
+ r = (r * dart.notNull(b))[dartx['%']](m);
+ }
+ e = (dart.notNull(e) / 2)[dartx.truncate]();
+ b = (dart.notNull(b) * dart.notNull(b))[dartx['%']](m);
+ }
+ return r;
+ }
+ static _binaryGcd(x, y, inv) {
+ let s = 1;
+ if (!dart.notNull(inv)) {
+ while (dart.notNull(x[dartx.isEven]) && dart.notNull(y[dartx.isEven])) {
+ x = (dart.notNull(x) / 2)[dartx.truncate]();
+ y = (dart.notNull(y) / 2)[dartx.truncate]();
+ s = s * 2;
+ }
+ if (dart.notNull(y[dartx.isOdd])) {
+ let t = x;
+ x = y;
+ y = t;
+ }
+ }
+ let ac = x[dartx.isEven];
+ let u = x;
+ let v = y;
+ let a = 1, b = 0, c = 0, d = 1;
+ do {
+ while (dart.notNull(u[dartx.isEven])) {
+ u = (dart.notNull(u) / 2)[dartx.truncate]();
+ if (dart.notNull(ac)) {
+ if (!dart.notNull(a[dartx.isEven]) || !dart.notNull(b[dartx.isEven])) {
+ a = dart.notNull(a) + dart.notNull(y);
+ b = dart.notNull(b) - dart.notNull(x);
+ }
+ a = (dart.notNull(a) / 2)[dartx.truncate]();
+ } else if (!dart.notNull(b[dartx.isEven])) {
+ b = dart.notNull(b) - dart.notNull(x);
+ }
+ b = (dart.notNull(b) / 2)[dartx.truncate]();
+ }
+ while (dart.notNull(v[dartx.isEven])) {
+ v = (dart.notNull(v) / 2)[dartx.truncate]();
+ if (dart.notNull(ac)) {
+ if (!dart.notNull(c[dartx.isEven]) || !dart.notNull(d[dartx.isEven])) {
+ c = dart.notNull(c) + dart.notNull(y);
+ d = dart.notNull(d) - dart.notNull(x);
+ }
+ c = (dart.notNull(c) / 2)[dartx.truncate]();
+ } else if (!dart.notNull(d[dartx.isEven])) {
+ d = dart.notNull(d) - dart.notNull(x);
+ }
+ d = (dart.notNull(d) / 2)[dartx.truncate]();
+ }
+ if (dart.notNull(u) >= dart.notNull(v)) {
+ u = dart.notNull(u) - dart.notNull(v);
+ if (dart.notNull(ac)) {
+ a = dart.notNull(a) - dart.notNull(c);
+ }
+ b = dart.notNull(b) - dart.notNull(d);
+ } else {
+ v = dart.notNull(v) - dart.notNull(u);
+ if (dart.notNull(ac)) {
+ c = dart.notNull(c) - dart.notNull(a);
+ }
+ d = dart.notNull(d) - dart.notNull(b);
+ }
+ } while (u != 0);
+ if (!dart.notNull(inv)) return s * dart.notNull(v);
+ if (v != 1) dart.throw(core.Exception.new("Not coprime"));
+ if (dart.notNull(d) < 0) {
+ d = dart.notNull(d) + dart.notNull(x);
+ if (dart.notNull(d) < 0) {
+ d = dart.notNull(d) + dart.notNull(x);
+ }
+ } else if (dart.notNull(d) > dart.notNull(x)) {
+ d = dart.notNull(d) - dart.notNull(x);
+ if (dart.notNull(d) > dart.notNull(x)) {
+ d = dart.notNull(d) - dart.notNull(x);
+ }
+ }
+ return d;
+ }
+ [dartx.modInverse](m) {
+ if (!(typeof m == 'number')) {
+ dart.throw(new core.ArgumentError.value(m, "modulus", "not an integer"));
+ }
+ if (dart.notNull(m) <= 0) dart.throw(new core.RangeError.range(m, 1, null, "modulus"));
+ if (m == 1) return 0;
+ let t = this;
+ if (dart.notNull(t) < 0 || dart.notNull(t) >= dart.notNull(m)) {
+ t = t[dartx['%']](m);
+ }
+ if (t == 1) return 1;
+ if (t == 0 || dart.notNull(t[dartx.isEven]) && dart.notNull(m[dartx.isEven])) {
+ dart.throw(core.Exception.new("Not coprime"));
+ }
+ return _interceptors.JSNumber._binaryGcd(m, t, true);
+ }
+ [dartx.gcd](other) {
+ if (!(typeof other == 'number')) {
+ dart.throw(new core.ArgumentError.value(other, "other", "not an integer"));
+ }
+ let x = this[dartx.abs]();
+ let y = other[dartx.abs]();
+ if (x == 0) return y;
+ if (y == 0) return x;
+ if (x == 1 || y == 1) return 1;
+ return _interceptors.JSNumber._binaryGcd(x, y, false);
+ }
static _bitCount(i) {
i = dart.notNull(_interceptors.JSNumber._shru(i, 0)) - (dart.notNull(_interceptors.JSNumber._shru(i, 1)) & 1431655765);
i = (dart.notNull(i) & 858993459) + (dart.notNull(_interceptors.JSNumber._shru(i, 2)) & 858993459);
@@ -2941,17 +3080,21 @@ dart_library.library('dart_sdk', null, /* Imports */[
[dartx['>=']]: [core.bool, [core.num]],
[dartx.toUnsigned]: [core.int, [core.int]],
[dartx.toSigned]: [core.int, [core.int]],
+ [dartx.modPow]: [core.int, [core.int, core.int]],
+ [dartx.modInverse]: [core.int, [core.int]],
+ [dartx.gcd]: [core.int, [core.int]],
[dartx['~']]: [core.int, []]
}),
statics: () => ({
_handleIEtoString: [core.String, [core.String]],
+ _binaryGcd: [core.int, [core.int, core.int, core.bool]],
_bitCount: [core.int, [core.int]],
_shru: [core.int, [core.int, core.int]],
_shrs: [core.int, [core.int, core.int]],
_ors: [core.int, [core.int, core.int]],
_spread: [core.int, [core.int]]
}),
- names: ['_handleIEtoString', '_bitCount', '_shru', '_shrs', '_ors', '_spread']
+ names: ['_handleIEtoString', '_binaryGcd', '_bitCount', '_shru', '_shrs', '_ors', '_spread']
});
_interceptors.JSNumber[dart.metadata] = () => [dart.const(new _js_helper.JsPeerInterface({name: 'Number'}))];
_interceptors.JSNumber._MIN_INT32 = -2147483648;
« no previous file with comments | « no previous file | tool/input_sdk/lib/core/int.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698