Index: src/ia32/code-stubs-ia32.cc |
diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc |
index 941bb32affdfcc7dd5b0fc87829bf46d8429eb81..7f0f9ccd10886018f7449484f1e7478a728c8f9e 100644 |
--- a/src/ia32/code-stubs-ia32.cc |
+++ b/src/ia32/code-stubs-ia32.cc |
@@ -168,15 +168,21 @@ static void InitializeArrayConstructorDescriptor( |
// eax -- number of arguments |
// edi -- function |
// ebx -- type info cell with elements kind |
- static Register registers[] = { edi, ebx }; |
- descriptor->register_param_count_ = 2; |
+ static Register registers_variable_args[] = { edi, ebx, eax }; |
+ static Register registers_no_args[] = { edi, ebx }; |
- if (constant_stack_parameter_count != 0) { |
+ if (constant_stack_parameter_count == 0) { |
+ descriptor->register_param_count_ = 2; |
+ descriptor->register_params_ = registers_no_args; |
+ } else { |
// stack param count needs (constructor pointer, and single argument) |
+ descriptor->handler_arguments_mode_ = PASS_ARGUMENTS; |
descriptor->stack_parameter_count_ = eax; |
+ descriptor->register_param_count_ = 3; |
+ descriptor->register_params_ = registers_variable_args; |
} |
+ |
descriptor->hint_stack_parameter_count_ = constant_stack_parameter_count; |
- descriptor->register_params_ = registers; |
descriptor->function_mode_ = JS_FUNCTION_STUB_MODE; |
descriptor->deoptimization_handler_ = |
Runtime::FunctionForId(Runtime::kArrayConstructor)->entry; |
@@ -190,15 +196,21 @@ static void InitializeInternalArrayConstructorDescriptor( |
// register state |
// eax -- number of arguments |
// edi -- constructor function |
- static Register registers[] = { edi }; |
- descriptor->register_param_count_ = 1; |
+ static Register registers_variable_args[] = { edi, eax }; |
+ static Register registers_no_args[] = { edi }; |
- if (constant_stack_parameter_count != 0) { |
+ if (constant_stack_parameter_count == 0) { |
+ descriptor->register_param_count_ = 1; |
+ descriptor->register_params_ = registers_no_args; |
+ } else { |
// stack param count needs (constructor pointer, and single argument) |
+ descriptor->handler_arguments_mode_ = PASS_ARGUMENTS; |
descriptor->stack_parameter_count_ = eax; |
+ descriptor->register_param_count_ = 2; |
+ descriptor->register_params_ = registers_variable_args; |
} |
+ |
descriptor->hint_stack_parameter_count_ = constant_stack_parameter_count; |
- descriptor->register_params_ = registers; |
descriptor->function_mode_ = JS_FUNCTION_STUB_MODE; |
descriptor->deoptimization_handler_ = |
Runtime::FunctionForId(Runtime::kInternalArrayConstructor)->entry; |
@@ -5926,7 +5938,7 @@ void InternalArrayConstructorStub::GenerateCase( |
__ TailCallStub(&stub0); |
__ bind(¬_zero_case); |
- __ cmp(eax, 1); |
+ __ cmp(eax, Immediate(1)); |
__ j(greater, ¬_one_case); |
if (IsFastPackedElementsKind(kind)) { |
@@ -5959,7 +5971,6 @@ void InternalArrayConstructorStub::Generate(MacroAssembler* masm) { |
// -- esp[0] : return address |
// -- esp[4] : last argument |
// ----------------------------------- |
- |
if (FLAG_debug_code) { |
// The array construct code is only set for the global and natives |
// builtin Array functions which always have maps. |