| Index: src/heap/store-buffer.cc
|
| diff --git a/src/heap/store-buffer.cc b/src/heap/store-buffer.cc
|
| index eae3594a18a38b7e1b79803d3d72a9fedd55b278..aac68116ce840f3ca72715c41aaa3809ac028173 100644
|
| --- a/src/heap/store-buffer.cc
|
| +++ b/src/heap/store-buffer.cc
|
| @@ -512,24 +512,28 @@ void StoreBuffer::IteratePointersToNewSpace(ObjectSlotCallback slot_callback,
|
| bool may_contain_raw_values = heap_object->MayContainRawValues();
|
| if (!may_contain_raw_values) {
|
| Address obj_address = heap_object->address();
|
| - Address start_address = obj_address + HeapObject::kHeaderSize;
|
| - Address end_address = obj_address + heap_object->Size();
|
| + const int start_offset = HeapObject::kHeaderSize;
|
| + const int end_offset = heap_object->Size();
|
| #if V8_DOUBLE_FIELDS_UNBOXING
|
| - InobjectPropertiesHelper helper(heap_object->map());
|
| + LayoutDescriptorHelper helper(heap_object->map());
|
| bool has_only_tagged_fields = helper.all_fields_tagged();
|
|
|
| if (!has_only_tagged_fields) {
|
| - for (Address slot = start_address; slot < end_address;
|
| - slot += kPointerSize) {
|
| - if (helper.IsTagged(static_cast<int>(slot - obj_address))) {
|
| - // TODO(ishell): call this once for contiguous region
|
| - // of tagged fields.
|
| - FindPointersToNewSpaceInRegion(slot, slot + kPointerSize,
|
| - slot_callback, clear_maps);
|
| + for (int offset = start_offset; offset < end_offset;) {
|
| + int end_of_region_offset;
|
| + if (helper.IsTagged(offset, end_offset,
|
| + &end_of_region_offset)) {
|
| + FindPointersToNewSpaceInRegion(
|
| + obj_address + offset,
|
| + obj_address + end_of_region_offset, slot_callback,
|
| + clear_maps);
|
| }
|
| + offset = end_of_region_offset;
|
| }
|
| } else {
|
| #endif
|
| + Address start_address = obj_address + start_offset;
|
| + Address end_address = obj_address + end_offset;
|
| // Object has only tagged fields.
|
| FindPointersToNewSpaceInRegion(start_address, end_address,
|
| slot_callback, clear_maps);
|
|
|