| Index: runtime/lib/math_patch.dart
|
| diff --git a/runtime/lib/math_patch.dart b/runtime/lib/math_patch.dart
|
| index 63459fa1fcc54bc6bc7b11359c77b51afb8dfdff..fe8f8deef085d01e2fdf0b966aa855eb9bd6fcdf 100644
|
| --- a/runtime/lib/math_patch.dart
|
| +++ b/runtime/lib/math_patch.dart
|
| @@ -6,6 +6,64 @@ import "dart:typed_data";
|
|
|
| // A VM patch of the dart:math library.
|
|
|
| +@patch
|
| +T min<T extends num>(T a, T b) {
|
| + // These partially redundant type checks improve code quality for dart2js.
|
| + // Most of the improvement is at call sites from the inferred non-null num
|
| + // return type.
|
| + if (a is! num) throw new ArgumentError(a);
|
| + if (b is! num) throw new ArgumentError(b);
|
| +
|
| + if (a > b) return b;
|
| + if (a < b) return a;
|
| + if (b is double) {
|
| + // Special case for NaN and -0.0. If one argument is NaN return NaN.
|
| + // [min] must also distinguish between -0.0 and 0.0.
|
| + if (a is double) {
|
| + if (a == 0.0) {
|
| + // a is either 0.0 or -0.0. b is either 0.0, -0.0 or NaN.
|
| + // The following returns -0.0 if either a or b is -0.0, and it
|
| + // returns NaN if b is NaN.
|
| + return (a + b) * a * b;
|
| + }
|
| + }
|
| + // Check for NaN and b == -0.0.
|
| + if (a == 0 && b.isNegative || b.isNaN) return b;
|
| + return a;
|
| + }
|
| + return a;
|
| +}
|
| +
|
| +@patch
|
| +T max<T extends num>(T a, T b) {
|
| + // These partially redundant type checks improve code quality for dart2js.
|
| + // Most of the improvement is at call sites from the inferred non-null num
|
| + // return type.
|
| + if (a is! num) throw new ArgumentError(a);
|
| + if (b is! num) throw new ArgumentError(b);
|
| +
|
| + if (a > b) return a;
|
| + if (a < b) return b;
|
| + if (b is double) {
|
| + // Special case for NaN and -0.0. If one argument is NaN return NaN.
|
| + // [max] must also distinguish between -0.0 and 0.0.
|
| + if (a is double) {
|
| + if (a == 0.0) {
|
| + // a is either 0.0 or -0.0. b is either 0.0, -0.0, or NaN.
|
| + // The following returns 0.0 if either a or b is 0.0, and it
|
| + // returns NaN if b is NaN.
|
| + return a + b;
|
| + }
|
| + }
|
| + // Check for NaN.
|
| + if (b.isNaN) return b;
|
| + return a;
|
| + }
|
| + // max(-0.0, 0) must return 0.
|
| + if (b == 0 && a.isNegative) return b;
|
| + return a;
|
| +}
|
| +
|
| // If [x] is an [int] and [exponent] is a non-negative [int], the result is
|
| // an [int], otherwise the result is a [double].
|
| @patch
|
|
|