| Index: src/heap/objects-visiting-inl.h
|
| diff --git a/src/heap/objects-visiting-inl.h b/src/heap/objects-visiting-inl.h
|
| index d6a189a98d20f75a1008dcae492d6f2921411984..08e9092cb857674e85cb09d4b18503b0ede15296 100644
|
| --- a/src/heap/objects-visiting-inl.h
|
| +++ b/src/heap/objects-visiting-inl.h
|
| @@ -9,6 +9,7 @@
|
| #include "src/heap/objects-visiting.h"
|
| #include "src/ic/ic-state.h"
|
| #include "src/macro-assembler.h"
|
| +#include "src/objects-body-descriptors-inl.h"
|
|
|
| namespace v8 {
|
| namespace internal {
|
| @@ -94,14 +95,14 @@ void StaticNewSpaceVisitor<StaticVisitor>::Initialize() {
|
| template <typename StaticVisitor>
|
| int StaticNewSpaceVisitor<StaticVisitor>::VisitJSArrayBuffer(
|
| Map* map, HeapObject* object) {
|
| - Heap* heap = map->GetHeap();
|
| + typedef FlexibleBodyVisitor<StaticVisitor, JSArrayBuffer::BodyDescriptor, int>
|
| + JSArrayBufferBodyVisitor;
|
|
|
| - JSArrayBuffer::JSArrayBufferIterateBody<
|
| - StaticNewSpaceVisitor<StaticVisitor> >(heap, object);
|
| if (!JSArrayBuffer::cast(object)->is_external()) {
|
| + Heap* heap = map->GetHeap();
|
| heap->array_buffer_tracker()->MarkLive(JSArrayBuffer::cast(object));
|
| }
|
| - return JSArrayBuffer::kSizeWithInternalFields;
|
| + return JSArrayBufferBodyVisitor::Visit(map, object);
|
| }
|
|
|
|
|
| @@ -427,6 +428,8 @@ void StaticMarkingVisitor<StaticVisitor>::VisitWeakCollection(
|
| template <typename StaticVisitor>
|
| void StaticMarkingVisitor<StaticVisitor>::VisitCode(Map* map,
|
| HeapObject* object) {
|
| + typedef FlexibleBodyVisitor<StaticVisitor, Code::BodyDescriptor, void>
|
| + CodeBodyVisitor;
|
| Heap* heap = map->GetHeap();
|
| Code* code = Code::cast(object);
|
| if (FLAG_age_code && !heap->isolate()->serializer_enabled()) {
|
| @@ -439,7 +442,7 @@ void StaticMarkingVisitor<StaticVisitor>::VisitCode(Map* map,
|
| MarkInlinedFunctionsCode(heap, code);
|
| }
|
| }
|
| - code->CodeIterateBody<StaticVisitor>(heap);
|
| + CodeBodyVisitor::Visit(map, object);
|
| }
|
|
|
|
|
| @@ -525,12 +528,9 @@ void StaticMarkingVisitor<StaticVisitor>::VisitJSFunction(Map* map,
|
| template <typename StaticVisitor>
|
| void StaticMarkingVisitor<StaticVisitor>::VisitJSRegExp(Map* map,
|
| HeapObject* object) {
|
| - int last_property_offset =
|
| - JSRegExp::kSize + kPointerSize * map->GetInObjectProperties();
|
| - StaticVisitor::VisitPointers(
|
| - map->GetHeap(), object,
|
| - HeapObject::RawField(object, JSRegExp::kPropertiesOffset),
|
| - HeapObject::RawField(object, last_property_offset));
|
| + typedef FlexibleBodyVisitor<StaticVisitor, JSRegExp::BodyDescriptor, void>
|
| + JSRegExpBodyVisitor;
|
| + JSRegExpBodyVisitor::Visit(map, object);
|
| }
|
|
|
|
|
| @@ -539,7 +539,11 @@ void StaticMarkingVisitor<StaticVisitor>::VisitJSArrayBuffer(
|
| Map* map, HeapObject* object) {
|
| Heap* heap = map->GetHeap();
|
|
|
| - JSArrayBuffer::JSArrayBufferIterateBody<StaticVisitor>(heap, object);
|
| + typedef FlexibleBodyVisitor<StaticVisitor, JSArrayBuffer::BodyDescriptor,
|
| + void> JSArrayBufferBodyVisitor;
|
| +
|
| + JSArrayBufferBodyVisitor::Visit(map, object);
|
| +
|
| if (!JSArrayBuffer::cast(object)->is_external() &&
|
| !heap->InNewSpace(object)) {
|
| heap->array_buffer_tracker()->MarkLive(JSArrayBuffer::cast(object));
|
| @@ -550,20 +554,18 @@ void StaticMarkingVisitor<StaticVisitor>::VisitJSArrayBuffer(
|
| template <typename StaticVisitor>
|
| void StaticMarkingVisitor<StaticVisitor>::VisitJSTypedArray(
|
| Map* map, HeapObject* object) {
|
| - StaticVisitor::VisitPointers(
|
| - map->GetHeap(), object,
|
| - HeapObject::RawField(object, JSTypedArray::BodyDescriptor::kStartOffset),
|
| - HeapObject::RawField(object, JSTypedArray::kSizeWithInternalFields));
|
| + typedef FlexibleBodyVisitor<StaticVisitor, JSTypedArray::BodyDescriptor, void>
|
| + JSTypedArrayBodyVisitor;
|
| + JSTypedArrayBodyVisitor::Visit(map, object);
|
| }
|
|
|
|
|
| template <typename StaticVisitor>
|
| void StaticMarkingVisitor<StaticVisitor>::VisitJSDataView(Map* map,
|
| HeapObject* object) {
|
| - StaticVisitor::VisitPointers(
|
| - map->GetHeap(), object,
|
| - HeapObject::RawField(object, JSDataView::BodyDescriptor::kStartOffset),
|
| - HeapObject::RawField(object, JSDataView::kSizeWithInternalFields));
|
| + typedef FlexibleBodyVisitor<StaticVisitor, JSDataView::BodyDescriptor, void>
|
| + JSDataViewBodyVisitor;
|
| + JSDataViewBodyVisitor::Visit(map, object);
|
| }
|
|
|
|
|
| @@ -822,66 +824,6 @@ void StaticMarkingVisitor<StaticVisitor>::VisitJSFunctionWeakCode(
|
| }
|
|
|
|
|
| -void Code::CodeIterateBody(ObjectVisitor* v) {
|
| - int mode_mask = RelocInfo::kCodeTargetMask |
|
| - RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) |
|
| - RelocInfo::ModeMask(RelocInfo::CELL) |
|
| - RelocInfo::ModeMask(RelocInfo::EXTERNAL_REFERENCE) |
|
| - RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) |
|
| - RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE_ENCODED) |
|
| - RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY) |
|
| - RelocInfo::kDebugBreakSlotMask;
|
| -
|
| - // There are two places where we iterate code bodies: here and the
|
| - // templated CodeIterateBody (below). They should be kept in sync.
|
| - IteratePointer(v, kRelocationInfoOffset);
|
| - IteratePointer(v, kHandlerTableOffset);
|
| - IteratePointer(v, kDeoptimizationDataOffset);
|
| - IteratePointer(v, kTypeFeedbackInfoOffset);
|
| - IterateNextCodeLink(v, kNextCodeLinkOffset);
|
| -
|
| - RelocIterator it(this, mode_mask);
|
| - Isolate* isolate = this->GetIsolate();
|
| - for (; !it.done(); it.next()) {
|
| - it.rinfo()->Visit(isolate, v);
|
| - }
|
| -}
|
| -
|
| -
|
| -template <typename StaticVisitor>
|
| -void Code::CodeIterateBody(Heap* heap) {
|
| - int mode_mask = RelocInfo::kCodeTargetMask |
|
| - RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) |
|
| - RelocInfo::ModeMask(RelocInfo::CELL) |
|
| - RelocInfo::ModeMask(RelocInfo::EXTERNAL_REFERENCE) |
|
| - RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) |
|
| - RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE_ENCODED) |
|
| - RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY) |
|
| - RelocInfo::kDebugBreakSlotMask;
|
| -
|
| - // There are two places where we iterate code bodies: here and the non-
|
| - // templated CodeIterateBody (above). They should be kept in sync.
|
| - StaticVisitor::VisitPointer(
|
| - heap, this,
|
| - reinterpret_cast<Object**>(this->address() + kRelocationInfoOffset));
|
| - StaticVisitor::VisitPointer(
|
| - heap, this,
|
| - reinterpret_cast<Object**>(this->address() + kHandlerTableOffset));
|
| - StaticVisitor::VisitPointer(
|
| - heap, this,
|
| - reinterpret_cast<Object**>(this->address() + kDeoptimizationDataOffset));
|
| - StaticVisitor::VisitPointer(
|
| - heap, this,
|
| - reinterpret_cast<Object**>(this->address() + kTypeFeedbackInfoOffset));
|
| - StaticVisitor::VisitNextCodeLink(
|
| - heap, reinterpret_cast<Object**>(this->address() + kNextCodeLinkOffset));
|
| -
|
| -
|
| - RelocIterator it(this, mode_mask);
|
| - for (; !it.done(); it.next()) {
|
| - it.rinfo()->template Visit<StaticVisitor>(heap);
|
| - }
|
| -}
|
| } // namespace internal
|
| } // namespace v8
|
|
|
|
|