Reviewers: Mads Ager, Description: Make sure to invoke valueOf methods on both operands of & and >> -- even when the left operand lets us shortcut the computation.
Please review this at http://codereview.chromium.org/125176 SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/ Affected files: M src/runtime.js 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); } --~--~---------~--~----~------------~-------~--~----~ v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev -~----------~----~----~----~------~----~------~--~---
