import changes from `dev' branch of rmottola/Arctic-Fox:

- namespace comment (0548ea8a8)
- Bug 1167411 - Add JSAutoStructuredCloneBuffer::abandon, r=jorendorff (6589a8900)
- Bug 911972 - MessagePort and MessageChannel in workers, r=smaug, r=bent (4c533d3ca)
- Bug 1172264 - Track the MDSM's duration as a TimeUnit and eliminate the separate concept of 'end time'. r=jww (49f8f2442)
- Bug 1172264 - Require Manual disconnection for all mirrors. r=jww (845e57496)
- Bug 1172264 - Switch MediaDecoder's mDuration represenation to a double. r=jww (dfde6482d)
- Bug 1172264 - Mirror duration from the MDSM to the MediaDecoder. r=jww (a744fd08f)
- No bug. Refactor GC type annotations, re=terrence (b6bc5723e)
- Bug 1132744 - Update set of GC types, r=sfink (935175adb)
- Bug 967031 - Rename DumpHeapComplete to DumpHeap; r=terrence (337391745)
- Bug 1169097 - Remove CountHeap; r=sfink (074fdb34c)
- Bug 1169086 - Use virtual dispatch to implement callback tracer; r=jonco, r=mccr8 (667218a33)
This commit is contained in:
2021-04-03 23:50:45 +08:00
parent 5bd78e063a
commit 6f81d7d0dc
119 changed files with 4621 additions and 1926 deletions
+22 -38
View File
@@ -109,19 +109,15 @@ public:
} // namespace mozilla
static void
TraceWeakMappingChild(JS::CallbackTracer* aTrc, void** aThingp,
JS::TraceKind aKind);
struct NoteWeakMapChildrenTracer : public JS::CallbackTracer
{
NoteWeakMapChildrenTracer(JSRuntime* aRt,
nsCycleCollectionNoteRootCallback& aCb)
: JS::CallbackTracer(aRt, TraceWeakMappingChild), mCb(aCb),
mTracedAny(false), mMap(nullptr), mKey(nullptr),
mKeyDelegate(nullptr)
: JS::CallbackTracer(aRt), mCb(aCb), mTracedAny(false), mMap(nullptr),
mKey(nullptr), mKeyDelegate(nullptr)
{
}
void trace(void** aThingp, JS::TraceKind aKind) override;
nsCycleCollectionNoteRootCallback& mCb;
bool mTracedAny;
JSObject* mMap;
@@ -129,29 +125,24 @@ struct NoteWeakMapChildrenTracer : public JS::CallbackTracer
JSObject* mKeyDelegate;
};
static void
TraceWeakMappingChild(JS::CallbackTracer* aTrc, void** aThingp,
JS::TraceKind aKind)
void
NoteWeakMapChildrenTracer::trace(void** aThingp, JS::TraceKind aKind)
{
MOZ_ASSERT(aTrc->hasCallback(TraceWeakMappingChild));
NoteWeakMapChildrenTracer* tracer =
static_cast<NoteWeakMapChildrenTracer*>(aTrc);
JS::GCCellPtr thing(*aThingp, aKind);
if (thing.isString()) {
return;
}
if (!JS::GCThingIsMarkedGray(thing) && !tracer->mCb.WantAllTraces()) {
if (!JS::GCThingIsMarkedGray(thing) && !mCb.WantAllTraces()) {
return;
}
if (AddToCCKind(thing.kind())) {
tracer->mCb.NoteWeakMapping(tracer->mMap, tracer->mKey,
tracer->mKeyDelegate, thing);
tracer->mTracedAny = true;
mCb.NoteWeakMapping(mMap, mKey, mKeyDelegate, thing);
mTracedAny = true;
} else {
JS_TraceChildren(aTrc, thing.asCell(), thing.kind());
JS_TraceChildren(this, thing.asCell(), thing.kind());
}
}
@@ -317,27 +308,21 @@ JSZoneParticipant::Traverse(void* aPtr, nsCycleCollectionTraversalCallback& aCb)
return NS_OK;
}
static void
NoteJSChildTracerShim(JS::CallbackTracer* aTrc, void** aThingp,
JS::TraceKind aTraceKind);
struct TraversalTracer : public JS::CallbackTracer
{
TraversalTracer(JSRuntime* aRt, nsCycleCollectionTraversalCallback& aCb)
: JS::CallbackTracer(aRt, NoteJSChildTracerShim, DoNotTraceWeakMaps),
mCb(aCb)
: JS::CallbackTracer(aRt, DoNotTraceWeakMaps), mCb(aCb)
{
}
void trace(void** aThingp, JS::TraceKind aTraceKind) override;
nsCycleCollectionTraversalCallback& mCb;
};
static void
NoteJSChild(JS::CallbackTracer* aTrc, JS::GCCellPtr aThing)
NoteJSChild(TraversalTracer* aTrc, JS::GCCellPtr aThing)
{
TraversalTracer* tracer = static_cast<TraversalTracer*>(aTrc);
// Don't traverse non-gray objects, unless we want all traces.
if (!JS::GCThingIsMarkedGray(aThing) && !tracer->mCb.WantAllTraces()) {
if (!JS::GCThingIsMarkedGray(aThing) && !aTrc->mCb.WantAllTraces()) {
return;
}
@@ -349,15 +334,15 @@ NoteJSChild(JS::CallbackTracer* aTrc, JS::GCCellPtr aThing)
* use special APIs to handle such chains iteratively.
*/
if (AddToCCKind(aThing.kind())) {
if (MOZ_UNLIKELY(tracer->mCb.WantDebugInfo())) {
if (MOZ_UNLIKELY(aTrc->mCb.WantDebugInfo())) {
char buffer[200];
tracer->getTracingEdgeName(buffer, sizeof(buffer));
tracer->mCb.NoteNextEdgeName(buffer);
aTrc->getTracingEdgeName(buffer, sizeof(buffer));
aTrc->mCb.NoteNextEdgeName(buffer);
}
if (aThing.isObject()) {
tracer->mCb.NoteJSObject(aThing.toObject());
aTrc->mCb.NoteJSObject(aThing.toObject());
} else {
tracer->mCb.NoteJSScript(aThing.toScript());
aTrc->mCb.NoteJSScript(aThing.toScript());
}
} else if (aThing.isShape()) {
// The maximum depth of traversal when tracing a Shape is unbounded, due to
@@ -373,12 +358,11 @@ NoteJSChild(JS::CallbackTracer* aTrc, JS::GCCellPtr aThing)
}
}
static void
NoteJSChildTracerShim(JS::CallbackTracer* aTrc, void** aThingp,
JS::TraceKind aTraceKind)
void
TraversalTracer::trace(void** aThingp, JS::TraceKind aTraceKind)
{
JS::GCCellPtr thing(*aThingp, aTraceKind);
NoteJSChild(aTrc, thing);
NoteJSChild(this, thing);
}
static void
@@ -1025,7 +1009,7 @@ CycleCollectedJSRuntime::DeferredFinalize(nsISupports* aSupports)
void
CycleCollectedJSRuntime::DumpJSHeap(FILE* aFile)
{
js::DumpHeapComplete(Runtime(), aFile, js::CollectNurseryBeforeDump);
js::DumpHeap(Runtime(), aFile, js::CollectNurseryBeforeDump);
}