Skip to content

Commit 1ec3876

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

File tree

4 files changed

+31
-11
lines changed

4 files changed

+31
-11
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: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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)