DOMGCOutputConstraint.cpp [plain text]
#include "config.h"
#include "DOMGCOutputConstraint.h"
#include "WebCoreJSClientData.h"
#include <JavaScriptCore/BlockDirectoryInlines.h>
#include <JavaScriptCore/HeapInlines.h>
#include <JavaScriptCore/MarkedBlockInlines.h>
#include <JavaScriptCore/SubspaceInlines.h>
#include <JavaScriptCore/VM.h>
namespace WebCore {
using namespace JSC;
DOMGCOutputConstraint::DOMGCOutputConstraint(VM& vm, JSVMClientData& clientData)
: MarkingConstraint("Domo", "DOM Output", ConstraintVolatility::SeldomGreyed, ConstraintConcurrency::Concurrent, ConstraintParallelism::Parallel)
, m_vm(vm)
, m_clientData(clientData)
, m_lastExecutionVersion(vm.heap.mutatorExecutionVersion())
{
}
DOMGCOutputConstraint::~DOMGCOutputConstraint()
{
}
void DOMGCOutputConstraint::executeImpl(SlotVisitor& visitor)
{
Heap& heap = m_vm.heap;
if (heap.mutatorExecutionVersion() == m_lastExecutionVersion)
return;
m_lastExecutionVersion = heap.mutatorExecutionVersion();
m_clientData.forEachOutputConstraintSpace(
[&] (Subspace& subspace) {
auto func = [] (SlotVisitor& visitor, HeapCell* heapCell, HeapCell::Kind) {
SetRootMarkReasonScope rootScope(visitor, SlotVisitor::RootMarkReason::DOMGCOutput);
JSCell* cell = static_cast<JSCell*>(heapCell);
cell->methodTable(visitor.vm())->visitOutputConstraints(cell, visitor);
};
visitor.addParallelConstraintTask(subspace.forEachMarkedCellInParallel(func));
});
}
}