| Index: runtime/lib/double.dart
|
| diff --git a/runtime/lib/double.dart b/runtime/lib/double.dart
|
| index aee84e23bc74334e383864da1cc1359eb2bb1d1f..decfb570389fea5f78f88785634a8c34bb868fbf 100644
|
| --- a/runtime/lib/double.dart
|
| +++ b/runtime/lib/double.dart
|
| @@ -6,11 +6,8 @@ class _Double implements double {
|
| factory _Double.fromInteger(int value)
|
| native "Double_doubleFromInteger";
|
| int get hashCode {
|
| - try {
|
| - return toInt();
|
| - } on FormatException catch (e) {
|
| - return 0;
|
| - }
|
| + if (isNaN || isInfinite) return 0;
|
| + return toInt();
|
| }
|
| double operator +(num other) {
|
| return _add(other.toDouble());
|
| @@ -27,10 +24,10 @@ class _Double implements double {
|
| }
|
| double _mul(double other) native "Double_mul";
|
|
|
| - double operator ~/(num other) {
|
| + int operator ~/(num other) {
|
| return _trunc_div(other.toDouble());
|
| }
|
| - double _trunc_div(double other) native "Double_trunc_div";
|
| + int _trunc_div(double other) native "Double_trunc_div";
|
|
|
| double operator /(num other) {
|
| return _div(other.toDouble());
|
| @@ -81,7 +78,7 @@ class _Double implements double {
|
| double _mulFromInteger(int other) {
|
| return new _Double.fromInteger(other) * this;
|
| }
|
| - double _truncDivFromInteger(int other) {
|
| + int _truncDivFromInteger(int other) {
|
| return new _Double.fromInteger(other) ~/ this;
|
| }
|
| double _moduloFromInteger(int other) {
|
| @@ -107,6 +104,20 @@ class _Double implements double {
|
| double floor() native "Double_floor";
|
| double ceil () native "Double_ceil";
|
| double truncate() native "Double_truncate";
|
| +
|
| + num clamp(num lowerLimit, num upperLimit) {
|
| + if (lowerLimit is! num) throw new ArgumentError(lowerLimit);
|
| + if (upperLimit is! num) throw new ArgumentError(upperLimit);
|
| +
|
| + if (lowerLimit.compareTo(upperLimit) > 0) {
|
| + throw new ArgumentError(lowerLimit);
|
| + }
|
| + if (lowerLimit.isNaN) return lowerLimit;
|
| + if (this.compareTo(lowerLimit) < 0) return lowerLimit;
|
| + if (this.compareTo(upperLimit) > 0) return upperLimit;
|
| + return this;
|
| + }
|
| +
|
| int toInt() native "Double_toInt";
|
| double toDouble() { return this; }
|
|
|
| @@ -128,10 +139,12 @@ class _Double implements double {
|
| String toStringAsFixed(int fractionDigits) {
|
| // See ECMAScript-262, 15.7.4.5 for details.
|
|
|
| + if (fractionDigits is! int) {
|
| + throw new ArgumentError(fractionDigits);
|
| + }
|
| // Step 2.
|
| if (fractionDigits < 0 || fractionDigits > 20) {
|
| - // TODO(antonm): should be proper RangeError or Dart counterpart.
|
| - throw "Range error";
|
| + throw new RangeError(fractionDigits);
|
| }
|
|
|
| // Step 3.
|
| @@ -151,7 +164,7 @@ class _Double implements double {
|
| }
|
| String _toStringAsFixed(int fractionDigits) native "Double_toStringAsFixed";
|
|
|
| - String toStringAsExponential(int fractionDigits) {
|
| + String toStringAsExponential([int fractionDigits]) {
|
| // See ECMAScript-262, 15.7.4.6 for details.
|
|
|
| // The EcmaScript specification checks for NaN and Infinity before looking
|
| @@ -159,10 +172,13 @@ class _Double implements double {
|
| // look at the fractionDigits first.
|
|
|
| // Step 7.
|
| - if (fractionDigits != null &&
|
| - (fractionDigits < 0 || fractionDigits > 20)) {
|
| - // TODO(antonm): should be proper RangeError or Dart counterpart.
|
| - throw "Range error";
|
| + if (fractionDigits != null) {
|
| + if (fractionDigits is! int) {
|
| + throw new ArgumentError(fractionDigits);
|
| + }
|
| + if (fractionDigits < 0 || fractionDigits > 20) {
|
| + throw new RangeError(fractionDigits);
|
| + }
|
| }
|
|
|
| if (isNaN) return "NaN";
|
| @@ -185,10 +201,11 @@ class _Double implements double {
|
| // at the fractionDigits. In Dart we are consistent with toStringAsFixed and
|
| // look at the fractionDigits first.
|
|
|
| + if (precision is! int) throw new ArgumentError(precision);
|
| +
|
| // Step 8.
|
| if (precision < 1 || precision > 21) {
|
| - // TODO(antonm): should be proper RangeError or Dart counterpart.
|
| - throw "Range error";
|
| + throw new RangeError(precision);
|
| }
|
|
|
| if (isNaN) return "NaN";
|
| @@ -200,10 +217,6 @@ class _Double implements double {
|
| String _toStringAsPrecision(int fractionDigits)
|
| native "Double_toStringAsPrecision";
|
|
|
| - String toRadixString(int radix) {
|
| - return toInt().toRadixString(radix);
|
| - }
|
| -
|
| // Order is: NaN > Infinity > ... > 0.0 > -0.0 > ... > -Infinity.
|
| int compareTo(Comparable other) {
|
| final int EQUAL = 0, LESS = -1, GREATER = 1;
|
|
|