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

Commit 8cd5d0a

Browse files
committed
Fix extend issue being stuck in endless loop
Fixes #3006
1 parent 4da7c4b commit 8cd5d0a

File tree

4 files changed

+35
-15
lines changed

4 files changed

+35
-15
lines changed

src/eval_selectors.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ namespace Sass {
4646
SelectorList* Eval::operator()(ComplexSelector* s)
4747
{
4848
bool implicit_parent = !exp.old_at_root_without_rule;
49-
if (is_in_selector_schema) exp.pushToSelectorStack({});
49+
if (is_in_selector_schema) exp.pushNullSelector();
5050
SelectorListObj other = s->resolve_parent_refs(
51-
exp.getSelectorStack(), traces, implicit_parent);
52-
if (is_in_selector_schema) exp.popFromSelectorStack();
51+
exp.getOriginalStack(), traces, implicit_parent);
52+
if (is_in_selector_schema) exp.popNullSelector();
5353

5454
for (size_t i = 0; i < other->length(); i++) {
5555
ComplexSelectorObj sel = other->at(i);

src/expand.cpp

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,17 @@ namespace Sass {
3838
env_stack.push_back(env);
3939
block_stack.push_back(nullptr);
4040
call_stack.push_back({});
41-
if (stack == NULL) { pushToSelectorStack({}); }
41+
if (stack == NULL) { pushNullSelector(); }
4242
else {
4343
for (auto item : *stack) {
44-
if (item.isNull()) pushToSelectorStack({});
44+
if (item.isNull()) pushNullSelector();
4545
else pushToSelectorStack(item);
4646
}
4747
}
48-
if (originals == NULL) { pushToOriginalStack({}); }
48+
if (originals == NULL) { pushNullSelector(); }
4949
else {
5050
for (auto item : *stack) {
51-
if (item.isNull()) pushToOriginalStack({});
51+
if (item.isNull()) pushNullSelector();
5252
else pushToOriginalStack(item);
5353
}
5454
}
@@ -62,6 +62,23 @@ namespace Sass {
6262
return 0;
6363
}
6464

65+
void Expand::pushNullSelector()
66+
{
67+
pushToSelectorStack({});
68+
pushToOriginalStack({});
69+
}
70+
71+
void Expand::popNullSelector()
72+
{
73+
popFromOriginalStack();
74+
popFromSelectorStack();
75+
}
76+
77+
SelectorStack Expand::getOriginalStack()
78+
{
79+
return originalStack;
80+
}
81+
6582
SelectorStack Expand::getSelectorStack()
6683
{
6784
return selector_stack;
@@ -153,15 +170,15 @@ namespace Sass {
153170
Block* bb = operator()(r->block());
154171
Keyframe_Rule_Obj k = SASS_MEMORY_NEW(Keyframe_Rule, r->pstate(), bb);
155172
if (r->schema()) {
156-
pushToSelectorStack({});
173+
pushNullSelector();
157174
k->name(eval(r->schema()));
158-
popFromSelectorStack();
175+
popNullSelector();
159176
}
160177
else if (r->selector()) {
161178
if (SelectorListObj s = r->selector()) {
162-
pushToSelectorStack({});
179+
pushNullSelector();
163180
k->name(eval(s));
164-
popFromSelectorStack();
181+
popNullSelector();
165182
}
166183
}
167184

@@ -288,10 +305,10 @@ namespace Sass {
288305
Block* ab = a->block();
289306
SelectorList* as = a->selector();
290307
Expression* av = a->value();
291-
pushToSelectorStack({});
308+
pushNullSelector();
292309
if (av) av = av->perform(&eval);
293310
if (as) as = eval(as);
294-
popFromSelectorStack();
311+
popNullSelector();
295312
Block* bb = ab ? operator()(ab) : NULL;
296313
Directive* aa = SASS_MEMORY_NEW(Directive,
297314
a->pstate(),

src/expand.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ namespace Sass {
2222
SelectorListObj& selector();
2323
SelectorListObj& original();
2424
SelectorListObj popFromSelectorStack();
25+
SelectorStack getOriginalStack();
2526
SelectorStack getSelectorStack();
27+
void pushNullSelector();
28+
void popNullSelector();
2629
void pushToSelectorStack(SelectorListObj selector);
2730

2831
SelectorListObj popFromOriginalStack();

src/extender.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,8 @@ namespace Sass {
126126
std::unordered_map<
127127
SimpleSelectorObj,
128128
size_t,
129-
ObjHash,
130-
ObjEquality
129+
ObjPtrHash,
130+
ObjPtrEquality
131131
> sourceSpecificity;
132132

133133
// ##########################################################################

0 commit comments

Comments
 (0)