blob: 07083c5389bbc8c2eaf5726f9417b081066fc82f [file] [log] [blame]
--- Marking.cpp
+++ Marking.cpp
@@ -587,68 +587,70 @@ DispatchToTracer(JSTracer* trc, T* thing
DoCallback(trc->asCallbackTracer(), thingp, name);
}
/*** GC Marking Interface *************************************************************************/
namespace js {
+typedef bool DoNothingMarkingType;
+
template <typename T>
struct LinearlyMarkedEphemeronKeyType {
- typedef bool Type; // used to instantiate a do-nothing markPotentialEphemeronKeyHelper
+ typedef DoNothingMarkingType Type;
};
// For now, we only handle JSObject* keys, but the linear time algorithm can be
-// easily extended by adding in more types here, then having them call
-// markPotentialEphemeronKey in their GCMarker::traverse instantiation.
+// easily extended by adding in more types here, then instantiating a
+// GCMarker::traverse method that calls markPotentialEphemeronKey.
template <>
struct LinearlyMarkedEphemeronKeyType<JSObject*> {
typedef JSObject* Type;
};
// Iterate over the vector. It should not be appended to during iteration
// because the key is already marked, and even in cases where we have a
// multipart key, we should only be inserting entries for the unmarked
// portions.
void
-GCMarker::markEphemeronValues(gc::Cell* oldKey, WeakEntryVector& values)
+GCMarker::markEphemeronValues(gc::Cell* markedCell, WeakEntryVector& values)
{
size_t initialLen = values.length();
for (size_t i = 0; i < initialLen; i++)
- values[i]->maybeMarkEntry(this, oldKey);
+ values[i].weakmap->maybeMarkEntry(this, markedCell, values[i].key);
MOZ_ASSERT(values.length() == initialLen);
}
template <typename T>
void
-GCMarker::markPotentialEphemeronKeyHelper(T oldThing)
+GCMarker::markPotentialEphemeronKeyHelper(T markedThing)
{
if (!isWeakMarkingTracer())
return;
- auto weakValues = weakKeys.get(JS::GCCellPtr(oldThing));
+ auto weakValues = weakKeys.get(JS::GCCellPtr(markedThing));
if (!weakValues)
return;
- markEphemeronValues(oldThing, weakValues->value);
+ markEphemeronValues(markedThing, weakValues->value);
weakValues->value.clear(); // If key address is reused, it should do nothing
}
template <>
void
GCMarker::markPotentialEphemeronKeyHelper(bool)
{
}
template <typename T>
void
-GCMarker::markPotentialEphemeronKey(T* oldThing)
+GCMarker::markPotentialEphemeronKey(T* thing)
{
- markPotentialEphemeronKeyHelper<typename LinearlyMarkedEphemeronKeyType<T*>::Type>(oldThing);
+ markPotentialEphemeronKeyHelper<typename LinearlyMarkedEphemeronKeyType<T*>::Type>(thing);
}
} // namespace js
template <typename T>
static inline bool
MustSkipMarking(T thing)
{