Index: src/mips/builtins-mips.cc |
diff --git a/src/mips/builtins-mips.cc b/src/mips/builtins-mips.cc |
index f32b779578fa906d105b9f56259e82c17db9c0e9..f6365f3a80309432c77ea4db2013797540f769ba 100644 |
--- a/src/mips/builtins-mips.cc |
+++ b/src/mips/builtins-mips.cc |
@@ -555,34 +555,62 @@ void Builtins::Generate_ArrayConstructCode(MacroAssembler* masm) { |
// ----------- S t a t e ------------- |
// -- a0 : number of arguments |
// -- a1 : constructor function |
+ // -- a2 : type info cell |
// -- ra : return address |
// -- sp[...]: constructor arguments |
// ----------------------------------- |
- Label generic_constructor; |
if (FLAG_debug_code) { |
// The array construct code is only set for the builtin and internal |
// Array functions which always have a map. |
// Initial map for the builtin Array function should be a map. |
- __ lw(a2, FieldMemOperand(a1, JSFunction::kPrototypeOrInitialMapOffset)); |
- __ And(t0, a2, Operand(kSmiTagMask)); |
+ __ lw(a3, FieldMemOperand(a1, JSFunction::kPrototypeOrInitialMapOffset)); |
+ __ And(t0, a3, Operand(kSmiTagMask)); |
__ Assert(ne, "Unexpected initial map for Array function (3)", |
t0, Operand(zero_reg)); |
- __ GetObjectType(a2, a3, t0); |
+ __ GetObjectType(a1, a3, t0); |
__ Assert(eq, "Unexpected initial map for Array function (4)", |
t0, Operand(MAP_TYPE)); |
+ |
+ // We should either have undefined in a2 or a valid jsglobalpropertycell |
+ Label okay_here; |
+ Handle<Object> undefined_sentinel( |
+ masm->isolate()->heap()->undefined_value(), masm->isolate()); |
+ Handle<Map> global_property_cell_map( |
+ masm->isolate()->heap()->global_property_cell_map()); |
+ __ Branch(&okay_here, eq, a2, Operand(undefined_sentinel)); |
+ __ lw(a3, FieldMemOperand(a2, 0)); |
+ __ Assert(eq, "Expected property cell in register a3", |
+ a3, Operand(global_property_cell_map)); |
+ __ bind(&okay_here); |
} |
- // Run the native code for the Array function called as a constructor. |
- ArrayNativeCode(masm, &generic_constructor); |
+ if (FLAG_optimize_constructed_arrays) { |
+ Label not_zero_case, not_one_case; |
+ __ Branch(¬_zero_case, ne, a0, Operand(zero_reg)); |
+ ArrayNoArgumentConstructorStub no_argument_stub; |
+ __ TailCallStub(&no_argument_stub); |
- // Jump to the generic construct code in case the specialized code cannot |
- // handle the construction. |
- __ bind(&generic_constructor); |
+ __ bind(¬_zero_case); |
+ __ Branch(¬_one_case, gt, a0, Operand(1)); |
+ ArraySingleArgumentConstructorStub single_argument_stub; |
+ __ TailCallStub(&single_argument_stub); |
- Handle<Code> generic_construct_stub = |
- masm->isolate()->builtins()->JSConstructStubGeneric(); |
- __ Jump(generic_construct_stub, RelocInfo::CODE_TARGET); |
+ __ bind(¬_one_case); |
+ ArrayNArgumentsConstructorStub n_argument_stub; |
+ __ TailCallStub(&n_argument_stub); |
+ } else { |
+ Label generic_constructor; |
+ // Run the native code for the Array function called as a constructor. |
+ ArrayNativeCode(masm, &generic_constructor); |
+ |
+ // Jump to the generic construct code in case the specialized code cannot |
+ // handle the construction. |
+ __ bind(&generic_constructor); |
+ Handle<Code> generic_construct_stub = |
+ masm->isolate()->builtins()->JSConstructStubGeneric(); |
+ __ Jump(generic_construct_stub, RelocInfo::CODE_TARGET); |
+ } |
} |
@@ -1171,6 +1199,10 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, |
// Invoke the code and pass argc as a0. |
__ mov(a0, a3); |
if (is_construct) { |
+ // No type feedback cell is available |
+ Handle<Object> undefined_sentinel( |
+ masm->isolate()->heap()->undefined_value(), masm->isolate()); |
+ __ li(a2, Operand(undefined_sentinel)); |
CallConstructStub stub(NO_CALL_FUNCTION_FLAGS); |
__ CallStub(&stub); |
} else { |