Compare commits

...
Author SHA1 Message Date
Moonchild d654ede2c8 Trace strong edges if WeakRef stub preffed. 2026-11-05 06:59:58 +01:00
2 changed files with 24 additions and 14 deletions

No files matched your search

+12 -7
View File
@@ -119,9 +119,9 @@ struct WeakCell {
if (!target)
return;
if (!enabled) {
// Do nothing
} else if (IsInsideNursery(target)) {
if (!enabled || IsInsideNursery(target)) {
// Weak edges must be tenured.
// Trace strongly if inside nursery or WeakRef disabled.
TraceManuallyBarrieredEdge(trc, object.unsafeGet(), name);
} else {
if (trc->isMarkingTracer() && !target->asTenured().zone()->isCollecting())
@@ -130,10 +130,15 @@ struct WeakCell {
}
} else if (kind == WeakCellKind::Symbol) {
JS::Symbol* target = symbol.unbarrieredGet();
if (enabled && target) {
if (trc->isMarkingTracer() && !target->asTenured().zone()->isCollecting())
return;
TraceWeakEdge(trc, &symbol, name);
if (target) {
if (!enabled) {
// Trace strongly if WeakRef disabled.
TraceManuallyBarrieredEdge(trc, symbol.unsafeGet(), name);
} else {
if (trc->isMarkingTracer() && !target->asTenured().zone()->isCollecting())
return;
TraceWeakEdge(trc, &symbol, name);
}
}
}
}
+12 -7
View File
@@ -216,20 +216,25 @@ WeakRefObject::trace(JSTracer* trc, JSObject* obj)
if (!target)
return;
if (!data->enabled) {
// Pref disabled, don't do anything.
} else if (IsInsideNursery(target)) {
// Weak edges must be tenured; trace strongly while referent is in the nursery.
if (!data->enabled || IsInsideNursery(target)) {
// Weak edges must be tenured; trace strongly while referent is in
// the nursery or if WeakRefs are disabled by pref.
TraceManuallyBarrieredEdge(trc, data->objectTarget.unsafeGet(),
"WeakRef nursery referent");
"WeakRef strong referent");
} else {
TraceWeakEdge(trc, &data->objectTarget, "WeakRef referent");
}
} else {
MOZ_ASSERT(data->isSymbol());
JS::Symbol* target = data->symbolTarget.unbarrieredGet();
if (data->enabled && target)
TraceWeakEdge(trc, &data->symbolTarget, "WeakRef symbol referent");
if (target) {
if (data->enabled) {
TraceWeakEdge(trc, &data->symbolTarget, "WeakRef symbol referent");
} else {
TraceManuallyBarrieredEdge(trc, data->symbolTarget.unsafeGet(),
"WeakRef strong symbol referent");
}
}
}
}
}