Index: src/code-stubs.cc |
diff --git a/src/code-stubs.cc b/src/code-stubs.cc |
index b1b6cb7eb42c7f9a29a2641b43bb4d252920f65f..bb593d6e6ead79ae8f6656b0a5032eee5bb6dec4 100644 |
--- a/src/code-stubs.cc |
+++ b/src/code-stubs.cc |
@@ -4120,9 +4120,6 @@ void FastCloneShallowArrayStub::InitializeDescriptor( |
} |
-void CreateAllocationSiteStub::InitializeDescriptor(CodeStubDescriptor* d) {} |
- |
- |
void CreateWeakCellStub::InitializeDescriptor(CodeStubDescriptor* d) {} |
@@ -4706,6 +4703,65 @@ void ProfileEntryHookStub::EntryHookTrampoline(intptr_t function, |
entry_hook(function, stack_pointer); |
} |
+void CreateAllocationSiteStub::GenerateAssembly( |
+ CodeStubAssembler* assembler) const { |
+ typedef compiler::Node Node; |
+ Node* size = assembler->IntPtrConstant(AllocationSite::kSize); |
+ Node* site = assembler->Allocate(size, compiler::CodeAssembler::kPretenured); |
+ |
+ // Store the map |
+ Node* map = |
+ assembler->HeapConstant(isolate()->factory()->allocation_site_map()); |
+ assembler->StoreMapNoWriteBarrier(site, map); |
+ |
+ Node* kind = |
+ assembler->SmiConstant(Smi::FromInt(GetInitialFastElementsKind())); |
+ assembler->StoreObjectFieldNoWriteBarrier( |
+ site, AllocationSite::kTransitionInfoOffset, kind); |
+ |
+ // Unlike literals, constructed arrays don't have nested sites |
+ Node* zero = assembler->IntPtrConstant(0); |
+ assembler->StoreObjectFieldNoWriteBarrier( |
+ site, AllocationSite::kNestedSiteOffset, zero); |
+ |
+ // Pretenuring calculation field. |
+ assembler->StoreObjectFieldNoWriteBarrier( |
+ site, AllocationSite::kPretenureDataOffset, zero); |
+ |
+ // Pretenuring memento creation count field. |
+ assembler->StoreObjectFieldNoWriteBarrier( |
+ site, AllocationSite::kPretenureCreateCountOffset, zero); |
+ |
+ // Store an empty fixed array for the code dependency. |
+ Node* empty_fixed_array = |
+ assembler->HeapConstant(isolate()->factory()->empty_fixed_array()); |
+ assembler->StoreObjectFieldNoWriteBarrier( |
+ site, AllocationSite::kDependentCodeOffset, empty_fixed_array); |
+ |
+ // Link the object to the allocation site list |
+ Node* site_list = assembler->ExternalConstant( |
+ ExternalReference::allocation_sites_list_address(isolate())); |
+ Node* next_site = assembler->LoadBufferObject(site_list, 0); |
+ |
+ // TODO(mvstanton): This is a store to a weak pointer, which we may want to |
+ // mark as such in order to skip the write barrier, once we have a unified |
+ // system for weakness. For now we decided to keep it like this because having |
+ // an initial write barrier backed store makes this pointer strong until the |
+ // next GC, and allocation sites are designed to survive several GCs anyway. |
+ assembler->StoreObjectField(site, AllocationSite::kWeakNextOffset, next_site); |
+ assembler->StoreNoWriteBarrier(MachineRepresentation::kTagged, site_list, |
+ site); |
+ |
+ Node* feedback_vector = assembler->Parameter(Descriptor::kVector); |
+ Node* slot = assembler->Parameter(Descriptor::kSlot); |
+ |
+ assembler->StoreFixedArrayElement(feedback_vector, slot, site, |
+ UPDATE_WRITE_BARRIER, |
+ CodeStubAssembler::SMI_PARAMETERS); |
+ |
+ assembler->Return(site); |
+} |
+ |
void ArrayNoArgumentConstructorStub::GenerateAssembly( |
CodeStubAssembler* assembler) const { |
typedef compiler::Node Node; |