Index: src/x64/code-stubs-x64.cc |
diff --git a/src/x64/code-stubs-x64.cc b/src/x64/code-stubs-x64.cc |
index 779e77edc0dc2120eb2d78bee3cf68481f37a784..0f7230963eb8da4097c57fdf3aaad1ce46ae8717 100644 |
--- a/src/x64/code-stubs-x64.cc |
+++ b/src/x64/code-stubs-x64.cc |
@@ -2211,6 +2211,10 @@ void CallFunctionStub::Generate(MacroAssembler* masm) { |
if (RecordCallTarget()) { |
GenerateRecordCallTarget(masm); |
+ // Type information was updated. Because we may call Array, which |
+ // expects either undefined or an AllocationSite in rbx we need |
+ // to set rbx to undefined. |
+ __ LoadRoot(rbx, Heap::kUndefinedValueRootIndex); |
} |
} |
@@ -2319,7 +2323,17 @@ void CallConstructStub::Generate(MacroAssembler* masm) { |
__ j(not_equal, &slow); |
if (RecordCallTarget()) { |
+ Label feedback_register_initialized; |
GenerateRecordCallTarget(masm); |
+ // Put the AllocationSite from the feedback vector into rbx, or undefined. |
+ __ SmiToInteger32(rdx, rdx); |
+ __ movp(rbx, FieldOperand(rbx, rdx, times_pointer_size, |
+ FixedArray::kHeaderSize)); |
+ __ CompareRoot(FieldOperand(rbx, 0), Heap::kAllocationSiteMapRootIndex); |
+ __ j(equal, &feedback_register_initialized); |
+ __ LoadRoot(rbx, Heap::kUndefinedValueRootIndex); |
+ __ bind(&feedback_register_initialized); |
+ __ AssertUndefinedOrAllocationSite(rbx); |
} |
// Jump to the function-specific construct stub. |
@@ -4924,15 +4938,11 @@ void ArrayConstructorStub::GenerateDispatchToArrayStub( |
void ArrayConstructorStub::Generate(MacroAssembler* masm) { |
// ----------- S t a t e ------------- |
// -- rax : argc |
- // -- rbx : feedback vector (fixed array or megamorphic symbol) |
- // -- rdx : slot index (if ebx is fixed array) |
+ // -- rbx : AllocationSite or undefined |
// -- rdi : constructor |
// -- rsp[0] : return address |
// -- rsp[8] : last argument |
// ----------------------------------- |
- Handle<Object> megamorphic_sentinel = |
- TypeFeedbackInfo::MegamorphicSentinel(masm->isolate()); |
- |
if (FLAG_debug_code) { |
// The array construct code is only set for the global and natives |
// builtin Array functions which always have maps. |
@@ -4946,34 +4956,16 @@ void ArrayConstructorStub::Generate(MacroAssembler* masm) { |
__ CmpObjectType(rcx, MAP_TYPE, rcx); |
__ Check(equal, kUnexpectedInitialMapForArrayFunction); |
- // We should either have the megamorphic symbol in rbx or a valid |
- // fixed array. |
- Label okay_here; |
- Handle<Map> fixed_array_map = masm->isolate()->factory()->fixed_array_map(); |
- __ Cmp(rbx, megamorphic_sentinel); |
- __ j(equal, &okay_here); |
- __ Cmp(FieldOperand(rbx, 0), fixed_array_map); |
- __ Assert(equal, kExpectedFixedArrayInRegisterRbx); |
- |
- // rdx should be a smi if we don't have the megamorphic symbol in rbx. |
- __ AssertSmi(rdx); |
- |
- __ bind(&okay_here); |
+ // We should either have undefined in rbx or a valid AllocationSite |
+ __ AssertUndefinedOrAllocationSite(rbx); |
} |
Label no_info; |
// If the feedback slot is the megamorphic sentinel, or contains anything |
// other than an AllocationSite, call an array constructor that doesn't use |
// AllocationSites. |
- __ Cmp(rbx, megamorphic_sentinel); |
+ __ CompareRoot(rbx, Heap::kUndefinedValueRootIndex); |
__ j(equal, &no_info); |
- __ SmiToInteger32(rdx, rdx); |
- __ movp(rbx, FieldOperand(rbx, rdx, times_pointer_size, |
- FixedArray::kHeaderSize)); |
- __ Integer32ToSmi(rdx, rdx); |
- __ Cmp(FieldOperand(rbx, 0), |
- masm->isolate()->factory()->allocation_site_map()); |
- __ j(not_equal, &no_info); |
// Only look at the lower 16 bits of the transition info. |
__ movp(rdx, FieldOperand(rbx, AllocationSite::kTransitionInfoOffset)); |