Skip to content
This repository was archived by the owner on Jul 9, 2025. It is now read-only.

Commit 16aaee1

Browse files
committed
Bug 1668825 - Change GenericTracer API so that it doesn't include details of heap storage r=sfink
The final patch in this series. This changes the GenericTracer APIs to take a thing pointer and return a possibly updated versions, rather than taking a double pointer to the thing. This means that we can change the details of how pointers are stored in the heap without chaning this interface. Differential Revision: https://phabricator.services.mozilla.com/D93336
1 parent 2eb7622 commit 16aaee1

File tree

7 files changed

+254
-218
lines changed

7 files changed

+254
-218
lines changed

js/public/TracingAPI.h

Lines changed: 49 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -238,25 +238,28 @@ class GenericTracer : public JSTracer {
238238
MOZ_ASSERT(isGenericTracer());
239239
}
240240

241-
// Override these methods to receive notification when an edge is visited
242-
// with the type contained in the callback.
241+
// These methods are called when the tracer encounters an edge. Clients should
242+
// override them to receive notifications when an edge of each type is
243+
// visited.
244+
//
245+
// The caller updates the edge with the return value (if different).
243246
//
244247
// In C++, overriding a method hides all methods in the base class with that
245248
// name, not just methods with that signature. Thus, the typed edge methods
246249
// have to have distinct names to allow us to override them individually,
247250
// which is freqently useful if, for example, we only want to process one type
248251
// of edge.
249-
virtual bool onObjectEdge(JSObject** objp) = 0;
250-
virtual bool onStringEdge(JSString** strp) = 0;
251-
virtual bool onSymbolEdge(JS::Symbol** symp) = 0;
252-
virtual bool onBigIntEdge(JS::BigInt** bip) = 0;
253-
virtual bool onScriptEdge(js::BaseScript** scriptp) = 0;
254-
virtual bool onShapeEdge(js::Shape** shapep) = 0;
255-
virtual bool onRegExpSharedEdge(js::RegExpShared** sharedp) = 0;
256-
virtual bool onObjectGroupEdge(js::ObjectGroup** groupp) = 0;
257-
virtual bool onBaseShapeEdge(js::BaseShape** basep) = 0;
258-
virtual bool onJitCodeEdge(js::jit::JitCode** codep) = 0;
259-
virtual bool onScopeEdge(js::Scope** scopep) = 0;
252+
virtual JSObject* onObjectEdge(JSObject* obj) = 0;
253+
virtual JSString* onStringEdge(JSString* str) = 0;
254+
virtual JS::Symbol* onSymbolEdge(JS::Symbol* sym) = 0;
255+
virtual JS::BigInt* onBigIntEdge(JS::BigInt* bi) = 0;
256+
virtual js::BaseScript* onScriptEdge(js::BaseScript* script) = 0;
257+
virtual js::Shape* onShapeEdge(js::Shape* shape) = 0;
258+
virtual js::RegExpShared* onRegExpSharedEdge(js::RegExpShared* shared) = 0;
259+
virtual js::ObjectGroup* onObjectGroupEdge(js::ObjectGroup* group) = 0;
260+
virtual js::BaseShape* onBaseShapeEdge(js::BaseShape* base) = 0;
261+
virtual js::jit::JitCode* onJitCodeEdge(js::jit::JitCode* code) = 0;
262+
virtual js::Scope* onScopeEdge(js::Scope* scope) = 0;
260263
};
261264

