Make sure to invoke valueOf methods on both operands of & and >> -- even
when the left operand lets us shortcut the computation. Review URL: http://codereview.chromium.org/125176 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2179 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
7358e1980c
commit
991ec9a777
@ -224,14 +224,19 @@ function BIT_AND(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 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 @@ function SAR(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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user