| Index: runtime/lib/math_patch.dart
|
| ===================================================================
|
| --- runtime/lib/math_patch.dart (revision 14972)
|
| +++ runtime/lib/math_patch.dart (working copy)
|
| @@ -3,19 +3,37 @@
|
| // BSD-style license that can be found in the LICENSE file.
|
|
|
| // A VM patch of the dart:math library.
|
| -patch num pow(num x, num exponent) => MathNatives.pow(x, exponent);
|
| -patch double atan2(num a, num b) => MathNatives.atan2(a, b);
|
| -patch double sin(num x) => MathNatives.sin(x);
|
| -patch double cos(num x) => MathNatives.cos(x);
|
| -patch double tan(num x) => MathNatives.tan(x);
|
| -patch double acos(num x) => MathNatives.acos(x);
|
| -patch double asin(num x) => MathNatives.asin(x);
|
| -patch double atan(num x) => MathNatives.atan(x);
|
| -patch double sqrt(num x) => MathNatives.sqrt(x);
|
| -patch double exp(num x) => MathNatives.exp(x);
|
| -patch double log(num x) => MathNatives.log(x);
|
| +patch num pow(num x, num exponent) {
|
| + if (exponent is int) {
|
| + return x.pow(exponent);
|
| + }
|
| + // Double.pow will call exponent.toDouble().
|
| + return x.toDouble().pow(exponent);
|
| +}
|
|
|
| +patch double atan2(num a, num b) => _atan2(a.toDouble(), b.toDouble());
|
| +patch double sin(num value) => _sin(value.toDouble());
|
| +patch double cos(num value) => _cos(value.toDouble());
|
| +patch double tan(num value) => _tan(value.toDouble());
|
| +patch double acos(num value) => _acos(value.toDouble());
|
| +patch double asin(num value) => _asin(value.toDouble());
|
| +patch double atan(num value) => _atan(value.toDouble());
|
| +patch double sqrt(num value) => _sqrt(value.toDouble());
|
| +patch double exp(num value) => _exp(value.toDouble());
|
| +patch double log(num value) => _log(value.toDouble());
|
|
|
| +double _atan2(double a, double b) native "Math_atan2";
|
| +double _sin(double x) native "Math_sin";
|
| +double _cos(double x) native "Math_cos";
|
| +double _tan(double x) native "Math_tan";
|
| +double _acos(double x) native "Math_acos";
|
| +double _asin(double x) native "Math_asin";
|
| +double _atan(double x) native "Math_atan";
|
| +double _sqrt(double x) native "Math_sqrt";
|
| +double _exp(double x) native "Math_exp";
|
| +double _log(double x) native "Math_log";
|
| +
|
| +
|
| // TODO(iposva): Handle patch methods within a patch class correctly.
|
| patch class Random {
|
|
|
| @@ -33,20 +51,24 @@
|
|
|
| class _Random implements Random {
|
| // Internal state of the random number generator.
|
| - var _state_lo;
|
| - var _state_hi;
|
| + var _state;
|
| + static const kSTATE_LO = 0;
|
| + static const kSTATE_HI = 1;
|
|
|
| - _Random._internal(state)
|
| - : _state_lo = (state & _MASK_32), _state_hi = (state >> 32);
|
| + _Random._internal(state) {
|
| + _state = new List(2);
|
| + _state[kSTATE_LO] = state & _MASK_32;
|
| + _state[kSTATE_HI] = state >> 32;
|
| + }
|
|
|
| // The algorithm used here is Multiply with Carry (MWC) with a Base b = 2^32.
|
| // http://en.wikipedia.org/wiki/Multiply-with-carry
|
| // The constant A is selected from "Numerical Recipes 3rd Edition" p.348 B1.
|
| int _nextInt32() {
|
| - var state = ((_A * (_state_lo)) + _state_hi) & _MASK_64;
|
| - _state_lo = state & _MASK_32;
|
| - _state_hi = state >> 32;
|
| - return _state_lo;
|
| + var state = ((_A * (_state[kSTATE_LO])) + _state[kSTATE_HI]) & _MASK_64;
|
| + _state[kSTATE_LO] = state & _MASK_32;
|
| + _state[kSTATE_HI] = state >> 32;
|
| + return _state[kSTATE_LO];
|
| }
|
|
|
| int nextInt(int max) {
|
|
|