Index: src/runtime.js |
=================================================================== |
--- src/runtime.js (revision 2176) |
+++ src/runtime.js (working copy) |
@@ -224,14 +224,19 @@ |
var x; |
if (IS_NUMBER(this)) { |
x = this; |
+ if (!IS_NUMBER(y)) y = %ToNumber(y); |
} else { |
x = %ToNumber(this); |
+ // Make sure to convert the right operand to a number before |
+ // bailing out in the fast case, but after converting the |
+ // left operand. This ensures that valueOf methods on the right |
+ // operand are always executed. |
+ if (!IS_NUMBER(y)) y = %ToNumber(y); |
// Optimize for the case where we end up AND'ing a value |
// that doesn't convert to a number. This is common in |
// certain benchmarks. |
if (NUMBER_IS_NAN(x)) return 0; |
} |
- if (!IS_NUMBER(y)) y = %ToNumber(y); |
return %NumberAnd(x, y); |
} |
@@ -271,14 +276,19 @@ |
var x; |
if (IS_NUMBER(this)) { |
x = this; |
+ if (!IS_NUMBER(y)) y = %ToNumber(y); |
} else { |
x = %ToNumber(this); |
+ // Make sure to convert the right operand to a number before |
+ // bailing out in the fast case, but after converting the |
+ // left operand. This ensures that valueOf methods on the right |
+ // operand are always executed. |
+ if (!IS_NUMBER(y)) y = %ToNumber(y); |
// Optimize for the case where we end up shifting a value |
// that doesn't convert to a number. This is common in |
// certain benchmarks. |
if (NUMBER_IS_NAN(x)) return 0; |
} |
- if (!IS_NUMBER(y)) y = %ToNumber(y); |
return %NumberSar(x, y); |
} |