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);
}
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);
}