| --- 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) |
| { |