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) | |