@@ -1511,6 +1511,16 @@ namespace Sass {
1511
1511
};
1512
1512
Node Extend::extendCompoundSelector (Compound_Selector_Ptr pSelector, CompoundSelectorSet& seen, bool isReplace) {
1513
1513
1514
+ /* this turned out to be too much overhead
1515
+ probably due to holding a "Node" object
1516
+ // check if we already extended this selector
1517
+ // we can do this since subset_map is "static"
1518
+ auto memoized = memoizeCompound.find(pSelector);
1519
+ if (memoized != memoizeCompound.end()) {
1520
+ return memoized->second.klone();
1521
+ }
1522
+ */
1523
+
1514
1524
DEBUG_EXEC (EXTEND_COMPOUND, printCompoundSelector (pSelector, " EXTEND COMPOUND: " ))
1515
1525
// TODO: Ruby has another loop here to skip certain members?
1516
1526
@@ -1658,6 +1668,10 @@ namespace Sass {
1658
1668
1659
1669
DEBUG_EXEC (EXTEND_COMPOUND, printCompoundSelector (pSelector, " EXTEND COMPOUND END: " ))
1660
1670
1671
+ // this turned out to be too much overhead
1672
+ // memory results in a map table - since extending is very expensive
1673
+ // memoizeCompound.insert(std::pair<Compound_Selector_Obj, Node>(pSelector, results));
1674
+
1661
1675
return results;
1662
1676
}
1663
1677
@@ -1721,6 +1735,13 @@ namespace Sass {
1721
1735
*/
1722
1736
Node Extend::extendComplexSelector (Complex_Selector_Ptr selector, CompoundSelectorSet& seen, bool isReplace, bool isOriginal) {
1723
1737
1738
+ // check if we already extended this selector
1739
+ // we can do this since subset_map is "static"
1740
+ auto memoized = memoizeComplex.find (selector);
1741
+ if (memoized != memoizeComplex.end ()) {
1742
+ return memoized->second ;
1743
+ }
1744
+
1724
1745
// convert the input selector to extend node format
1725
1746
Node complexSelector = complexSelectorToNode (selector);
1726
1747
DEBUG_PRINTLN (EXTEND_COMPLEX, " EXTEND COMPLEX: " << complexSelector)
@@ -1825,6 +1846,9 @@ namespace Sass {
1825
1846
DEBUG_PRINTLN (EXTEND_COMPLEX, " >>>>> EXTENDED: " << extendedSelectors)
1826
1847
DEBUG_PRINTLN (EXTEND_COMPLEX, " EXTEND COMPLEX END: " << complexSelector)
1827
1848
1849
+ // memory results in a map table - since extending is very expensive
1850
+ memoizeComplex.insert (std::pair<Complex_Selector_Obj, Node>(selector, flattened));
1851
+
1828
1852
// return trim(WEAVES)
1829
1853
return flattened;
1830
1854
}
@@ -1840,6 +1864,14 @@ namespace Sass {
1840
1864
1841
1865
Selector_List_Obj pNewSelectors = SASS_MEMORY_NEW (Selector_List, pSelectorList->pstate (), pSelectorList->length ());
1842
1866
1867
+ // check if we already extended this selector
1868
+ // we can do this since subset_map is "static"
1869
+ auto memoized = memoizeList.find (pSelectorList);
1870
+ if (memoized != memoizeList.end ()) {
1871
+ extendedSomething = true ;
1872
+ return memoized->second ;
1873
+ }
1874
+
1843
1875
extendedSomething = false ;
1844
1876
// process each comlplex selector in the selector list.
1845
1877
// Find the ones that can be extended by given subset_map.
@@ -1949,6 +1981,10 @@ namespace Sass {
1949
1981
cur = cur->tail ();
1950
1982
}
1951
1983
}
1984
+
1985
+ // memory results in a map table - since extending is very expensive
1986
+ memoizeList.insert (std::pair<Selector_List_Obj, Selector_List_Obj>(pSelectorList, pNewSelectors));
1987
+
1952
1988
return pNewSelectors.detach ();
1953
1989
1954
1990
}
0 commit comments