Index: src/ia32/builtins-ia32.cc |
=================================================================== |
--- src/ia32/builtins-ia32.cc (revision 1828) |
+++ src/ia32/builtins-ia32.cc (working copy) |
@@ -54,6 +54,14 @@ |
// -- edi: constructor function |
// ----------------------------------- |
+ Label non_function_call; |
+ // Check that function is not a smi. |
+ __ test(edi, Immediate(kSmiTagMask)); |
+ __ j(zero, &non_function_call); |
+ // Check that function is a JSFunction. |
+ __ CmpObjectType(edi, JS_FUNCTION_TYPE, ecx); |
+ __ j(not_equal, &non_function_call); |
+ |
// Enter a construct frame. |
__ EnterConstructFrame(); |
@@ -75,12 +83,6 @@ |
__ cmp(Operand::StaticVariable(debug_step_in_fp), Immediate(0)); |
__ j(not_equal, &rt_call); |
#endif |
- // Check that function is not a Smi. |
- __ test(edi, Immediate(kSmiTagMask)); |
- __ j(zero, &rt_call); |
- // Check that function is a JSFunction |
- __ CmpObjectType(edi, JS_FUNCTION_TYPE, eax); |
- __ j(not_equal, &rt_call); |
// Verified that the constructor is a JSFunction. |
// Load the initial map and verify that it is in fact a map. |
@@ -302,6 +304,16 @@ |
__ lea(esp, Operand(esp, ebx, times_2, 1 * kPointerSize)); // 1 ~ receiver |
__ push(ecx); |
__ ret(0); |
+ |
+ // edi: called object |
+ // eax: number of arguments |
+ __ bind(&non_function_call); |
+ |
+ // Set expected number of arguments to zero (not changing eax). |
+ __ Set(ebx, Immediate(0)); |
+ __ GetBuiltinEntry(edx, Builtins::CALL_NON_FUNCTION); |
+ __ jmp(Handle<Code>(builtin(ArgumentsAdaptorTrampoline)), |
+ RelocInfo::CODE_TARGET); |
} |