Skip to content
This repository was archived by the owner on Jul 9, 2025. It is now read-only.

Commit d5ffb48

Browse files
committed
Backed out changeset da45331c242c (bug 1661766) for wpt failure on timestamp.html on a CLOSED TREE.
1 parent 2475fda commit d5ffb48

2 files changed

Lines changed: 318 additions & 145 deletions

File tree

js/src/gc/GCMarker.h

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)