Index: runtime/lib/integers.dart |
diff --git a/runtime/lib/integers.dart b/runtime/lib/integers.dart |
index be0cb8fad71a8026e7afef29439fa209c8df77a8..90c3cddce053d69f6ece17f83b23fefd2af74f31 100644 |
--- a/runtime/lib/integers.dart |
+++ b/runtime/lib/integers.dart |
@@ -175,21 +175,23 @@ class _IntegerImplementation extends _Num { |
double truncateToDouble() { return this.toDouble(); } |
num clamp(num lowerLimit, num upperLimit) { |
- if (lowerLimit is! num) throw new ArgumentError(lowerLimit); |
- if (upperLimit is! num) throw new ArgumentError(upperLimit); |
+ if (lowerLimit is! num) { |
+ throw new ArgumentError.value(lowerLimit, "lowerLimit"); |
+ } |
+ if (upperLimit is! num) { |
+ throw new ArgumentError.value(upperLimit, "upperLimit"); |
+ } |
// Special case for integers. |
- if (lowerLimit is int && upperLimit is int) { |
- if (lowerLimit > upperLimit) { |
- throw new ArgumentError(lowerLimit); |
- } |
+ if (lowerLimit is int && upperLimit is int && |
+ lowerLimit <= upperLimit) { |
if (this < lowerLimit) return lowerLimit; |
if (this > upperLimit) return upperLimit; |
return this; |
} |
- // Generic case involving doubles. |
+ // Generic case involving doubles, and invalid integer ranges. |
if (lowerLimit.compareTo(upperLimit) > 0) { |
- throw new ArgumentError(lowerLimit); |
+ throw new RangeError.range(upperLimit, lowerLimit, null, "upperLimit"); |
} |
if (lowerLimit.isNaN) return lowerLimit; |
// Note that we don't need to care for -0.0 for the lower limit. |
@@ -216,8 +218,8 @@ class _IntegerImplementation extends _Num { |
static const _digits = "0123456789abcdefghijklmnopqrstuvwxyz"; |
String toRadixString(int radix) { |
- if (radix is! int || radix < 2 || radix > 36) { |
- throw new ArgumentError(radix); |
+ if (radix < 2 || 36 < radix) { |
+ throw new RangeError.range(radix, 2, 36, "radix"); |
} |
if (radix & (radix - 1) == 0) { |
return _toPow2String(radix); |
@@ -267,10 +269,14 @@ class _IntegerImplementation extends _Num { |
// Returns pow(this, e) % m. |
int modPow(int e, int m) { |
- if (e is! int) throw new ArgumentError(e); |
- if (m is! int) throw new ArgumentError(m); |
- if (e < 0) throw new RangeError(e); |
- if (m <= 0) throw new RangeError(m); |
+ if (e is! int) { |
+ throw new ArgumentError.value(e, "exponent", "not an integer"); |
+ } |
+ if (m is! int) { |
+ throw new ArgumentError.value(m, "modulus", "not an integer"); |
+ } |
+ if (e < 0) throw new RangeError.range(e, 0, null, "exponent"); |
+ if (m <= 0) throw new RangeError.range(m, 1, null, "modulus"); |
if (e == 0) return 1; |
if (e is _Bigint || m is _Bigint) { |
return _toBigint().modPow(e, m); |
@@ -292,7 +298,7 @@ class _IntegerImplementation extends _Num { |
// If inv is false, returns gcd(x, y). |
// If inv is true and gcd(x, y) = 1, returns d, so that c*x + d*y = 1. |
- // If inv is true and gcd(x, y) != 1, throws RangeError("Not coprime"). |
+ // If inv is true and gcd(x, y) != 1, throws Exception("Not coprime"). |
static int _binaryGcd(int x, int y, bool inv) { |
int s = 0; |
if (!inv) { |
@@ -352,7 +358,9 @@ class _IntegerImplementation extends _Num { |
} |
} while (u != 0); |
if (!inv) return v << s; |
- if (v != 1) throw new RangeError("Not coprime"); |
+ if (v != 1) { |
+ throw new Exception("Not coprime"); |
+ } |
if (d < 0) { |
d += x; |
if (d < 0) d += x; |
@@ -365,8 +373,10 @@ class _IntegerImplementation extends _Num { |
// Returns 1/this % m, with m > 0. |
int modInverse(int m) { |
- if (m is! int) throw new ArgumentError(m); |
- if (m <= 0) throw new RangeError(m); |
+ if (m is! int) { |
+ throw new ArgumentError.value(m, "modulus", "not an integer"); |
+ } |
+ if (m <= 0) throw new RangeError.range(m, 1, null, "modulus"); |
if (m == 1) return 0; |
if (m is _Bigint) { |
return _toBigint().modInverse(m); |
@@ -374,14 +384,23 @@ class _IntegerImplementation extends _Num { |
int t = this; |
if ((t < 0) || (t >= m)) t %= m; |
if (t == 1) return 1; |
- if ((t == 0) || (t.isEven && m.isEven)) throw new RangeError("Not coprime"); |
+ if ((t == 0) || (t.isEven && m.isEven)) { |
+ throw new Exception("Not coprime"); |
+ } |
return _binaryGcd(m, t, true); |
} |
// Returns gcd of abs(this) and abs(other), with this != 0 and other !=0. |
int gcd(int other) { |
- if (other is! int) throw new ArgumentError(other); |
- if ((this == 0) || (other == 0)) throw new RangeError(0); |
+ if (other is! int) { |
+ throw new ArgumentError.value(other, "other", "not an integer"); |
+ } |
+ if (this == 0) { |
+ throw new ArgumentError.value(this, "this", "must not be zero"); |
+ } |
+ if (other == 0) { |
+ throw new ArgumentError.value(this, "other", "must not be zero"); |
+ } |
int x = this.abs(); |
int y = other.abs(); |
if ((x == 1) || (y == 1)) return 1; |