Skip to content

Commit e820c83

Browse files
authored
Merge pull request #3007 from mgreter/bugfix/3006-extend-with-parent
Fix extend issue being stuck in endless loop
2 parents e116b49 + fdf63e4 commit e820c83

File tree

5 files changed

+35
-15
lines changed

5 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: 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.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1070,10 +1070,10 @@ namespace Sass {
10701070
// the result so that, if two selectors are identical, we keep the first one.
10711071
std::vector<ComplexSelectorObj> result; size_t numOriginals = 0;
10721072

1073-
// Use label to quit outer loop
1074-
redo:
1073+
size_t i = selectors.size();
1074+
outer: // Use label to continue loop
1075+
while (--i != std::string::npos) {
10751076

1076-
for (size_t i = selectors.size() - 1; i != std::string::npos; i--) {
10771077
const ComplexSelectorObj& complex1 = selectors[i];
10781078
// Check if selector in known in existing "originals"
10791079
// For custom behavior dart-sass had `isOriginal(complex1)`
@@ -1083,7 +1083,7 @@ namespace Sass {
10831083
for (size_t j = 0; j < numOriginals; j++) {
10841084
if (ObjEqualityFn(result[j], complex1)) {
10851085
rotateSlice(result, 0, j + 1);
1086-
goto redo;
1086+
goto outer;
10871087
}
10881088
}
10891089
result.insert(result.begin(), complex1);

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)