Reviewers: Mads Ager, Message: ARM platform is OK, function calls are OK, ArgumentsAdapter is OK.
Description: Fix a bug that occurs when functions are defined with more than 16,382 parameters. Please review this at http://codereview.chromium.org/6447007/ SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/ Affected files: M src/ia32/codegen-ia32.cc M src/ia32/full-codegen-ia32.cc M src/x64/codegen-x64.cc M src/x64/full-codegen-x64.cc Index: src/ia32/codegen-ia32.cc =================================================================== --- src/ia32/codegen-ia32.cc (revision 6683) +++ src/ia32/codegen-ia32.cc (working copy) @@ -3771,14 +3771,22 @@ // Leave the frame and return popping the arguments and the // receiver. frame_->Exit(); - masm_->ret((scope()->num_parameters() + 1) * kPointerSize); + int arguments_bytes = (scope()->num_parameters() + 1) * kPointerSize; + if (is_uint16(arguments_bytes)) { + __ ret(arguments_bytes); + } else { + __ pop(ecx); + __ add(Operand(esp), Immediate(arguments_bytes)); + __ push(ecx); + __ ret(0); + } DeleteFrame(); #ifdef ENABLE_DEBUGGER_SUPPORT // Check that the size of the code used for returning matches what is // expected by the debugger. - ASSERT_EQ(Assembler::kJSReturnSequenceLength, - masm_->SizeOfCodeGeneratedSince(&check_exit_codesize)); + ASSERT(Assembler::kJSReturnSequenceLength <= + masm_->SizeOfCodeGeneratedSince(&check_exit_codesize)); #endif } Index: src/ia32/full-codegen-ia32.cc =================================================================== --- src/ia32/full-codegen-ia32.cc (revision 6683) +++ src/ia32/full-codegen-ia32.cc (working copy) @@ -310,12 +310,21 @@ // patch with the code required by the debugger. __ mov(esp, ebp); __ pop(ebp); - __ ret((scope()->num_parameters() + 1) * kPointerSize); + + int arguments_bytes = (scope()->num_parameters() + 1) * kPointerSize; + if (is_uint16(arguments_bytes)) { + __ ret(arguments_bytes); + } else { + __ pop(ecx); + __ add(Operand(esp), Immediate(arguments_bytes)); + __ push(ecx); + __ ret(0); + } #ifdef ENABLE_DEBUGGER_SUPPORT // Check that the size of the code used for returning matches what is // expected by the debugger. - ASSERT_EQ(Assembler::kJSReturnSequenceLength, - masm_->SizeOfCodeGeneratedSince(&check_exit_codesize)); + ASSERT(Assembler::kJSReturnSequenceLength <= + masm_->SizeOfCodeGeneratedSince(&check_exit_codesize)); #endif } } Index: src/x64/codegen-x64.cc =================================================================== --- src/x64/codegen-x64.cc (revision 6683) +++ src/x64/codegen-x64.cc (working copy) @@ -2993,7 +2993,15 @@ // Leave the frame and return popping the arguments and the // receiver. frame_->Exit(); - masm_->ret((scope()->num_parameters() + 1) * kPointerSize); + int arguments_bytes = (scope()->num_parameters() + 1) * kPointerSize; + if (is_uint16(arguments_bytes)) { + __ ret(arguments_bytes); + } else { + __ pop(rcx); + __ addq(rsp, Immediate(arguments_bytes)); + __ push(rcx); + __ ret(0); + } DeleteFrame(); #ifdef ENABLE_DEBUGGER_SUPPORT @@ -3006,8 +3014,8 @@ } // Check that the size of the code used for returning matches what is // expected by the debugger. - ASSERT_EQ(Assembler::kJSReturnSequenceLength, - masm_->SizeOfCodeGeneratedSince(&check_exit_codesize)); + ASSERT(Assembler::kJSReturnSequenceLength <= + masm_->SizeOfCodeGeneratedSince(&check_exit_codesize)); #endif } Index: src/x64/full-codegen-x64.cc =================================================================== --- src/x64/full-codegen-x64.cc (revision 6683) +++ src/x64/full-codegen-x64.cc (working copy) @@ -297,7 +297,17 @@ // patch with the code required by the debugger. __ movq(rsp, rbp); __ pop(rbp); - __ ret((scope()->num_parameters() + 1) * kPointerSize); + + int arguments_bytes = (scope()->num_parameters() + 1) * kPointerSize; + if (is_uint16(arguments_bytes)) { + __ ret(arguments_bytes); + } else { + __ pop(rcx); + __ addq(rsp, Immediate(arguments_bytes)); + __ push(rcx); + __ ret(0); + } + #ifdef ENABLE_DEBUGGER_SUPPORT // Add padding that will be overwritten by a debugger breakpoint. We // have just generated "movq rsp, rbp; pop rbp; ret k" with length 7 @@ -308,8 +318,8 @@ } // Check that the size of the code used for returning matches what is // expected by the debugger. - ASSERT_EQ(Assembler::kJSReturnSequenceLength, - masm_->SizeOfCodeGeneratedSince(&check_exit_codesize)); + ASSERT(Assembler::kJSReturnSequenceLength <= + masm_->SizeOfCodeGeneratedSince(&check_exit_codesize)); #endif } } -- v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev
