diff options
Diffstat (limited to 'deps/v8/src/heap/mark-compact-inl.h')
-rw-r--r-- | deps/v8/src/heap/mark-compact-inl.h | 98 |
1 files changed, 57 insertions, 41 deletions
diff --git a/deps/v8/src/heap/mark-compact-inl.h b/deps/v8/src/heap/mark-compact-inl.h index 466a89080b..449ca43e50 100644 --- a/deps/v8/src/heap/mark-compact-inl.h +++ b/deps/v8/src/heap/mark-compact-inl.h @@ -14,6 +14,28 @@ namespace v8 { namespace internal { +template <typename ConcreteState, AccessMode access_mode> +bool MarkingStateBase<ConcreteState, access_mode>::GreyToBlack( + HeapObject* obj) { + MemoryChunk* p = MemoryChunk::FromAddress(obj->address()); + MarkBit markbit = MarkBitFrom(p, obj->address()); + if (!Marking::GreyToBlack<access_mode>(markbit)) return false; + static_cast<ConcreteState*>(this)->IncrementLiveBytes(p, obj->Size()); + return true; +} + +template <typename ConcreteState, AccessMode access_mode> +bool MarkingStateBase<ConcreteState, access_mode>::WhiteToGrey( + HeapObject* obj) { + return Marking::WhiteToGrey<access_mode>(MarkBitFrom(obj)); +} + +template <typename ConcreteState, AccessMode access_mode> +bool MarkingStateBase<ConcreteState, access_mode>::WhiteToBlack( + HeapObject* obj) { + return WhiteToGrey(obj) && GreyToBlack(obj); +} + template <FixedArrayVisitationMode fixed_array_mode, TraceRetainingPathMode retaining_path_mode, typename MarkingState> MarkingVisitor<fixed_array_mode, retaining_path_mode, @@ -26,16 +48,6 @@ MarkingVisitor<fixed_array_mode, retaining_path_mode, template <FixedArrayVisitationMode fixed_array_mode, TraceRetainingPathMode retaining_path_mode, typename MarkingState> int MarkingVisitor<fixed_array_mode, retaining_path_mode, - MarkingState>::VisitAllocationSite(Map* map, - AllocationSite* object) { - int size = AllocationSite::BodyDescriptorWeak::SizeOf(map, object); - AllocationSite::BodyDescriptorWeak::IterateBody(map, object, size, this); - return size; -} - -template <FixedArrayVisitationMode fixed_array_mode, - TraceRetainingPathMode retaining_path_mode, typename MarkingState> -int MarkingVisitor<fixed_array_mode, retaining_path_mode, MarkingState>::VisitBytecodeArray(Map* map, BytecodeArray* array) { int size = BytecodeArray::BodyDescriptor::SizeOf(map, array); @@ -46,15 +58,6 @@ int MarkingVisitor<fixed_array_mode, retaining_path_mode, template <FixedArrayVisitationMode fixed_array_mode, TraceRetainingPathMode retaining_path_mode, typename MarkingState> -int MarkingVisitor<fixed_array_mode, retaining_path_mode, MarkingState>:: - VisitCodeDataContainer(Map* map, CodeDataContainer* object) { - int size = CodeDataContainer::BodyDescriptorWeak::SizeOf(map, object); - CodeDataContainer::BodyDescriptorWeak::IterateBody(map, object, size, this); - return size; -} - -template <FixedArrayVisitationMode fixed_array_mode, - TraceRetainingPathMode retaining_path_mode, typename MarkingState> int MarkingVisitor<fixed_array_mode, retaining_path_mode, MarkingState>::VisitFixedArray(Map* map, FixedArray* object) { @@ -65,25 +68,48 @@ int MarkingVisitor<fixed_array_mode, retaining_path_mode, template <FixedArrayVisitationMode fixed_array_mode, TraceRetainingPathMode retaining_path_mode, typename MarkingState> -int MarkingVisitor<fixed_array_mode, retaining_path_mode, - MarkingState>::VisitJSApiObject(Map* map, JSObject* object) { +template <typename T> +V8_INLINE int +MarkingVisitor<fixed_array_mode, retaining_path_mode, + MarkingState>::VisitEmbedderTracingSubclass(Map* map, + T* object) { if (heap_->local_embedder_heap_tracer()->InUse()) { - DCHECK(object->IsJSObject()); heap_->TracePossibleWrapper(object); } - int size = JSObject::BodyDescriptor::SizeOf(map, object); - JSObject::BodyDescriptor::IterateBody(map, object, size, this); + int size = T::BodyDescriptor::SizeOf(map, object); + T::BodyDescriptor::IterateBody(map, object, size, this); return size; } template <FixedArrayVisitationMode fixed_array_mode, TraceRetainingPathMode retaining_path_mode, typename MarkingState> int MarkingVisitor<fixed_array_mode, retaining_path_mode, - MarkingState>::VisitJSFunction(Map* map, - JSFunction* object) { - int size = JSFunction::BodyDescriptorWeak::SizeOf(map, object); - JSFunction::BodyDescriptorWeak::IterateBody(map, object, size, this); - return size; + MarkingState>::VisitJSApiObject(Map* map, JSObject* object) { + return VisitEmbedderTracingSubclass(map, object); +} + +template <FixedArrayVisitationMode fixed_array_mode, + TraceRetainingPathMode retaining_path_mode, typename MarkingState> +int MarkingVisitor<fixed_array_mode, retaining_path_mode, + MarkingState>::VisitJSArrayBuffer(Map* map, + JSArrayBuffer* object) { + return VisitEmbedderTracingSubclass(map, object); +} + +template <FixedArrayVisitationMode fixed_array_mode, + TraceRetainingPathMode retaining_path_mode, typename MarkingState> +int MarkingVisitor<fixed_array_mode, retaining_path_mode, + MarkingState>::VisitJSDataView(Map* map, + JSDataView* object) { + return VisitEmbedderTracingSubclass(map, object); +} + +template <FixedArrayVisitationMode fixed_array_mode, + TraceRetainingPathMode retaining_path_mode, typename MarkingState> +int MarkingVisitor<fixed_array_mode, retaining_path_mode, + MarkingState>::VisitJSTypedArray(Map* map, + JSTypedArray* object) { + return VisitEmbedderTracingSubclass(map, object); } template <FixedArrayVisitationMode fixed_array_mode, @@ -141,16 +167,6 @@ int MarkingVisitor<fixed_array_mode, retaining_path_mode, template <FixedArrayVisitationMode fixed_array_mode, TraceRetainingPathMode retaining_path_mode, typename MarkingState> int MarkingVisitor<fixed_array_mode, retaining_path_mode, - MarkingState>::VisitNativeContext(Map* map, - Context* context) { - int size = Context::BodyDescriptorWeak::SizeOf(map, context); - Context::BodyDescriptorWeak::IterateBody(map, context, size, this); - return size; -} - -template <FixedArrayVisitationMode fixed_array_mode, - TraceRetainingPathMode retaining_path_mode, typename MarkingState> -int MarkingVisitor<fixed_array_mode, retaining_path_mode, MarkingState>::VisitTransitionArray(Map* map, TransitionArray* array) { int size = TransitionArray::BodyDescriptor::SizeOf(map, array); @@ -175,11 +191,11 @@ void MarkingVisitor<fixed_array_mode, retaining_path_mode, MarkingState>::VisitPointer(HeapObject* host, MaybeObject** p) { HeapObject* target_object; - if ((*p)->ToStrongHeapObject(&target_object)) { + if ((*p)->GetHeapObjectIfStrong(&target_object)) { collector_->RecordSlot(host, reinterpret_cast<HeapObjectReference**>(p), target_object); MarkObject(host, target_object); - } else if ((*p)->ToWeakHeapObject(&target_object)) { + } else if ((*p)->GetHeapObjectIfWeak(&target_object)) { if (marking_state()->IsBlackOrGrey(target_object)) { // Weak references with live values are directly processed here to reduce // the processing time of weak cells during the main GC pause. |