--- Marking.h
+++ Marking.h
@@ -11,16 +11,17 @@
 #include "mozilla/HashFunctions.h"
 
 #include "jsfriendapi.h"
 
 #include "ds/OrderedHashTable.h"
 #include "gc/Heap.h"
 #include "gc/Tracer.h"
 #include "js/GCAPI.h"
+#include "js/HeapAPI.h"
 #include "js/SliceBudget.h"
 #include "js/TracingAPI.h"
 
 class JSLinearString;
 class JSRope;
 namespace js {
 class BaseShape;
 class GCMarker;
@@ -141,17 +142,27 @@ namespace gc {
 struct WeakKeyTableHashPolicy {
     typedef JS::GCCellPtr Lookup;
     static HashNumber hash(const Lookup& v) { return mozilla::HashGeneric(v.asCell()); }
     static bool match(const JS::GCCellPtr& k, const Lookup& l) { return k == l; }
     static bool isEmpty(const JS::GCCellPtr& v) { return !v; }
     static void makeEmpty(JS::GCCellPtr* vp) { *vp = nullptr; }
 };
 
-typedef Vector<WeakMapBase*, 2, js::SystemAllocPolicy> WeakEntryVector;
+struct WeakMarkable {
+    WeakMapBase* weakmap;
+    JS::GCCellPtr key;
+
+    WeakMarkable(WeakMapBase* weakmapArg, JS::GCCellPtr&& keyArg)
+      : weakmap(weakmapArg), key(keyArg) {}
+    WeakMarkable(WeakMapBase* weakmapArg, JS::GCCellPtr keyArg)
+      : weakmap(weakmapArg), key(keyArg) {}
+};
+
+typedef Vector<WeakMarkable, 2, js::SystemAllocPolicy> WeakEntryVector;
 
 typedef OrderedHashMap<JS::GCCellPtr,
                        WeakEntryVector,
                        WeakKeyTableHashPolicy,
                        js::SystemAllocPolicy> WeakKeyTable;
 
 } /* namespace gc */
 
@@ -203,16 +214,20 @@ class GCMarker : public JSTracer
     }
 
     void endWeakMarkingPhase() {
         MOZ_ASSERT_IF(weakMapAction() == ExpandWeakMaps, tag_ == TracerKindTag::WeakMarking);
         tag_ = TracerKindTag::Marking;
         weakKeys.clear();
     }
 
+    void abortLinearWeakMarking() {
+        endWeakMarkingPhase();
+    }
+
     void delayMarkingArena(gc::ArenaHeader* aheader);
     void delayMarkingChildren(const void* thing);
     void markDelayedChildren(gc::ArenaHeader* aheader);
     bool markDelayedChildren(SliceBudget& budget);
     bool hasDelayedChildren() const {
         return !!unmarkedArenaStackTop;
     }
 
@@ -228,17 +243,17 @@ class GCMarker : public JSTracer
 
 #ifdef DEBUG
     bool shouldCheckCompartments() { return strictCompartmentChecking; }
 #endif
 
     /* This is public exclusively for ScanRope. */
     MarkStack stack;
     
-    void markEphemeronValues(gc::Cell* oldKey, gc::WeakEntryVector& entry);
+    void markEphemeronValues(gc::Cell* markedCell, gc::WeakEntryVector& entry);
 
     /*
      * Mapping from not yet marked keys to a vector of all values that the key
      * maps to in any live weak map.
      */
     gc::WeakKeyTable weakKeys;
 
   private:
