diff options
Diffstat (limited to 'chromium/v8/src/objects-visiting-inl.h')
-rw-r--r-- | chromium/v8/src/objects-visiting-inl.h | 54 |
1 files changed, 46 insertions, 8 deletions
diff --git a/chromium/v8/src/objects-visiting-inl.h b/chromium/v8/src/objects-visiting-inl.h index 46cc9d79892..1a68344b26a 100644 --- a/chromium/v8/src/objects-visiting-inl.h +++ b/chromium/v8/src/objects-visiting-inl.h @@ -185,12 +185,11 @@ void StaticMarkingVisitor<StaticVisitor>::Initialize() { table_.Register(kVisitFixedDoubleArray, &DataObjectVisitor::Visit); + table_.Register(kVisitConstantPoolArray, &VisitConstantPoolArray); + table_.Register(kVisitNativeContext, &VisitNativeContext); - table_.Register(kVisitAllocationSite, - &FixedBodyVisitor<StaticVisitor, - AllocationSite::BodyDescriptor, - void>::Visit); + table_.Register(kVisitAllocationSite, &VisitAllocationSite); table_.Register(kVisitByteArray, &DataObjectVisitor::Visit); @@ -261,10 +260,8 @@ void StaticMarkingVisitor<StaticVisitor>::VisitEmbeddedPointer( ASSERT(rinfo->rmode() == RelocInfo::EMBEDDED_OBJECT); ASSERT(!rinfo->target_object()->IsConsString()); HeapObject* object = HeapObject::cast(rinfo->target_object()); - if (!FLAG_weak_embedded_maps_in_optimized_code || !FLAG_collect_maps || - rinfo->host()->kind() != Code::OPTIMIZED_FUNCTION || - !object->IsMap() || !Map::cast(object)->CanTransition()) { - heap->mark_compact_collector()->RecordRelocSlot(rinfo, object); + heap->mark_compact_collector()->RecordRelocSlot(rinfo, object); + if (!Code::IsWeakEmbeddedObject(rinfo->host()->kind(), object)) { StaticVisitor::MarkObject(heap, object); } } @@ -389,6 +386,31 @@ void StaticMarkingVisitor<StaticVisitor>::VisitPropertyCell( template<typename StaticVisitor> +void StaticMarkingVisitor<StaticVisitor>::VisitAllocationSite( + Map* map, HeapObject* object) { + Heap* heap = map->GetHeap(); + + Object** slot = + HeapObject::RawField(object, AllocationSite::kDependentCodeOffset); + if (FLAG_collect_maps) { + // Mark allocation site dependent codes array but do not push it onto + // marking stack, this will make references from it weak. We will clean + // dead codes when we iterate over allocation sites in + // ClearNonLiveReferences. + HeapObject* obj = HeapObject::cast(*slot); + heap->mark_compact_collector()->RecordSlot(slot, slot, obj); + StaticVisitor::MarkObjectWithoutPush(heap, obj); + } else { + StaticVisitor::VisitPointer(heap, slot); + } + + StaticVisitor::VisitPointers(heap, + HeapObject::RawField(object, AllocationSite::kPointerFieldsBeginOffset), + HeapObject::RawField(object, AllocationSite::kPointerFieldsEndOffset)); +} + + +template<typename StaticVisitor> void StaticMarkingVisitor<StaticVisitor>::VisitCode( Map* map, HeapObject* object) { Heap* heap = map->GetHeap(); @@ -452,6 +474,22 @@ void StaticMarkingVisitor<StaticVisitor>::VisitSharedFunctionInfo( template<typename StaticVisitor> +void StaticMarkingVisitor<StaticVisitor>::VisitConstantPoolArray( + Map* map, HeapObject* object) { + Heap* heap = map->GetHeap(); + ConstantPoolArray* constant_pool = ConstantPoolArray::cast(object); + int first_ptr_offset = constant_pool->OffsetOfElementAt( + constant_pool->first_ptr_index()); + int last_ptr_offset = constant_pool->OffsetOfElementAt( + constant_pool->first_ptr_index() + constant_pool->count_of_ptr_entries()); + StaticVisitor::VisitPointers( + heap, + HeapObject::RawField(object, first_ptr_offset), + HeapObject::RawField(object, last_ptr_offset)); +} + + +template<typename StaticVisitor> void StaticMarkingVisitor<StaticVisitor>::VisitJSFunction( Map* map, HeapObject* object) { Heap* heap = map->GetHeap(); |