void js::gc::EndVerifyPostBarriers(JSRuntime *rt) { #ifdef JSGC_GENERATIONAL VerifyPostTracer::EdgeSet edges; AutoPrepareForTracing prep(rt, SkipAtoms); VerifyPostTracer *trc = (VerifyPostTracer *)rt->gcVerifyPostData; /* Visit every entry in the store buffer and put the edges in a hash set. */ JS_TracerInit(trc, rt, PostVerifierCollectStoreBufferEdges); if (!edges.init()) goto oom; trc->edges = &edges; rt->gcStoreBuffer.markAll(trc); /* Walk the heap to find any edges not the the |edges| set. */ JS_TracerInit(trc, rt, PostVerifierVisitEdge); for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) { for (size_t kind = 0; kind < FINALIZE_LIMIT; ++kind) { for (CellIterUnderGC cells(zone, AllocKind(kind)); !cells.done(); cells.next()) { Cell *src = cells.getCell(); JS_TraceChildren(trc, src, MapAllocToTraceKind(AllocKind(kind))); } } } oom: js_delete(trc); rt->gcVerifyPostData = nullptr; #endif }
bool js::gc::GCRuntime::endVerifyPostBarriers() { VerifyPostTracer* trc = (VerifyPostTracer*)verifyPostData; if (!trc) return false; VerifyPostTracer::EdgeSet edges; AutoPrepareForTracing prep(rt, SkipAtoms); /* Visit every entry in the store buffer and put the edges in a hash set. */ trc->setTraceCallback(PostVerifierCollectStoreBufferEdges); if (!edges.init()) goto oom; trc->edges = &edges; storeBuffer.markAll(trc); /* Walk the heap to find any edges not the the |edges| set. */ trc->setTraceCallback(PostVerifierVisitEdge); for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) { for (auto kind : AllAllocKinds()) { for (ZoneCellIterUnderGC cells(zone, kind); !cells.done(); cells.next()) { Cell* src = cells.getCell(); JS_TraceChildren(trc, src, MapAllocToTraceKind(kind)); } } } oom: js_delete(trc); verifyPostData = nullptr; return true; }