Index: src/math.js |
=================================================================== |
--- src/math.js (revision 2155) |
+++ src/math.js (working copy) |
@@ -44,39 +44,73 @@ |
// ECMA 262 - 15.8.2.1 |
function MathAbs(x) { |
- if (%_IsSmi(x)) { |
- return x >= 0 ? x : -x; |
- } else { |
- return %Math_abs(ToNumber(x)); |
- } |
+ if (%_IsSmi(x)) return x >= 0 ? x : -x; |
+ if (!IS_NUMBER(x)) x = ToNumber(x); |
+ return %Math_abs(x); |
} |
// ECMA 262 - 15.8.2.2 |
-function MathAcos(x) { return %Math_acos(ToNumber(x)); } |
+function MathAcos(x) { |
+ if (!IS_NUMBER(x)) x = ToNumber(x); |
+ return %Math_acos(x); |
+} |
// ECMA 262 - 15.8.2.3 |
-function MathAsin(x) { return %Math_asin(ToNumber(x)); } |
+function MathAsin(x) { |
+ if (!IS_NUMBER(x)) x = ToNumber(x); |
+ return %Math_asin(x); |
+} |
// ECMA 262 - 15.8.2.4 |
-function MathAtan(x) { return %Math_atan(ToNumber(x)); } |
+function MathAtan(x) { |
+ if (!IS_NUMBER(x)) x = ToNumber(x); |
+ return %Math_atan(x); |
+} |
// ECMA 262 - 15.8.2.5 |
-function MathAtan2(x, y) { return %Math_atan2(ToNumber(x), ToNumber(y)); } |
+function MathAtan2(x, y) { |
+ if (!IS_NUMBER(x)) x = ToNumber(x); |
+ if (!IS_NUMBER(y)) y = ToNumber(y); |
+ return %Math_atan2(x, y); |
+} |
// ECMA 262 - 15.8.2.6 |
-function MathCeil(x) { return %Math_ceil(ToNumber(x)); } |
+function MathCeil(x) { |
+ if (!IS_NUMBER(x)) x = ToNumber(x); |
+ return %Math_ceil(x); |
+} |
// ECMA 262 - 15.8.2.7 |
-function MathCos(x) { return %Math_cos(ToNumber(x)); } |
+function MathCos(x) { |
+ if (!IS_NUMBER(x)) x = ToNumber(x); |
+ return %Math_cos(x); |
+} |
// ECMA 262 - 15.8.2.8 |
-function MathExp(x) { return %Math_exp(ToNumber(x)); } |
+function MathExp(x) { |
+ if (!IS_NUMBER(x)) x = ToNumber(x); |
+ return %Math_exp(x); |
+} |
// ECMA 262 - 15.8.2.9 |
-function MathFloor(x) { return %Math_floor(ToNumber(x)); } |
+function MathFloor(x) { |
+ if (!IS_NUMBER(x)) x = ToNumber(x); |
+ if (0 < x && x <= 0xFFFFFFFF) { |
+ // Numbers in the range [0, 2^32) can be floored by converting |
+ // them to an unsigned 32-bit value using the shift operator. |
+ // We avoid doing so for -0, because the result of Math.floor(-0) |
+ // has to be -0, which wouldn't be the case with the shift. |
+ return x << 0; |
+ } else { |
+ return %Math_floor(x); |
+ } |
+} |
// ECMA 262 - 15.8.2.10 |
-function MathLog(x) { return %Math_log(ToNumber(x)); } |
+function MathLog(x) { |
+ if (!IS_NUMBER(x)) x = ToNumber(x); |
+ return %Math_log(x); |
+} |
// ECMA 262 - 15.8.2.11 |
function MathMax(arg1, arg2) { // length == 2 |
@@ -103,22 +137,40 @@ |
} |
// ECMA 262 - 15.8.2.13 |
-function MathPow(x, y) { return %Math_pow(ToNumber(x), ToNumber(y)); } |
+function MathPow(x, y) { |
+ if (!IS_NUMBER(x)) x = ToNumber(x); |
+ if (!IS_NUMBER(y)) y = ToNumber(y); |
+ return %Math_pow(x, y); |
+} |
// ECMA 262 - 15.8.2.14 |
-function MathRandom() { return %Math_random(); } |
+function MathRandom() { |
+ return %_RandomPositiveSmi() / 0x40000000; |
+} |
// ECMA 262 - 15.8.2.15 |
-function MathRound(x) { return %Math_round(ToNumber(x)); } |
+function MathRound(x) { |
+ if (!IS_NUMBER(x)) x = ToNumber(x); |
+ return %Math_round(x); |
+} |
// ECMA 262 - 15.8.2.16 |
-function MathSin(x) { return %Math_sin(ToNumber(x)); } |
+function MathSin(x) { |
+ if (!IS_NUMBER(x)) x = ToNumber(x); |
+ return %Math_sin(x); |
+} |
// ECMA 262 - 15.8.2.17 |
-function MathSqrt(x) { return %Math_sqrt(ToNumber(x)); } |
+function MathSqrt(x) { |
+ if (!IS_NUMBER(x)) x = ToNumber(x); |
+ return %Math_sqrt(x); |
+} |
// ECMA 262 - 15.8.2.18 |
-function MathTan(x) { return %Math_tan(ToNumber(x)); } |
+function MathTan(x) { |
+ if (!IS_NUMBER(x)) x = ToNumber(x); |
+ return %Math_tan(x); |
+} |
// ------------------------------------------------------------------- |