Chromium Code Reviews| Index: src/heap/objects-visiting-inl.h |
| diff --git a/src/heap/objects-visiting-inl.h b/src/heap/objects-visiting-inl.h |
| index 86f6d01940a0c7b9126e439a8b1392ca71ae51da..61261742094eea16f303f3a733fa173d1771cfdd 100644 |
| --- a/src/heap/objects-visiting-inl.h |
| +++ b/src/heap/objects-visiting-inl.h |
| @@ -63,7 +63,11 @@ void StaticNewSpaceVisitor<StaticVisitor>::Initialize() { |
| table_.Register(kVisitSeqTwoByteString, &VisitSeqTwoByteString); |
| - table_.Register(kVisitJSFunction, &VisitJSFunction); |
| + // Don't visit code entry. We are using this visitor only during scavenges. |
| + table_.Register( |
| + kVisitJSFunction, |
| + &FlexibleBodyVisitor<StaticVisitor, JSFunction::BodyDescriptorWeakCode, |
| + int>::Visit); |
| table_.Register(kVisitJSArrayBuffer, &VisitJSArrayBuffer); |
| @@ -486,6 +490,13 @@ void StaticMarkingVisitor<StaticVisitor>::VisitSharedFunctionInfo( |
| template <typename StaticVisitor> |
| void StaticMarkingVisitor<StaticVisitor>::VisitJSFunction(Map* map, |
| HeapObject* object) { |
| + typedef FlexibleBodyVisitor<StaticVisitor, |
|
Michael Starzinger
2015/11/10 10:40:32
I would vote for keeping delegator methods as ment
Igor Sheludko
2015/11/10 10:58:11
Done.
|
| + JSFunction::BodyDescriptorStrongCode, |
| + void> JSFunctionStrongCodeBodyVisitor; |
| + |
| + typedef FlexibleBodyVisitor<StaticVisitor, JSFunction::BodyDescriptorWeakCode, |
| + void> JSFunctionWeakCodeBodyVisitor; |
| + |
| Heap* heap = map->GetHeap(); |
| JSFunction* function = JSFunction::cast(object); |
| MarkCompactCollector* collector = heap->mark_compact_collector(); |
| @@ -507,7 +518,7 @@ void StaticMarkingVisitor<StaticVisitor>::VisitJSFunction(Map* map, |
| VisitSharedFunctionInfoWeakCode(heap, shared); |
| } |
| // Treat the reference to the code object weakly. |
| - VisitJSFunctionWeakCode(heap, object); |
| + JSFunctionWeakCodeBodyVisitor::Visit(map, object); |
| return; |
| } else { |
| // Visit all unoptimized code objects to prevent flushing them. |
| @@ -517,7 +528,7 @@ void StaticMarkingVisitor<StaticVisitor>::VisitJSFunction(Map* map, |
| } |
| } |
| } |
| - VisitJSFunctionStrongCode(heap, object); |
| + JSFunctionStrongCodeBodyVisitor::Visit(map, object); |
| } |
| @@ -800,47 +811,6 @@ void StaticMarkingVisitor<StaticVisitor>::VisitSharedFunctionInfoWeakCode( |
| } |
| -template <typename StaticVisitor> |
| -void StaticMarkingVisitor<StaticVisitor>::VisitJSFunctionStrongCode( |
| - Heap* heap, HeapObject* object) { |
| - Object** start_slot = |
| - HeapObject::RawField(object, JSFunction::kPropertiesOffset); |
| - Object** end_slot = |
| - HeapObject::RawField(object, JSFunction::kCodeEntryOffset); |
| - StaticVisitor::VisitPointers(heap, object, start_slot, end_slot); |
| - |
| - VisitCodeEntry(heap, object, |
| - object->address() + JSFunction::kCodeEntryOffset); |
| - STATIC_ASSERT(JSFunction::kCodeEntryOffset + kPointerSize == |
| - JSFunction::kPrototypeOrInitialMapOffset); |
| - |
| - start_slot = |
| - HeapObject::RawField(object, JSFunction::kPrototypeOrInitialMapOffset); |
| - end_slot = HeapObject::RawField(object, JSFunction::kNonWeakFieldsEndOffset); |
| - StaticVisitor::VisitPointers(heap, object, start_slot, end_slot); |
| -} |
| - |
| - |
| -template <typename StaticVisitor> |
| -void StaticMarkingVisitor<StaticVisitor>::VisitJSFunctionWeakCode( |
| - Heap* heap, HeapObject* object) { |
| - Object** start_slot = |
| - HeapObject::RawField(object, JSFunction::kPropertiesOffset); |
| - Object** end_slot = |
| - HeapObject::RawField(object, JSFunction::kCodeEntryOffset); |
| - StaticVisitor::VisitPointers(heap, object, start_slot, end_slot); |
| - |
| - // Skip visiting kCodeEntryOffset as it is treated weakly here. |
| - STATIC_ASSERT(JSFunction::kCodeEntryOffset + kPointerSize == |
| - JSFunction::kPrototypeOrInitialMapOffset); |
| - |
| - start_slot = |
| - HeapObject::RawField(object, JSFunction::kPrototypeOrInitialMapOffset); |
| - end_slot = HeapObject::RawField(object, JSFunction::kNonWeakFieldsEndOffset); |
| - StaticVisitor::VisitPointers(heap, object, start_slot, end_slot); |
| -} |
| - |
| - |
| void Code::CodeIterateBody(ObjectVisitor* v) { |
| int mode_mask = RelocInfo::kCodeTargetMask | |
| RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) | |