Chromium Code Reviews| Index: src/heap/store-buffer.cc |
| diff --git a/src/heap/store-buffer.cc b/src/heap/store-buffer.cc |
| index 04f24bab354bfb89c039ad18b2e89d69471e6ff0..3d588ab9c5e07b4ec0d800df593616b1da8e41b6 100644 |
| --- a/src/heap/store-buffer.cc |
| +++ b/src/heap/store-buffer.cc |
| @@ -483,16 +483,24 @@ void StoreBuffer::IteratePointersToNewSpace(ObjectSlotCallback slot_callback) { |
| for (HeapObject* heap_object = iterator.Next(); heap_object != NULL; |
| heap_object = iterator.Next()) { |
| // We iterate over objects that contain new space pointers only. |
| - bool may_contain_raw_values = heap_object->MayContainRawValues(); |
| - if (!may_contain_raw_values) { |
| - Address obj_address = heap_object->address(); |
| - const int start_offset = HeapObject::kHeaderSize; |
| - const int end_offset = heap_object->Size(); |
| -#if V8_DOUBLE_FIELDS_UNBOXING |
| - LayoutDescriptorHelper helper(heap_object->map()); |
| - bool has_only_tagged_fields = helper.all_fields_tagged(); |
| + Address obj_address = heap_object->address(); |
| + const int start_offset = HeapObject::kHeaderSize; |
| + const int end_offset = heap_object->Size(); |
| - if (!has_only_tagged_fields) { |
| + switch (heap_object->ContentType()) { |
| + case HeapObjectContents::kTaggedValues: { |
| + 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); |
| + break; |
| + } |
| + |
| + case HeapObjectContents::kMixedValues: { |
| +#if V8_DOUBLE_FIELDS_UNBOXING |
|
Igor Sheludko
2015/06/08 10:45:12
Same here.
|
| + LayoutDescriptorHelper helper(heap_object->map()); |
| + DCHECK(!helper.all_fields_tagged()); |
| for (int offset = start_offset; offset < end_offset;) { |
| int end_of_region_offset; |
| if (helper.IsTagged(offset, end_offset, |
| @@ -503,16 +511,14 @@ void StoreBuffer::IteratePointersToNewSpace(ObjectSlotCallback slot_callback) { |
| } |
| offset = end_of_region_offset; |
| } |
| - } else { |
| +#else |
| + UNREACHABLE(); |
| #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); |
| -#if V8_DOUBLE_FIELDS_UNBOXING |
| + break; |
| } |
| -#endif |
| + |
| + case HeapObjectContents::kRawValues: |
| + break; |
| } |
| } |
| } |