| Index: src/code-stub-assembler.cc
|
| diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc
|
| index 409201bf4456f0a57a222f64d49ae32639ee7fd5..636de8998dd609762d5c965b450358290984019a 100644
|
| --- a/src/code-stub-assembler.cc
|
| +++ b/src/code-stub-assembler.cc
|
| @@ -1324,6 +1324,7 @@ Node* CodeStubAssembler::StoreHeapNumberValue(Node* object, Node* value) {
|
|
|
| Node* CodeStubAssembler::StoreObjectField(
|
| Node* object, int offset, Node* value) {
|
| + DCHECK_NE(HeapObject::kMapOffset, offset); // Use StoreMap instead.
|
| return Store(object, IntPtrConstant(offset - kHeapObjectTag), value);
|
| }
|
|
|
| @@ -1353,10 +1354,22 @@ Node* CodeStubAssembler::StoreObjectFieldNoWriteBarrier(
|
| rep, object, IntPtrSub(offset, IntPtrConstant(kHeapObjectTag)), value);
|
| }
|
|
|
| +Node* CodeStubAssembler::StoreMap(Node* object, Node* map) {
|
| + CSA_SLOW_ASSERT(this, IsMap(map));
|
| + return StoreWithMapWriteBarrier(
|
| + object, IntPtrConstant(HeapObject::kMapOffset - kHeapObjectTag), map);
|
| +}
|
| +
|
| +Node* CodeStubAssembler::StoreMapNoWriteBarrier(
|
| + Node* object, Heap::RootListIndex map_root_index) {
|
| + return StoreMapNoWriteBarrier(object, LoadRoot(map_root_index));
|
| +}
|
| +
|
| Node* CodeStubAssembler::StoreMapNoWriteBarrier(Node* object, Node* map) {
|
| + CSA_SLOW_ASSERT(this, IsMap(map));
|
| return StoreNoWriteBarrier(
|
| MachineRepresentation::kTagged, object,
|
| - IntPtrConstant(HeapNumber::kMapOffset - kHeapObjectTag), map);
|
| + IntPtrConstant(HeapObject::kMapOffset - kHeapObjectTag), map);
|
| }
|
|
|
| Node* CodeStubAssembler::StoreObjectFieldRoot(Node* object, int offset,
|
| @@ -1475,8 +1488,7 @@ Node* CodeStubAssembler::AllocateHeapNumber(MutableMode mode) {
|
| Heap::RootListIndex heap_map_index =
|
| mode == IMMUTABLE ? Heap::kHeapNumberMapRootIndex
|
| : Heap::kMutableHeapNumberMapRootIndex;
|
| - Node* map = LoadRoot(heap_map_index);
|
| - StoreMapNoWriteBarrier(result, map);
|
| + StoreMapNoWriteBarrier(result, heap_map_index);
|
| return result;
|
| }
|
|
|
| @@ -1492,7 +1504,7 @@ Node* CodeStubAssembler::AllocateSeqOneByteString(int length,
|
| Comment("AllocateSeqOneByteString");
|
| Node* result = Allocate(SeqOneByteString::SizeFor(length), flags);
|
| DCHECK(Heap::RootIsImmortalImmovable(Heap::kOneByteStringMapRootIndex));
|
| - StoreMapNoWriteBarrier(result, LoadRoot(Heap::kOneByteStringMapRootIndex));
|
| + StoreMapNoWriteBarrier(result, Heap::kOneByteStringMapRootIndex);
|
| StoreObjectFieldNoWriteBarrier(result, SeqOneByteString::kLengthOffset,
|
| SmiConstant(Smi::FromInt(length)));
|
| StoreObjectFieldNoWriteBarrier(result, SeqOneByteString::kHashFieldOffset,
|
| @@ -1522,7 +1534,7 @@ Node* CodeStubAssembler::AllocateSeqOneByteString(Node* context, Node* length,
|
| // Just allocate the SeqOneByteString in new space.
|
| Node* result = Allocate(size, flags);
|
| DCHECK(Heap::RootIsImmortalImmovable(Heap::kOneByteStringMapRootIndex));
|
| - StoreMapNoWriteBarrier(result, LoadRoot(Heap::kOneByteStringMapRootIndex));
|
| + StoreMapNoWriteBarrier(result, Heap::kOneByteStringMapRootIndex);
|
| StoreObjectFieldNoWriteBarrier(
|
| result, SeqOneByteString::kLengthOffset,
|
| mode == SMI_PARAMETERS ? length : SmiFromWord(length));
|
| @@ -1552,7 +1564,7 @@ Node* CodeStubAssembler::AllocateSeqTwoByteString(int length,
|
| Comment("AllocateSeqTwoByteString");
|
| Node* result = Allocate(SeqTwoByteString::SizeFor(length), flags);
|
| DCHECK(Heap::RootIsImmortalImmovable(Heap::kStringMapRootIndex));
|
| - StoreMapNoWriteBarrier(result, LoadRoot(Heap::kStringMapRootIndex));
|
| + StoreMapNoWriteBarrier(result, Heap::kStringMapRootIndex);
|
| StoreObjectFieldNoWriteBarrier(result, SeqTwoByteString::kLengthOffset,
|
| SmiConstant(Smi::FromInt(length)));
|
| StoreObjectFieldNoWriteBarrier(result, SeqTwoByteString::kHashFieldOffset,
|
| @@ -1582,7 +1594,7 @@ Node* CodeStubAssembler::AllocateSeqTwoByteString(Node* context, Node* length,
|
| // Just allocate the SeqTwoByteString in new space.
|
| Node* result = Allocate(size, flags);
|
| DCHECK(Heap::RootIsImmortalImmovable(Heap::kStringMapRootIndex));
|
| - StoreMapNoWriteBarrier(result, LoadRoot(Heap::kStringMapRootIndex));
|
| + StoreMapNoWriteBarrier(result, Heap::kStringMapRootIndex);
|
| StoreObjectFieldNoWriteBarrier(
|
| result, SeqTwoByteString::kLengthOffset,
|
| mode == SMI_PARAMETERS ? length : SmiFromWord(length));
|
| @@ -1612,9 +1624,8 @@ Node* CodeStubAssembler::AllocateSlicedString(
|
| Node* offset) {
|
| CSA_ASSERT(this, TaggedIsSmi(length));
|
| Node* result = Allocate(SlicedString::kSize);
|
| - Node* map = LoadRoot(map_root_index);
|
| DCHECK(Heap::RootIsImmortalImmovable(map_root_index));
|
| - StoreMapNoWriteBarrier(result, map);
|
| + StoreMapNoWriteBarrier(result, map_root_index);
|
| StoreObjectFieldNoWriteBarrier(result, SlicedString::kLengthOffset, length,
|
| MachineRepresentation::kTagged);
|
| StoreObjectFieldNoWriteBarrier(result, SlicedString::kHashFieldOffset,
|
| @@ -1645,9 +1656,8 @@ Node* CodeStubAssembler::AllocateConsString(Heap::RootListIndex map_root_index,
|
| AllocationFlags flags) {
|
| CSA_ASSERT(this, TaggedIsSmi(length));
|
| Node* result = Allocate(ConsString::kSize, flags);
|
| - Node* map = LoadRoot(map_root_index);
|
| DCHECK(Heap::RootIsImmortalImmovable(map_root_index));
|
| - StoreMapNoWriteBarrier(result, map);
|
| + StoreMapNoWriteBarrier(result, map_root_index);
|
| StoreObjectFieldNoWriteBarrier(result, ConsString::kLengthOffset, length,
|
| MachineRepresentation::kTagged);
|
| StoreObjectFieldNoWriteBarrier(result, ConsString::kHashFieldOffset,
|
| @@ -1798,8 +1808,8 @@ Node* CodeStubAssembler::AllocateNameDictionary(Node* at_least_space_for) {
|
| Node* result = Allocate(store_size);
|
| Comment("Initialize NameDictionary");
|
| // Initialize FixedArray fields.
|
| - StoreObjectFieldRoot(result, FixedArray::kMapOffset,
|
| - Heap::kHashTableMapRootIndex);
|
| + DCHECK(Heap::RootIsImmortalImmovable(Heap::kHashTableMapRootIndex));
|
| + StoreMapNoWriteBarrier(result, Heap::kHashTableMapRootIndex);
|
| StoreObjectFieldNoWriteBarrier(result, FixedArray::kLengthOffset,
|
| SmiFromWord(length));
|
| // Initialized HashTable fields.
|
| @@ -1958,17 +1968,16 @@ Node* CodeStubAssembler::AllocateJSArray(ElementsKind kind, Node* array_map,
|
| Node* capacity, Node* length,
|
| Node* allocation_site,
|
| ParameterMode capacity_mode) {
|
| - bool is_double = IsFastDoubleElementsKind(kind);
|
| -
|
| // Allocate both array and elements object, and initialize the JSArray.
|
| Node *array, *elements;
|
| std::tie(array, elements) = AllocateUninitializedJSArrayWithElements(
|
| kind, array_map, length, allocation_site, capacity, capacity_mode);
|
| // Setup elements object.
|
| - Heap* heap = isolate()->heap();
|
| - Handle<Map> elements_map(is_double ? heap->fixed_double_array_map()
|
| - : heap->fixed_array_map());
|
| - StoreMapNoWriteBarrier(elements, HeapConstant(elements_map));
|
| + Heap::RootListIndex elements_map_index =
|
| + IsFastDoubleElementsKind(kind) ? Heap::kFixedDoubleArrayMapRootIndex
|
| + : Heap::kFixedArrayMapRootIndex;
|
| + DCHECK(Heap::RootIsImmortalImmovable(elements_map_index));
|
| + StoreMapNoWriteBarrier(elements, elements_map_index);
|
| StoreObjectFieldNoWriteBarrier(elements, FixedArray::kLengthOffset,
|
| TagParameter(capacity, capacity_mode));
|
|
|
| @@ -1991,15 +2000,11 @@ Node* CodeStubAssembler::AllocateFixedArray(ElementsKind kind,
|
|
|
| // Allocate both array and elements object, and initialize the JSArray.
|
| Node* array = Allocate(total_size, flags);
|
| - Heap* heap = isolate()->heap();
|
| - Handle<Map> map(IsFastDoubleElementsKind(kind)
|
| - ? heap->fixed_double_array_map()
|
| - : heap->fixed_array_map());
|
| - if (flags & kPretenured) {
|
| - StoreObjectField(array, JSObject::kMapOffset, HeapConstant(map));
|
| - } else {
|
| - StoreMapNoWriteBarrier(array, HeapConstant(map));
|
| - }
|
| + Heap::RootListIndex map_index = IsFastDoubleElementsKind(kind)
|
| + ? Heap::kFixedDoubleArrayMapRootIndex
|
| + : Heap::kFixedArrayMapRootIndex;
|
| + DCHECK(Heap::RootIsImmortalImmovable(map_index));
|
| + StoreMapNoWriteBarrier(array, map_index);
|
| StoreObjectFieldNoWriteBarrier(array, FixedArray::kLengthOffset,
|
| TagParameter(capacity_node, mode));
|
| return array;
|
| @@ -5982,7 +5987,7 @@ void CodeStubAssembler::TransitionElementsKind(Node* object, Node* map,
|
| Bind(&done);
|
| }
|
|
|
| - StoreObjectField(object, JSObject::kMapOffset, map);
|
| + StoreMap(object, map);
|
| }
|
|
|
| void CodeStubAssembler::TrapAllocationMemento(Node* object,
|
| @@ -6122,9 +6127,7 @@ Node* CodeStubAssembler::CreateAllocationSiteInFeedbackVector(
|
| Node* size = IntPtrConstant(AllocationSite::kSize);
|
| Node* site = Allocate(size, CodeStubAssembler::kPretenured);
|
|
|
| - // Store the map
|
| - StoreObjectFieldRoot(site, AllocationSite::kMapOffset,
|
| - Heap::kAllocationSiteMapRootIndex);
|
| + StoreMap(site, LoadRoot(Heap::kAllocationSiteMapRootIndex));
|
| Node* kind = SmiConstant(Smi::FromInt(GetInitialFastElementsKind()));
|
| StoreObjectFieldNoWriteBarrier(site, AllocationSite::kTransitionInfoOffset,
|
| kind);
|
| @@ -6170,7 +6173,8 @@ Node* CodeStubAssembler::CreateWeakCellInFeedbackVector(Node* feedback_vector,
|
| Node* cell = Allocate(size, CodeStubAssembler::kPretenured);
|
|
|
| // Initialize the WeakCell.
|
| - StoreObjectFieldRoot(cell, WeakCell::kMapOffset, Heap::kWeakCellMapRootIndex);
|
| + DCHECK(Heap::RootIsImmortalImmovable(Heap::kWeakCellMapRootIndex));
|
| + StoreMapNoWriteBarrier(cell, Heap::kWeakCellMapRootIndex);
|
| StoreObjectField(cell, WeakCell::kValueOffset, value);
|
| StoreObjectFieldRoot(cell, WeakCell::kNextOffset,
|
| Heap::kTheHoleValueRootIndex);
|
|
|