blob: 190952b24ce5053adb5ff4530bea6bc3c80f419e [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MarkingVisitor_h
#define MarkingVisitor_h
#include "platform/heap/MarkingVisitorImpl.h"
namespace blink {
template <Visitor::MarkingMode Mode>
class MarkingVisitor final : public Visitor, public MarkingVisitorImpl<MarkingVisitor<Mode>> {
public:
using Impl = MarkingVisitorImpl<MarkingVisitor<Mode>>;
friend class MarkingVisitorImpl<MarkingVisitor<Mode>>;
MarkingVisitor()
: Visitor(Mode)
{
}
void markHeader(HeapObjectHeader* header, TraceCallback callback) override
{
Impl::markHeader(header, header->payload(), callback);
}
void mark(const void* objectPointer, TraceCallback callback) override
{
Impl::mark(objectPointer, callback);
}
void registerDelayedMarkNoTracing(const void* object) override
{
Impl::registerDelayedMarkNoTracing(object);
}
void registerWeakMembers(const void* closure, const void* objectPointer, WeakCallback callback) override
{
Impl::registerWeakMembers(closure, objectPointer, callback);
}
virtual void registerWeakTable(const void* closure, EphemeronCallback iterationCallback, EphemeronCallback iterationDoneCallback)
{
Impl::registerWeakTable(closure, iterationCallback, iterationDoneCallback);
}
#if ENABLE(ASSERT)
virtual bool weakTableRegistered(const void* closure)
{
return Impl::weakTableRegistered(closure);
}
#endif
bool ensureMarked(const void* objectPointer) override
{
return Impl::ensureMarked(objectPointer);
}
protected:
void registerWeakCellWithCallback(void** cell, WeakCallback callback) override
{
Impl::registerWeakCellWithCallback(cell, callback);
}
inline bool shouldMarkObject(const void* objectPointer)
{
if (Mode != ThreadLocalMarking)
return true;
BasePage* page = pageFromObject(objectPointer);
ASSERT(!page->orphaned());
// When doing a thread local GC, the marker checks if
// the object resides in another thread's heap. If it
// does, the object should not be marked & traced.
return page->terminating();
}
};
} // namespace blink
#endif