@@ -81,10 +81,10 @@ class MarkStack {
8181 * the context of push or pop operation.
8282 */
8383 enum Tag {
84- SlotsRangeTag,
85- ElementsRangeTag,
84+ ValueArrayTag,
8685 ObjectTag,
8786 GroupTag,
87+ SavedValueArrayTag,
8888 JitCodeTag,
8989 ScriptTag,
9090 TempRopeTag,
@@ -110,18 +110,28 @@ class MarkStack {
110110 template <typename T>
111111 T* as () const ;
112112
113- JSObject* asSlotsRangeObject () const ;
114- JSObject* asElementsRangeObject () const ;
113+ JSObject* asValueArrayObject () const ;
114+ JSObject* asSavedValueArrayObject () const ;
115115 JSRope* asTempRope () const ;
116116
117117 void assertValid () const ;
118118 };
119119
120- struct SlotsOrElementsRange {
121- SlotsOrElementsRange (Tag, JSObject* obj, size_t start);
120+ struct ValueArray {
121+ ValueArray ( JSObject* obj, HeapSlot* start, HeapSlot* end );
122122 void assertValid () const ;
123123
124- size_t start;
124+ HeapSlot* end;
125+ HeapSlot* start;
126+ TaggedPtr ptr;
127+ };
128+
129+ struct SavedValueArray {
130+ SavedValueArray (JSObject* obj, size_t index, HeapSlot::Kind kind);
131+ void assertValid () const ;
132+
133+ uintptr_t kind;
134+ uintptr_t index;
125135 TaggedPtr ptr;
126136 };
127137
@@ -146,8 +156,9 @@ class MarkStack {
146156 template <typename T>
147157 MOZ_MUST_USE bool push (T* ptr);
148158
149- MOZ_MUST_USE bool push (JSObject* obj, HeapSlot::Kind kind, size_t start);
150- MOZ_MUST_USE bool push (const SlotsOrElementsRange& array);
159+ MOZ_MUST_USE bool push (JSObject* obj, HeapSlot* start, HeapSlot* end);
160+ MOZ_MUST_USE bool push (const ValueArray& array);
161+ MOZ_MUST_USE bool push (const SavedValueArray& array);
151162
152163 // GCMarker::eagerlyMarkChildren uses unused marking stack as temporary
153164 // storage to hold rope pointers.
@@ -157,7 +168,8 @@ class MarkStack {
157168
158169 Tag peekTag () const ;
159170 TaggedPtr popPtr ();
160- SlotsOrElementsRange popSlotsOrElementsRange ();
171+ ValueArray popValueArray ();
172+ SavedValueArray popSavedValueArray ();
161173
162174 void clear () {
163175 // Fall back to the smaller initial capacity so we don't hold on to excess
@@ -217,11 +229,14 @@ class MarkStackIter {
217229 bool done () const ;
218230 MarkStack::Tag peekTag () const ;
219231 MarkStack::TaggedPtr peekPtr () const ;
220- MarkStack::SlotsOrElementsRange peekSlotsOrElementsRange () const ;
232+ MarkStack::ValueArray peekValueArray () const ;
221233 void next ();
222234 void nextPtr ();
223235 void nextArray ();
224236
237+ // Mutate the current ValueArray to a SavedValueArray.
238+ void saveValueArray (const MarkStack::SavedValueArray& savedArray);
239+
225240 private:
226241 size_t position () const ;
227242};
@@ -406,10 +421,7 @@ class GCMarker : public JSTracer {
406421 template <typename T>
407422 inline void pushTaggedPtr (T* ptr);
408423
409- enum class RangeKind { Elements, FixedSlots, DynamicSlots };
410-
411- inline void pushValueRange (JSObject* obj, RangeKind kind, size_t start,
412- size_t end);
424+ inline void pushValueArray (JSObject* obj, HeapSlot* start, HeapSlot* end);
413425
414426 bool isMarkStackEmpty () { return stack.isEmpty () && auxStack.isEmpty (); }
415427
@@ -421,6 +433,16 @@ class GCMarker : public JSTracer {
421433 return !getStack (gc::MarkColor::Gray).isEmpty ();
422434 }
423435
436+ MOZ_MUST_USE bool restoreValueArray (
437+ const gc::MarkStack::SavedValueArray& array, HeapSlot** vpp,
438+ HeapSlot** endp);
439+ gc::MarkStack::ValueArray restoreValueArray (
440+ const gc::MarkStack::SavedValueArray& savedArray);
441+
442+ void saveValueRanges ();
443+ gc::MarkStack::SavedValueArray saveValueRange (
444+ const gc::MarkStack::ValueArray& array);
445+
424446 inline void processMarkStackTop (SliceBudget& budget);
425447
426448 void markDelayedChildren (gc::Arena* arena, gc::MarkColor color);
0 commit comments