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

Reply via email to