Index: src/x64/builtins-x64.cc |
diff --git a/src/x64/builtins-x64.cc b/src/x64/builtins-x64.cc |
index 52c81e27731583b592b435bc1cfc7ca7917630bf..67c19f7b9b3adde06d3aa92ff602b34317b2b069 100644 |
--- a/src/x64/builtins-x64.cc |
+++ b/src/x64/builtins-x64.cc |
@@ -523,6 +523,10 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, |
// Invoke the code. |
if (is_construct) { |
+ // No type feedback cell is available |
+ Handle<Object> undefined_sentinel( |
+ masm->isolate()->factory()->undefined_value()); |
+ __ Move(rbx, undefined_sentinel); |
// Expects rdi to hold function pointer. |
CallConstructStub stub(NO_CALL_FUNCTION_FLAGS); |
__ CallStub(&stub); |
@@ -1503,21 +1507,85 @@ void Builtins::Generate_ArrayConstructCode(MacroAssembler* masm) { |
// -- rsp[0] : return address |
// -- rsp[8] : last argument |
// ----------------------------------- |
- 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. |
+ __ movq(rcx, FieldOperand(rdi, JSFunction::kPrototypeOrInitialMapOffset)); |
+ // Will both indicate a NULL and a Smi. |
+ STATIC_ASSERT(kSmiTag == 0); |
+ Condition not_smi = NegateCondition(masm->CheckSmi(rcx)); |
+ __ Check(not_smi, "Unexpected initial map for Array function"); |
+ __ CmpObjectType(rcx, MAP_TYPE, rcx); |
+ __ Check(equal, "Unexpected initial map for Array function"); |
+ |
+ // We should either have undefined in ebx or a valid jsglobalpropertycell |
+ Label okay_here; |
+ Handle<Object> undefined_sentinel( |
+ masm->isolate()->factory()->undefined_value()); |
+ Handle<Map> global_property_cell_map( |
+ masm->isolate()->heap()->global_property_cell_map()); |
+ __ Cmp(rbx, undefined_sentinel); |
+ __ j(equal, &okay_here); |
+ __ Cmp(FieldOperand(rbx, 0), global_property_cell_map); |
+ __ Assert(equal, "Expected property cell in register rbx"); |
+ __ bind(&okay_here); |
+ } |
+ |
+ if (FLAG_optimize_constructed_arrays) { |
+ Label not_zero_case, not_one_case; |
+ __ testq(rax, rax); |
+ __ j(not_zero, ¬_zero_case); |
+ ArrayNoArgumentConstructorStub no_argument_stub; |
+ __ TailCallStub(&no_argument_stub); |
+ |
+ __ bind(¬_zero_case); |
+ __ cmpq(rax, Immediate(1)); |
+ __ j(greater, ¬_one_case); |
+ ArraySingleArgumentConstructorStub single_argument_stub; |
+ __ TailCallStub(&single_argument_stub); |
+ |
+ __ 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 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); |
+ } |
+} |
+ |
+ |
+void Builtins::Generate_InternalArrayConstructCode(MacroAssembler* masm) { |
+ // ----------- S t a t e ------------- |
+ // -- rax : argc |
+ // -- rdi : constructor |
+ // -- rsp[0] : return address |
+ // -- rsp[8] : last argument |
+ // ----------------------------------- |
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. |
- __ movq(rbx, FieldOperand(rdi, JSFunction::kPrototypeOrInitialMapOffset)); |
+ __ movq(rcx, FieldOperand(rdi, JSFunction::kPrototypeOrInitialMapOffset)); |
// Will both indicate a NULL and a Smi. |
STATIC_ASSERT(kSmiTag == 0); |
- Condition not_smi = NegateCondition(masm->CheckSmi(rbx)); |
+ Condition not_smi = NegateCondition(masm->CheckSmi(rcx)); |
__ Check(not_smi, "Unexpected initial map for Array function"); |
- __ CmpObjectType(rbx, MAP_TYPE, rcx); |
+ __ CmpObjectType(rcx, MAP_TYPE, rcx); |
__ Check(equal, "Unexpected initial map for Array function"); |
} |
+ Label generic_constructor; |
// Run the native code for the Array function called as constructor. |
ArrayNativeCode(masm, &generic_constructor); |