Reviewers: Mads Ager, Message: Hi Mads,
This is the same patch as http://codereview.chromium.org/60035 I lost the old client, and have to recreate the patch. Description: Redo patch http://codereview.chromium.org/60035 I lost the old client. Please review this at http://codereview.chromium.org/100243 SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/ Affected files: M src/ia32/builtins-ia32.cc M test/cctest/test-api.cc Index: test/cctest/test-api.cc =================================================================== --- test/cctest/test-api.cc (revision 1828) +++ test/cctest/test-api.cc (working copy) @@ -4656,11 +4656,6 @@ value = Script::Compile(v8_str(call_17))->Run(); CHECK(!try_catch.HasCaught()); CHECK_EQ(17, value->Int32Value()); - - // Try something that will cause an exception: Call the object as a - // constructor. This should be the last test. - value = Script::Compile(v8_str("new obj(42)"))->Run(); - CHECK(try_catch.HasCaught()); } 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); } --~--~---------~--~----~------------~-------~--~----~ v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev -~----------~----~----~----~------~----~------~--~---