262265
} // namespace js
@@ -282,49 +285,49 @@ class JS_PUBLIC_API CallbackTracer : public js::GenericTracer {
282285

283286
private:
284287
// This class implements the GenericTracer interface to dispatches to onChild.
285-
virtual bool onObjectEdge(JSObject** objp) {
286-
onChild(JS::GCCellPtr(*objp));
287-
return true;
288+
virtual JSObject* onObjectEdge(JSObject* obj) {
289+
onChild(JS::GCCellPtr(obj));
290+
return obj;
288291
}
289-
virtual bool onStringEdge(JSString** strp) {
290-
onChild(JS::GCCellPtr(*strp));
291-
return true;
292+
virtual JSString* onStringEdge(JSString* str) {
293+
onChild(JS::GCCellPtr(str));
294+
return str;
292295
}
293-
virtual bool onSymbolEdge(JS::Symbol** symp) {
294-
onChild(JS::GCCellPtr(*symp));
295-
return true;
296+
virtual JS::Symbol* onSymbolEdge(JS::Symbol* sym) {
297+
onChild(JS::GCCellPtr(sym));
298+
return sym;
296299
}
297-
virtual bool onBigIntEdge(JS::BigInt** bip) {
298-
onChild(JS::GCCellPtr(*bip));
299-
return true;
300+
virtual JS::BigInt* onBigIntEdge(JS::BigInt* bi) {
301+
onChild(JS::GCCellPtr(bi));
302+
return bi;
300303
}
301-
virtual bool onScriptEdge(js::BaseScript** scriptp) {
302-
onChild(JS::GCCellPtr(*scriptp));
303-
return true;
304+
virtual js::BaseScript* onScriptEdge(js::BaseScript* script) {
305+
onChild(JS::GCCellPtr(script));
306+
return script;
304307
}
305-
virtual bool onShapeEdge(js::Shape** shapep) {
306-
onChild(JS::GCCellPtr(*shapep, JS::TraceKind::Shape));
307-
return true;
308+
virtual js::Shape* onShapeEdge(js::Shape* shape) {
309+
onChild(JS::GCCellPtr(shape, JS::TraceKind::Shape));
310+
return shape;
308311
}
309-
virtual bool onObjectGroupEdge(js::ObjectGroup** groupp) {
310-
onChild(JS::GCCellPtr(*groupp, JS::TraceKind::ObjectGroup));
311-
return true;
312+
virtual js::ObjectGroup* onObjectGroupEdge(js::ObjectGroup* group) {
313+
onChild(JS::GCCellPtr(group, JS::TraceKind::ObjectGroup));
314+
return group;
312315
}
313-
virtual bool onBaseShapeEdge(js::BaseShape** basep) {
314-
onChild(JS::GCCellPtr(*basep, JS::TraceKind::BaseShape));
315-
return true;
316+
virtual js::BaseShape* onBaseShapeEdge(js::BaseShape* base) {
317+
onChild(JS::GCCellPtr(base, JS::TraceKind::BaseShape));
318+
return base;
316319
}
317-
virtual bool onJitCodeEdge(js::jit::JitCode** codep) {
318-
onChild(JS::GCCellPtr(*codep, JS::TraceKind::JitCode));
319-
return true;
320+
virtual js::jit::JitCode* onJitCodeEdge(js::jit::JitCode* code) {
321+
onChild(JS::GCCellPtr(code, JS::TraceKind::JitCode));
322+
return code;
320323
}
321-
virtual bool onScopeEdge(js::Scope** scopep) {
322-
onChild(JS::GCCellPtr(*scopep, JS::TraceKind::Scope));
323-
return true;
324+
virtual js::Scope* onScopeEdge(js::Scope* scope) {
325+
onChild(JS::GCCellPtr(scope, JS::TraceKind::Scope));
326+
return scope;
324327
}
325-
virtual bool onRegExpSharedEdge(js::RegExpShared** sharedp) {
326-
onChild(JS::GCCellPtr(*sharedp, JS::TraceKind::RegExpShared));
327-
return true;
328+
virtual js::RegExpShared* onRegExpSharedEdge(js::RegExpShared* shared) {
329+
onChild(JS::GCCellPtr(shared, JS::TraceKind::RegExpShared));
330+
return shared;
328331
}
329332

330333
TracingContext context_;

js/src/gc/ClearEdgesTracer.h

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,19 @@ struct ClearEdgesTracer final : public GenericTracer {
1717
ClearEdgesTracer();
1818

1919
template <typename T>
20-
inline bool clearEdge(T** thingp);
21-
22-
bool onObjectEdge(JSObject** objp) override;
23-
bool onStringEdge(JSString** strp) override;
24-
bool onSymbolEdge(JS::Symbol** symp) override;
25-
bool onBigIntEdge(JS::BigInt** bip) override;
26-
bool onScriptEdge(js::BaseScript** scriptp) override;
27-
bool onShapeEdge(js::Shape** shapep) override;
28-
bool onObjectGroupEdge(js::ObjectGroup** groupp) override;
29-
bool onBaseShapeEdge(js::BaseShape** basep) override;
30-
bool onJitCodeEdge(js::jit::JitCode** codep) override;
31-
bool onScopeEdge(js::Scope** scopep) override;
32-
bool onRegExpSharedEdge(js::RegExpShared** sharedp) override;
20+
inline T* onEdge(T* thing);
21+
22+
JSObject* onObjectEdge(JSObject* obj) override;
23+
JSString* onStringEdge(JSString* str) override;
24+
JS::Symbol* onSymbolEdge(JS::Symbol* sym) override;
25+
JS::BigInt* onBigIntEdge(JS::BigInt* bi) override;
26+
js::BaseScript* onScriptEdge(js::BaseScript* script) override;
27+
js::Shape* onShapeEdge(js::Shape* shape) override;
28+
js::ObjectGroup* onObjectGroupEdge(js::ObjectGroup* group) override;
29+
js::BaseShape* onBaseShapeEdge(js::BaseShape* base) override;
30+
js::jit::JitCode* onJitCodeEdge(js::jit::JitCode* code) override;
31+
js::Scope* onScopeEdge(js::Scope* scope) override;
32+
js::RegExpShared* onRegExpSharedEdge(js::RegExpShared* shared) override;
3333
};
3434

3535
} // namespace gc

js/src/gc/GC.cpp

Lines changed: 56 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -2178,41 +2178,40 @@ bool GCRuntime::relocateArenas(Zone* zone, JS::GCReason reason,
21782178
}
21792179

21802180
template <typename T>
2181-
inline bool MovingTracer::updateEdge(T** thingp) {
2182-
auto thing = *thingp;
2181+
inline T* MovingTracer::onEdge(T* thing) {
21832182
if (thing->runtimeFromAnyThread() == runtime() && IsForwarded(thing)) {
2184-
*thingp = Forwarded(thing);
2183+
thing = Forwarded(thing);
21852184
}
21862185

2187-
return true;
2186+
return thing;
21882187
}
21892188

2190-
bool MovingTracer::onObjectEdge(JSObject** objp) { return updateEdge(objp); }
2191-
bool MovingTracer::onShapeEdge(Shape** shapep) { return updateEdge(shapep); }
2192-
bool MovingTracer::onStringEdge(JSString** stringp) {
2193-
return updateEdge(stringp);
2189+
JSObject* MovingTracer::onObjectEdge(JSObject* obj) { return onEdge(obj); }
2190+
Shape* MovingTracer::onShapeEdge(Shape* shape) { return onEdge(shape); }
2191+
JSString* MovingTracer::onStringEdge(JSString* string) {
2192+
return onEdge(string);
21942193
}
2195-
bool MovingTracer::onScriptEdge(js::BaseScript** scriptp) {
2196-
return updateEdge(scriptp);
2194+
js::BaseScript* MovingTracer::onScriptEdge(js::BaseScript* script) {
2195+
return onEdge(script);
21972196
}
2198-
bool MovingTracer::onBaseShapeEdge(BaseShape** basep) {
2199-
return updateEdge(basep);
2197+
BaseShape* MovingTracer::onBaseShapeEdge(BaseShape* base) {
2198+
return onEdge(base);
22002199
}
2201-
bool MovingTracer::onScopeEdge(Scope** scopep) { return updateEdge(scopep); }
2202-
bool MovingTracer::onRegExpSharedEdge(RegExpShared** sharedp) {
2203-
return updateEdge(sharedp);
2200+
Scope* MovingTracer::onScopeEdge(Scope* scope) { return onEdge(scope); }
2201+
RegExpShared* MovingTracer::onRegExpSharedEdge(RegExpShared* shared) {
2202+
return onEdge(shared);
22042203
}
2205-
bool MovingTracer::onBigIntEdge(BigInt** bip) { return updateEdge(bip); }
2206-
bool MovingTracer::onObjectGroupEdge(ObjectGroup** groupp) {
2207-
return updateEdge(groupp);
2204+
BigInt* MovingTracer::onBigIntEdge(BigInt* bi) { return onEdge(bi); }
2205+
ObjectGroup* MovingTracer::onObjectGroupEdge(ObjectGroup* group) {
2206+
return onEdge(group);
22082207
}
2209-
bool MovingTracer::onSymbolEdge(JS::Symbol** symp) {
2210-
MOZ_ASSERT(!(*symp)->isForwarded());
2211-
return true;
2208+
JS::Symbol* MovingTracer::onSymbolEdge(JS::Symbol* sym) {
2209+
MOZ_ASSERT(!sym->isForwarded());
2210+
return sym;
22122211
}
2213-
bool MovingTracer::onJitCodeEdge(jit::JitCode** jitp) {
2214-
MOZ_ASSERT(!(*jitp)->isForwarded());
2215-
return true;
2212+
jit::JitCode* MovingTracer::onJitCodeEdge(jit::JitCode* jit) {
2213+
MOZ_ASSERT(!jit->isForwarded());
2214+
return jit;
22162215
}
22172216

22182217
void Zone::prepareForCompacting() {
@@ -8903,48 +8902,53 @@ js::gc::ClearEdgesTracer::ClearEdgesTracer()
89038902
: ClearEdgesTracer(TlsContext.get()->runtime()) {}
89048903

89058904
template <typename S>
8906-
inline bool js::gc::ClearEdgesTracer::clearEdge(S** thingp) {
8905+
inline S* js::gc::ClearEdgesTracer::onEdge(S* thing) {
89078906
// We don't handle removing pointers to nursery edges from the store buffer
8908-
// with this tracer.
8909-
MOZ_ASSERT(!IsInsideNursery(*thingp));
8907+
// with this tracer. Check that this doesn't happen.
8908+
MOZ_ASSERT(!IsInsideNursery(thing));
89108909

8911-
InternalBarrierMethods<S*>::preBarrier(*thingp);
8912-
*thingp = nullptr;
8913-
return false;
8910+
// Fire the pre-barrier since we're removing an edge from the graph.
8911+
InternalBarrierMethods<S*>::preBarrier(thing);
8912+
8913+
// Return nullptr to clear the edge.
8914+
return nullptr;
89148915
}
89158916

8916-
bool js::gc::ClearEdgesTracer::onObjectEdge(JSObject** objp) {
8917-
return clearEdge(objp);
8917+
JSObject* js::gc::ClearEdgesTracer::onObjectEdge(JSObject* obj) {
8918+
return onEdge(obj);
89188919
}
8919-
bool js::gc::ClearEdgesTracer::onStringEdge(JSString** strp) {
8920-
return clearEdge(strp);
8920+
JSString* js::gc::ClearEdgesTracer::onStringEdge(JSString* str) {
8921+
return onEdge(str);
89218922
}
8922-
bool js::gc::ClearEdgesTracer::onSymbolEdge(JS::Symbol** symp) {
8923-
return clearEdge(symp);
8923+
JS::Symbol* js::gc::ClearEdgesTracer::onSymbolEdge(JS::Symbol* sym) {
8924+
return onEdge(sym);
89248925
}
8925-
bool js::gc::ClearEdgesTracer::onBigIntEdge(JS::BigInt** bip) {
8926-
return clearEdge(bip);
8926+
JS::BigInt* js::gc::ClearEdgesTracer::onBigIntEdge(JS::BigInt* bi) {
8927+
return onEdge(bi);
89278928
}
8928-
bool js::gc::ClearEdgesTracer::onScriptEdge(js::BaseScript** scriptp) {
8929-
return clearEdge(scriptp);
8929+
js::BaseScript* js::gc::ClearEdgesTracer::onScriptEdge(js::BaseScript* script) {
8930+
return onEdge(script);
89308931
}
8931-
bool js::gc::ClearEdgesTracer::onShapeEdge(js::Shape** shapep) {
8932-
return clearEdge(shapep);
8932+
js::Shape* js::gc::ClearEdgesTracer::onShapeEdge(js::Shape* shape) {
8933+
return onEdge(shape);
89338934
}
8934-
bool js::gc::ClearEdgesTracer::onObjectGroupEdge(js::ObjectGroup** groupp) {
8935-
return clearEdge(groupp);
8935+
js::ObjectGroup* js::gc::ClearEdgesTracer::onObjectGroupEdge(
8936+
js::ObjectGroup* group) {
8937+
return onEdge(group);
89368938
}
8937-
bool js::gc::ClearEdgesTracer::onBaseShapeEdge(js::BaseShape** basep) {
8938-
return clearEdge(basep);
8939+
js::BaseShape* js::gc::ClearEdgesTracer::onBaseShapeEdge(js::BaseShape* base) {
8940+
return onEdge(base);
89398941
}
8940-
bool js::gc::ClearEdgesTracer::onJitCodeEdge(js::jit::JitCode** codep) {
8941-
return clearEdge(codep);
8942+
js::jit::JitCode* js::gc::ClearEdgesTracer::onJitCodeEdge(
8943+
js::jit::JitCode* code) {
8944+
return onEdge(code);
89428945
}
8943-
bool js::gc::ClearEdgesTracer::onScopeEdge(js::Scope** scopep) {
8944-
return clearEdge(scopep);
8946+
js::Scope* js::gc::ClearEdgesTracer::onScopeEdge(js::Scope* scope) {
8947+
return onEdge(scope);
89458948
}
8946-
bool js::gc::ClearEdgesTracer::onRegExpSharedEdge(js::RegExpShared** sharedp) {
8947-
return clearEdge(sharedp);
8949+
js::RegExpShared* js::gc::ClearEdgesTracer::onRegExpSharedEdge(
8950+
js::RegExpShared* shared) {
8951+
return onEdge(shared);
89488952
}
89498953

89508954
JS_PUBLIC_API void js::gc::FinalizeDeadNurseryObject(JSContext* cx,

js/src/gc/GCInternals.h

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -223,43 +223,43 @@ struct MovingTracer final : public GenericTracer {
223223
: GenericTracer(rt, JS::TracerKind::Moving,
224224
JS::WeakMapTraceAction::TraceKeysAndValues) {}
225225

226-
bool onObjectEdge(JSObject** objp) override;
227-
bool onShapeEdge(Shape** shapep) override;
228-
bool onStringEdge(JSString** stringp) override;
229-
bool onScriptEdge(js::BaseScript** scriptp) override;
230-
bool onBaseShapeEdge(BaseShape** basep) override;
231-
bool onScopeEdge(Scope** scopep) override;
232-
bool onRegExpSharedEdge(RegExpShared** sharedp) override;
233-
bool onBigIntEdge(BigInt** bip) override;
234-
bool onObjectGroupEdge(ObjectGroup** groupp) override;
235-
bool onSymbolEdge(JS::Symbol** symp) override;
236-
bool onJitCodeEdge(jit::JitCode** jitp) override;
226+
JSObject* onObjectEdge(JSObject* obj) override;
227+
Shape* onShapeEdge(Shape* shape) override;
228+
JSString* onStringEdge(JSString* string) override;
229+
js::BaseScript* onScriptEdge(js::BaseScript* script) override;
230+
BaseShape* onBaseShapeEdge(BaseShape* base) override;
231+
Scope* onScopeEdge(Scope* scope) override;
232+
RegExpShared* onRegExpSharedEdge(RegExpShared* shared) override;
233+
BigInt* onBigIntEdge(BigInt* bi) override;
234+
ObjectGroup* onObjectGroupEdge(ObjectGroup* group) override;
235+
JS::Symbol* onSymbolEdge(JS::Symbol* sym) override;
236+
jit::JitCode* onJitCodeEdge(jit::JitCode* jit) override;
237237

238238
private:
239239
template <typename T>
240-
bool updateEdge(T** thingp);
240+
T* onEdge(T* thingp);
241241
};
242242

243243
struct SweepingTracer final : public GenericTracer {
244244
explicit SweepingTracer(JSRuntime* rt)
245245
: GenericTracer(rt, JS::TracerKind::Sweeping,
246246
JS::WeakMapTraceAction::TraceKeysAndValues) {}
247247

248-
bool onObjectEdge(JSObject** objp) override;
249-
bool onShapeEdge(Shape** shapep) override;
250-
bool onStringEdge(JSString** stringp) override;
251-
bool onScriptEdge(js::BaseScript** scriptp) override;
252-
bool onBaseShapeEdge(BaseShape** basep) override;
253-
bool onJitCodeEdge(jit::JitCode** jitp) override;
254-
bool onScopeEdge(Scope** scopep) override;
255-
bool onRegExpSharedEdge(RegExpShared** sharedp) override;
256-
bool onBigIntEdge(BigInt** bip) override;
257-
bool onObjectGroupEdge(js::ObjectGroup** groupp) override;
258-
bool onSymbolEdge(JS::Symbol** symp) override;
248+
JSObject* onObjectEdge(JSObject* obj) override;
249+
Shape* onShapeEdge(Shape* shape) override;
250+
JSString* onStringEdge(JSString* string) override;
251+
js::BaseScript* onScriptEdge(js::BaseScript* script) override;
252+
BaseShape* onBaseShapeEdge(BaseShape* base) override;
253+
jit::JitCode* onJitCodeEdge(jit::JitCode* jit) override;
254+
Scope* onScopeEdge(Scope* scope) override;
255+
RegExpShared* onRegExpSharedEdge(RegExpShared* shared) override;
256+
BigInt* onBigIntEdge(BigInt* bi) override;
257+
js::ObjectGroup* onObjectGroupEdge(js::ObjectGroup* group) override;
258+
JS::Symbol* onSymbolEdge(JS::Symbol* sym) override;
259259

260260
private:
261261
template <typename T>
262-
bool sweepEdge(T** thingp);
262+
T* onEdge(T* thingp);
263263
};
264264

265265
// Structure for counting how many times objects in a particular group have

0 commit comments

Comments
 (0)