Chromium Code Reviews| Index: src/ia32/builtins-ia32.cc |
| =================================================================== |
| --- src/ia32/builtins-ia32.cc (revision 7676) |
| +++ src/ia32/builtins-ia32.cc (working copy) |
| @@ -599,6 +599,15 @@ |
| 1 << SharedFunctionInfo::kStrictModeBitWithinByte); |
| __ j(not_equal, &shift_arguments); |
| + // Do not transform the receiver for natives (shared already in ebx). |
| + __ mov(ebx, FieldOperand(ebx, SharedFunctionInfo::kScriptOffset)); |
| + __ cmp(ebx, factory->undefined_value()); |
| + __ j(equal, &shift_arguments); |
| + __ mov(ebx, FieldOperand(ebx, Script::kTypeOffset)); |
| + __ SmiUntag(ebx); |
| + __ cmp(ebx, Script::TYPE_NATIVE); |
|
Rico
2011/04/28 05:57:59
We could just test ebx without untagging here, sin
|
| + __ j(equal, &shift_arguments); |
| + |
| // Compute the receiver in non-strict mode. |
| __ mov(ebx, Operand(esp, eax, times_4, 0)); // First argument. |
| __ test(ebx, Immediate(kSmiTagMask)); |
| @@ -755,10 +764,20 @@ |
| 1 << SharedFunctionInfo::kStrictModeBitWithinByte); |
| __ j(not_equal, &push_receiver); |
| + Factory* factory = masm->isolate()->factory(); |
| + |
| + // Do not transform the receiver for natives (shared already in ecx). |
| + __ mov(ecx, FieldOperand(ecx, SharedFunctionInfo::kScriptOffset)); |
| + __ cmp(ecx, factory->undefined_value()); |
| + __ j(equal, &push_receiver); |
| + __ mov(ecx, FieldOperand(ecx, Script::kTypeOffset)); |
| + __ SmiUntag(ecx); |
| + __ cmp(ecx, Script::TYPE_NATIVE); |
| + __ j(equal, &push_receiver); |
| + |
| // Compute the receiver in non-strict mode. |
| __ test(ebx, Immediate(kSmiTagMask)); |
| __ j(zero, &call_to_object); |
| - Factory* factory = masm->isolate()->factory(); |
| __ cmp(ebx, factory->null_value()); |
| __ j(equal, &use_global_receiver); |
| __ cmp(ebx, factory->undefined_value()); |