| Index: src/code-stub-assembler.cc
|
| diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc
|
| index 820c7da9dbef676337550ef1cf8bb262be39d95d..c128101c693f7d36784c217258774b4b0d1c6ccd 100644
|
| --- a/src/code-stub-assembler.cc
|
| +++ b/src/code-stub-assembler.cc
|
| @@ -6605,6 +6605,81 @@ Node* CodeStubAssembler::CreateWeakCellInFeedbackVector(Node* feedback_vector,
|
| return cell;
|
| }
|
|
|
| +void CodeStubAssembler::HandleSlackTracking(Node* context, Node* object,
|
| + Node* initial_map,
|
| + int start_offset) {
|
| + Node* instance_size_words = ChangeUint32ToWord(LoadObjectField(
|
| + initial_map, Map::kInstanceSizeOffset, MachineType::Uint8()));
|
| + Node* instance_size =
|
| + WordShl(instance_size_words, IntPtrConstant(kPointerSizeLog2));
|
| +
|
| + // Perform in-object slack tracking if requested.
|
| + Node* bit_field3 = LoadMapBitField3(initial_map);
|
| + Label end(this), slack_tracking(this), finalize(this, Label::kDeferred);
|
| + GotoIf(IsSetWord32<Map::ConstructionCounter>(bit_field3), &slack_tracking);
|
| +
|
| + // Initialize remaining fields.
|
| + {
|
| + Comment("no slack tracking");
|
| + InitializeFieldsWithRoot(object, IntPtrConstant(start_offset),
|
| + instance_size, Heap::kUndefinedValueRootIndex);
|
| + Goto(&end);
|
| + }
|
| +
|
| + {
|
| + BIND(&slack_tracking);
|
| +
|
| + // Decrease generous allocation count.
|
| + STATIC_ASSERT(Map::ConstructionCounter::kNext == 32);
|
| + Comment("update allocation count");
|
| + Node* new_bit_field3 = Int32Sub(
|
| + bit_field3, Int32Constant(1 << Map::ConstructionCounter::kShift));
|
| + StoreObjectFieldNoWriteBarrier(initial_map, Map::kBitField3Offset,
|
| + new_bit_field3,
|
| + MachineRepresentation::kWord32);
|
| + GotoIf(IsClearWord32<Map::ConstructionCounter>(new_bit_field3), &finalize);
|
| +
|
| + Node* unused_fields = LoadObjectField(
|
| + initial_map, Map::kUnusedPropertyFieldsOffset, MachineType::Uint8());
|
| + Node* used_size =
|
| + IntPtrSub(instance_size, WordShl(ChangeUint32ToWord(unused_fields),
|
| + IntPtrConstant(kPointerSizeLog2)));
|
| +
|
| + Comment("initialize filler fields (no finalize)");
|
| + InitializeFieldsWithRoot(object, used_size, instance_size,
|
| + Heap::kOnePointerFillerMapRootIndex);
|
| +
|
| + Comment("initialize undefined fields (no finalize)");
|
| + InitializeFieldsWithRoot(object, IntPtrConstant(start_offset), used_size,
|
| + Heap::kUndefinedValueRootIndex);
|
| + Goto(&end);
|
| + }
|
| +
|
| + {
|
| + // Finalize the instance size.
|
| + BIND(&finalize);
|
| +
|
| + Node* unused_fields = LoadObjectField(
|
| + initial_map, Map::kUnusedPropertyFieldsOffset, MachineType::Uint8());
|
| + Node* used_size =
|
| + IntPtrSub(instance_size, WordShl(ChangeUint32ToWord(unused_fields),
|
| + IntPtrConstant(kPointerSizeLog2)));
|
| +
|
| + Comment("initialize filler fields (finalize)");
|
| + InitializeFieldsWithRoot(object, used_size, instance_size,
|
| + Heap::kOnePointerFillerMapRootIndex);
|
| +
|
| + Comment("initialize undefined fields (finalize)");
|
| + InitializeFieldsWithRoot(object, IntPtrConstant(start_offset), used_size,
|
| + Heap::kUndefinedValueRootIndex);
|
| +
|
| + CallRuntime(Runtime::kFinalizeInstanceSize, context, initial_map);
|
| + Goto(&end);
|
| + }
|
| +
|
| + BIND(&end);
|
| +}
|
| +
|
| Node* CodeStubAssembler::BuildFastLoop(
|
| const CodeStubAssembler::VariableList& vars, Node* start_index,
|
| Node* end_index, const FastLoopBody& body, int increment,
|
|
|