Reviewers: Kasper Lund, Description: Merge change that allows the API call-as-function handlers on non-functions to be called using new to 1.1 branch.
Please review this at http://codereview.chromium.org/108008 SVN Base: http://v8.googlecode.com/svn/branches/1.1/ Affected files: M src/builtins-ia32.cc M test/cctest/test-api.cc Index: test/cctest/test-api.cc =================================================================== --- test/cctest/test-api.cc (revision 1851) +++ test/cctest/test-api.cc (working copy) @@ -4608,11 +4608,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/builtins-ia32.cc =================================================================== --- src/builtins-ia32.cc (revision 1851) +++ src/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(); @@ -73,12 +81,6 @@ ExternalReference::debug_step_in_fp_address(); __ cmp(Operand::StaticVariable(debug_step_in_fp), Immediate(0)); __ j(not_equal, &rt_call); - // 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. @@ -300,6 +302,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 -~----------~----~----~----~------~----~------~--~---
