sassc 1.1.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c9080673dad2273d4097ecd900db41e63dea013a
4
- data.tar.gz: 46faf54ba57c07110d44de98d32fed6e486fa840
3
+ metadata.gz: bc1ddb620763b2dad7308dd18a9c91c82192162d
4
+ data.tar.gz: c533165c997f081c2736e299e5de9da5bfe59d3b
5
5
  SHA512:
6
- metadata.gz: 1186759b3cea8bd98914dce75264a0eab73ee53ec842719153bf6045c6673177106cf772ef7042f0c4ebc5c0f0079c77aeee7510938fb9a1363a015021537a7c
7
- data.tar.gz: 59adf72cd185db6cd9d517b7677386b42c3ef8da593a13a8e5889c1a44b4aacb6cfd7499442764b588d2f4e463c08009a1aa22babc551a2a4f8638053d55f5f2
6
+ metadata.gz: addcd9ccee78f7b39e7c8931fbae374c19dee6601c14553255f3cc665c51985614c0b6a8abc223d3391b61f82170b296e64205693016fc71dd73c951f94b1a6b
7
+ data.tar.gz: 29f40e46fd1713286196044415f168b1e3b7c07169f54f9c564ef528d5d70357325bcdf27164018b94a88a974116e7dfe0be514b5099826b43070e83eb1a57e4
data/ext/libsass/ast.cpp CHANGED
@@ -26,29 +26,29 @@ namespace Sass {
26
26
  }
27
27
 
28
28
  bool Complex_Selector::operator==(const Complex_Selector& rhs) const {
29
- // TODO: We have to access the tail directly using tail_ since ADD_PROPERTY doesn't provide a const version.
29
+ // TODO: We have to access the tail directly using tail_ since ADD_PROPERTY doesn't provide a const version.
30
30
 
31
- const Complex_Selector* pOne = this;
31
+ const Complex_Selector* pOne = this;
32
32
  const Complex_Selector* pTwo = &rhs;
33
33
 
34
34
  // Consume any empty references at the beginning of the Complex_Selector
35
35
  if (pOne->combinator() == Complex_Selector::ANCESTOR_OF && pOne->head()->is_empty_reference()) {
36
- pOne = pOne->tail_;
36
+ pOne = pOne->tail_;
37
37
  }
38
38
  if (pTwo->combinator() == Complex_Selector::ANCESTOR_OF && pTwo->head()->is_empty_reference()) {
39
- pTwo = pTwo->tail_;
39
+ pTwo = pTwo->tail_;
40
40
  }
41
41
 
42
42
  while (pOne && pTwo) {
43
- if (pOne->combinator() != pTwo->combinator()) {
44
- return false;
43
+ if (pOne->combinator() != pTwo->combinator()) {
44
+ return false;
45
45
  }
46
46
 
47
47
  if (*(pOne->head()) != *(pTwo->head())) {
48
- return false;
48
+ return false;
49
49
  }
50
50
 
51
- pOne = pOne->tail_;
51
+ pOne = pOne->tail_;
52
52
  pTwo = pTwo->tail_;
53
53
  }
54
54
 
@@ -68,10 +68,10 @@ namespace Sass {
68
68
 
69
69
  bool Simple_Selector::operator==(const Simple_Selector& rhs) const
70
70
  {
71
- // Compare the string representations for equality.
71
+ // Compare the string representations for equality.
72
72
 
73
- // Cast away const here. To_String should take a const object, but it doesn't.
74
- Simple_Selector* pLHS = const_cast<Simple_Selector*>(this);
73
+ // Cast away const here. To_String should take a const object, but it doesn't.
74
+ Simple_Selector* pLHS = const_cast<Simple_Selector*>(this);
75
75
  Simple_Selector* pRHS = const_cast<Simple_Selector*>(&rhs);
76
76
 
77
77
  To_String to_string;
@@ -79,10 +79,10 @@ namespace Sass {
79
79
  }
80
80
 
81
81
  bool Simple_Selector::operator<(const Simple_Selector& rhs) const {
82
- // Use the string representation for ordering.
82
+ // Use the string representation for ordering.
83
83
 
84
- // Cast away const here. To_String should take a const object, but it doesn't.
85
- Simple_Selector* pLHS = const_cast<Simple_Selector*>(this);
84
+ // Cast away const here. To_String should take a const object, but it doesn't.
85
+ Simple_Selector* pLHS = const_cast<Simple_Selector*>(this);
86
86
  Simple_Selector* pRHS = const_cast<Simple_Selector*>(&rhs);
87
87
 
88
88
  To_String to_string;
@@ -217,32 +217,46 @@ namespace Sass {
217
217
  set<string> lpsuedoset, rpsuedoset;
218
218
  for (size_t i = 0, L = length(); i < L; ++i)
219
219
  {
220
- if ((*this)[i]->is_pseudo_element()) {
221
- string pseudo((*this)[i]->perform(&to_string));
220
+ if ((*this)[i]->is_pseudo_element()) {
221
+ string pseudo((*this)[i]->perform(&to_string));
222
222
  pseudo = pseudo.substr(pseudo.find_first_not_of(":")); // strip off colons to ensure :after matches ::after since ruby sass is forgiving
223
- lpsuedoset.insert(pseudo);
223
+ lpsuedoset.insert(pseudo);
224
224
  }
225
225
  }
226
226
  for (size_t i = 0, L = rhs->length(); i < L; ++i)
227
227
  {
228
- if ((*rhs)[i]->is_pseudo_element()) {
229
- string pseudo((*rhs)[i]->perform(&to_string));
228
+ if ((*rhs)[i]->is_pseudo_element()) {
229
+ string pseudo((*rhs)[i]->perform(&to_string));
230
230
  pseudo = pseudo.substr(pseudo.find_first_not_of(":")); // strip off colons to ensure :after matches ::after since ruby sass is forgiving
231
- rpsuedoset.insert(pseudo);
231
+ rpsuedoset.insert(pseudo);
232
232
  }
233
233
  }
234
- if (lpsuedoset != rpsuedoset) {
234
+ if (lpsuedoset != rpsuedoset) {
235
235
  return false;
236
236
  }
237
237
 
238
- // Check the Simple_Selectors
238
+ // Check the Simple_Selectors
239
239
 
240
240
  set<string> lset, rset;
241
241
 
242
242
  if (!lbase) // no lbase; just see if the left-hand qualifiers are a subset of the right-hand selector
243
243
  {
244
244
  for (size_t i = 0, L = length(); i < L; ++i)
245
- { lset.insert((*this)[i]->perform(&to_string)); }
245
+ {
246
+ Selector* lhs = (*this)[i];
247
+ // very special case for wrapped matches selector
248
+ if (Wrapped_Selector* wrapped = dynamic_cast<Wrapped_Selector*>(lhs)) {
249
+ if (wrapped->name() == ":matches(" || wrapped->name() == ":-moz-any(") {
250
+ if (Selector_List* list = dynamic_cast<Selector_List*>(wrapped->selector())) {
251
+ if (Compound_Selector* comp = dynamic_cast<Compound_Selector*>(rhs)) {
252
+ if (list->is_superselector_of(comp)) return true;
253
+ }
254
+ }
255
+ }
256
+ }
257
+ // match from here on as strings
258
+ lset.insert(lhs->perform(&to_string));
259
+ }
246
260
  for (size_t i = 0, L = rhs->length(); i < L; ++i)
247
261
  { rset.insert((*rhs)[i]->perform(&to_string)); }
248
262
  return includes(rset.begin(), rset.end(), lset.begin(), lset.end());
@@ -274,33 +288,33 @@ namespace Sass {
274
288
  set<string> lpsuedoset, rpsuedoset;
275
289
  for (size_t i = 0, L = length(); i < L; ++i)
276
290
  {
277
- if ((*this)[i]->is_pseudo_element()) {
278
- string pseudo((*this)[i]->perform(&to_string));
291
+ if ((*this)[i]->is_pseudo_element()) {
292
+ string pseudo((*this)[i]->perform(&to_string));
279
293
  pseudo = pseudo.substr(pseudo.find_first_not_of(":")); // strip off colons to ensure :after matches ::after since ruby sass is forgiving
280
- lpsuedoset.insert(pseudo);
294
+ lpsuedoset.insert(pseudo);
281
295
  }
282
296
  }
283
297
  for (size_t i = 0, L = rhs.length(); i < L; ++i)
284
298
  {
285
- if (rhs[i]->is_pseudo_element()) {
286
- string pseudo(rhs[i]->perform(&to_string));
299
+ if (rhs[i]->is_pseudo_element()) {
300
+ string pseudo(rhs[i]->perform(&to_string));
287
301
  pseudo = pseudo.substr(pseudo.find_first_not_of(":")); // strip off colons to ensure :after matches ::after since ruby sass is forgiving
288
- rpsuedoset.insert(pseudo);
302
+ rpsuedoset.insert(pseudo);
289
303
  }
290
304
  }
291
- if (lpsuedoset != rpsuedoset) {
305
+ if (lpsuedoset != rpsuedoset) {
292
306
  return false;
293
307
  }
294
308
 
295
- // Check the base
309
+ // Check the base
296
310
 
297
311
  const Simple_Selector* const lbase = base();
298
312
  const Simple_Selector* const rbase = rhs.base();
299
313
 
300
314
  if ((lbase && !rbase) ||
301
- (!lbase && rbase) ||
315
+ (!lbase && rbase) ||
302
316
  ((lbase && rbase) && (*lbase != *rbase))) {
303
- return false;
317
+ return false;
304
318
  }
305
319
 
306
320
 
@@ -326,8 +340,6 @@ namespace Sass {
326
340
 
327
341
  bool Complex_Selector::is_superselector_of(Compound_Selector* rhs)
328
342
  {
329
- if (length() != 1)
330
- { return false; }
331
343
  return base()->is_superselector_of(rhs);
332
344
  }
333
345
 
@@ -352,6 +364,16 @@ namespace Sass {
352
364
  if (l_len == 1)
353
365
  { return lhs->head()->is_superselector_of(rhs->base()); }
354
366
 
367
+ // we have to look one tail deeper, since we cary the
368
+ // combinator around for it (which is important here)
369
+ if (rhs->tail() && lhs->tail() && combinator() != Complex_Selector::ANCESTOR_OF) {
370
+ Complex_Selector* lhs_tail = lhs->tail();
371
+ Complex_Selector* rhs_tail = rhs->tail();
372
+ if (lhs_tail->combinator() != rhs_tail->combinator()) return false;
373
+ if (!lhs_tail->head()->is_superselector_of(rhs_tail->head())) return false;
374
+ }
375
+
376
+
355
377
  bool found = false;
356
378
  Complex_Selector* marker = rhs;
357
379
  for (size_t i = 0, L = rhs->length(); i < L; ++i) {
@@ -458,7 +480,7 @@ namespace Sass {
458
480
  Complex_Selector* cpy = new (ctx.mem) Complex_Selector(*this);
459
481
 
460
482
  if (head()) {
461
- cpy->head(head()->clone(ctx));
483
+ cpy->head(head()->clone(ctx));
462
484
  }
463
485
 
464
486
  if (tail()) {
@@ -493,6 +515,50 @@ namespace Sass {
493
515
  #endif
494
516
  }
495
517
 
518
+ // it's a superselector if every selector of the right side
519
+ // list is a superselector of the given left side selector
520
+ bool Complex_Selector::is_superselector_of(Selector_List *sub)
521
+ {
522
+ // Check every rhs selector against left hand list
523
+ for(size_t i = 0, L = sub->length(); i < L; ++i) {
524
+ if (!is_superselector_of((*sub)[i])) return false;
525
+ }
526
+ return true;
527
+ }
528
+
529
+ // it's a superselector if every selector of the right side
530
+ // list is a superselector of the given left side selector
531
+ bool Selector_List::is_superselector_of(Selector_List *sub)
532
+ {
533
+ // Check every rhs selector against left hand list
534
+ for(size_t i = 0, L = sub->length(); i < L; ++i) {
535
+ if (!is_superselector_of((*sub)[i])) return false;
536
+ }
537
+ return true;
538
+ }
539
+
540
+ // it's a superselector if every selector on the right side
541
+ // is a superselector of any one of the left side selectors
542
+ bool Selector_List::is_superselector_of(Compound_Selector *sub)
543
+ {
544
+ // Check every lhs selector against right hand
545
+ for(size_t i = 0, L = length(); i < L; ++i) {
546
+ if ((*this)[i]->is_superselector_of(sub)) return true;
547
+ }
548
+ return false;
549
+ }
550
+
551
+ // it's a superselector if every selector on the right side
552
+ // is a superselector of any one of the left side selectors
553
+ bool Selector_List::is_superselector_of(Complex_Selector *sub)
554
+ {
555
+ // Check every lhs selector against right hand
556
+ for(size_t i = 0, L = length(); i < L; ++i) {
557
+ if ((*this)[i]->is_superselector_of(sub)) return true;
558
+ }
559
+ return false;
560
+ }
561
+
496
562
  /* not used anymore - remove?
497
563
  Selector_Placeholder* Selector_List::find_placeholder()
498
564
  {
@@ -663,7 +729,7 @@ namespace Sass {
663
729
  // skip already canceled out unit
664
730
  if (exponents[denom] >= 0) continue;
665
731
  // skip all units we don't know how to convert
666
- if (string_to_unit(denom) == INCOMMENSURABLE) continue;
732
+ if (string_to_unit(denom) == UNKNOWN) continue;
667
733
  // now search for nominator
668
734
  while (nom_it != nom_end)
669
735
  {
@@ -672,7 +738,7 @@ namespace Sass {
672
738
  // skip already canceled out unit
673
739
  if (exponents[nom] <= 0) continue;
674
740
  // skip all units we don't know how to convert
675
- if (string_to_unit(nom) == INCOMMENSURABLE) continue;
741
+ if (string_to_unit(nom) == UNKNOWN) continue;
676
742
  // we now have two convertable units
677
743
  // add factor for current conversion
678
744
  factor *= conversion_factor(nom, denom);
@@ -707,7 +773,10 @@ namespace Sass {
707
773
 
708
774
  // maybe convert to other unit
709
775
  // easier implemented on its own
710
- convert(prefered);
776
+ try { convert(prefered); }
777
+ catch (incompatibleUnits& err)
778
+ { error(err.what(), pstate()); }
779
+ catch (...) { throw; }
711
780
 
712
781
  }
713
782
 
@@ -743,7 +812,7 @@ namespace Sass {
743
812
  // skip already canceled out unit
744
813
  if (exponents[denom] >= 0) continue;
745
814
  // skip all units we don't know how to convert
746
- if (string_to_unit(denom) == INCOMMENSURABLE) continue;
815
+ if (string_to_unit(denom) == UNKNOWN) continue;
747
816
  // we now have two convertable units
748
817
  // add factor for current conversion
749
818
  factor *= conversion_factor(denom, prefered);
@@ -764,7 +833,7 @@ namespace Sass {
764
833
  // skip already canceled out unit
765
834
  if (exponents[nom] <= 0) continue;
766
835
  // skip all units we don't know how to convert
767
- if (string_to_unit(nom) == INCOMMENSURABLE) continue;
836
+ if (string_to_unit(nom) == UNKNOWN) continue;
768
837
  // we now have two convertable units
769
838
  // add factor for current conversion
770
839
  factor *= conversion_factor(nom, prefered);
@@ -801,11 +870,11 @@ namespace Sass {
801
870
  {
802
871
  for (size_t i = 0, S = numerator_units_.size(); i < S; ++i) {
803
872
  string u(numerator_units_[i]);
804
- if (string_to_unit(u) != INCOMMENSURABLE) return u;
873
+ if (string_to_unit(u) != UNKNOWN) return u;
805
874
  }
806
875
  for (size_t i = 0, S = denominator_units_.size(); i < S; ++i) {
807
876
  string u(denominator_units_[i]);
808
- if (string_to_unit(u) != INCOMMENSURABLE) return u;
877
+ if (string_to_unit(u) != UNKNOWN) return u;
809
878
  }
810
879
  return string();
811
880
  }
@@ -853,6 +922,18 @@ namespace Sass {
853
922
  return operator==(&rhs);
854
923
  }
855
924
 
925
+ size_t List::size() const {
926
+ if (!is_arglist_) return length();
927
+ // arglist expects a list of arguments
928
+ // so we need to break before keywords
929
+ for (size_t i = 0, L = length(); i < L; ++i) {
930
+ if (Argument* arg = dynamic_cast<Argument*>((*this)[i])) {
931
+ if (!arg->name().empty()) return i;
932
+ }
933
+ }
934
+ return length();
935
+ }
936
+
856
937
  Expression* Hashed::at(Expression* k) const
857
938
  {
858
939
  if (elements_.count(k))
data/ext/libsass/ast.hpp CHANGED
@@ -757,6 +757,7 @@ namespace Sass {
757
757
  bool is_invisible() { return !length(); }
758
758
  Expression* value_at_index(size_t i);
759
759
 
760
+ virtual size_t size() const;
760
761
  virtual bool operator==(Expression& rhs) const;
761
762
  virtual bool operator==(Expression* rhs) const;
762
763
 
@@ -1359,21 +1360,22 @@ namespace Sass {
1359
1360
  ////////////////////////////////////////////////////////
1360
1361
  class String_Constant : public String {
1361
1362
  ADD_PROPERTY(char, quote_mark);
1363
+ ADD_PROPERTY(bool, can_compress_whitespace);
1362
1364
  ADD_PROPERTY(string, value);
1363
1365
  protected:
1364
1366
  size_t hash_;
1365
1367
  public:
1366
1368
  String_Constant(ParserState pstate, string val)
1367
- : String(pstate), quote_mark_(0), value_(read_css_string(val)), hash_(0)
1369
+ : String(pstate), quote_mark_(0), can_compress_whitespace_(false), value_(read_css_string(val)), hash_(0)
1368
1370
  { }
1369
1371
  String_Constant(ParserState pstate, const char* beg)
1370
- : String(pstate), quote_mark_(0), value_(read_css_string(string(beg))), hash_(0)
1372
+ : String(pstate), quote_mark_(0), can_compress_whitespace_(false), value_(read_css_string(string(beg))), hash_(0)
1371
1373
  { }
1372
1374
  String_Constant(ParserState pstate, const char* beg, const char* end)
1373
- : String(pstate), quote_mark_(0), value_(read_css_string(string(beg, end-beg))), hash_(0)
1375
+ : String(pstate), quote_mark_(0), can_compress_whitespace_(false), value_(read_css_string(string(beg, end-beg))), hash_(0)
1374
1376
  { }
1375
1377
  String_Constant(ParserState pstate, const Token& tok)
1376
- : String(pstate), quote_mark_(0), value_(read_css_string(string(tok.begin, tok.end))), hash_(0)
1378
+ : String(pstate), quote_mark_(0), can_compress_whitespace_(false), value_(read_css_string(string(tok.begin, tok.end))), hash_(0)
1377
1379
  { }
1378
1380
  string type() { return "string"; }
1379
1381
  static string type_name() { return "string"; }
@@ -1941,7 +1943,9 @@ namespace Sass {
1941
1943
  return (*this)[0];
1942
1944
  return 0;
1943
1945
  }
1944
- bool is_superselector_of(Compound_Selector* rhs);
1946
+ bool is_superselector_of(Compound_Selector* sub);
1947
+ // bool is_superselector_of(Complex_Selector* sub);
1948
+ // bool is_superselector_of(Selector_List* sub);
1945
1949
  virtual unsigned long specificity()
1946
1950
  {
1947
1951
  int sum = 0;
@@ -1998,8 +2002,9 @@ namespace Sass {
1998
2002
  Complex_Selector* context(Context&);
1999
2003
  Complex_Selector* innermost();
2000
2004
  size_t length();
2001
- bool is_superselector_of(Compound_Selector*);
2002
- bool is_superselector_of(Complex_Selector*);
2005
+ bool is_superselector_of(Compound_Selector* sub);
2006
+ bool is_superselector_of(Complex_Selector* sub);
2007
+ bool is_superselector_of(Selector_List* sub);
2003
2008
  // virtual Selector_Placeholder* find_placeholder();
2004
2009
  Combinator clear_innermost();
2005
2010
  void set_innermost(Complex_Selector*, Combinator);
@@ -2084,6 +2089,9 @@ namespace Sass {
2084
2089
  : Selector(pstate), Vectorized<Complex_Selector*>(s), wspace_(0)
2085
2090
  { }
2086
2091
  // virtual Selector_Placeholder* find_placeholder();
2092
+ bool is_superselector_of(Compound_Selector* sub);
2093
+ bool is_superselector_of(Complex_Selector* sub);
2094
+ bool is_superselector_of(Selector_List* sub);
2087
2095
  virtual unsigned long specificity()
2088
2096
  {
2089
2097
  unsigned long sum = 0;
data/ext/libsass/bind.cpp CHANGED
@@ -47,14 +47,40 @@ namespace Sass {
47
47
 
48
48
  // If the current parameter is the rest parameter, process and break the loop
49
49
  if (p->is_rest_parameter()) {
50
+ // The next argument by coincidence provides a rest argument
50
51
  if (a->is_rest_argument()) {
51
- // rest param and rest arg -- just add one to the other
52
- if (env->has_local(p->name())) {
53
- *static_cast<List*>(env->local_frame()[p->name()])
54
- += static_cast<List*>(a->value());
52
+ // We should always get a list for rest arguments
53
+ if (List* rest = dynamic_cast<List*>(a->value())) {
54
+ // arg contains a list
55
+ List* args = rest;
56
+ // make sure it's an arglist
57
+ if (rest->is_arglist()) {
58
+ // can pass it through as it was
59
+ env->local_frame()[p->name()] = args;
60
+ }
61
+ // create a new list and wrap each item as an argument
62
+ // otherwise we will not be able to fetch it again
63
+ else {
64
+ // create a new list object for wrapped items
65
+ List* arglist = new (ctx.mem) List(p->pstate(),
66
+ 0,
67
+ rest->separator(),
68
+ true);
69
+ // wrap each item from list as an argument
70
+ for (Expression* item : rest->elements()) {
71
+ (*arglist) << new (ctx.mem) Argument(item->pstate(),
72
+ item,
73
+ "",
74
+ false,
75
+ false);
76
+ }
77
+ // assign new arglist to environment
78
+ env->local_frame()[p->name()] = arglist;
79
+ }
55
80
  }
81
+ // invalid state
56
82
  else {
57
- env->local_frame()[p->name()] = a->value();
83
+ throw runtime_error("invalid state");
58
84
  }
59
85
  } else if (a->is_keyword_argument()) {
60
86
 
@@ -67,27 +93,43 @@ namespace Sass {
67
93
  (*arglist) << new (ctx.mem) Argument(key->pstate(),
68
94
  argmap->at(key),
69
95
  name,
96
+ false,
70
97
  false);
71
98
  }
72
99
 
73
100
  } else {
74
101
 
75
- // copy all remaining arguments into the rest parameter, preserving names
102
+ // create a new list object for wrapped items
76
103
  List* arglist = new (ctx.mem) List(p->pstate(),
77
104
  0,
78
105
  List::COMMA,
79
106
  true);
80
- env->local_frame()[p->name()] = arglist;
107
+ // consume the next args
81
108
  while (ia < LA) {
82
- a = (*as)[ia];
109
+ // get and post inc
110
+ a = (*as)[ia++];
111
+ // wrap current argument into new object
83
112
  (*arglist) << new (ctx.mem) Argument(a->pstate(),
84
113
  a->value(),
85
114
  a->name(),
115
+ false,
86
116
  false);
87
- ++ia;
117
+ // check if we have rest argument
118
+ if (a->is_rest_argument()) {
119
+ // preserve the list separator from rest args
120
+ if (List* rest = dynamic_cast<List*>(a->value())) {
121
+ arglist->separator(rest->separator());
122
+ }
123
+ // no more arguments
124
+ break;
125
+ }
88
126
  }
127
+ // assign new arglist to environment
128
+ env->local_frame()[p->name()] = arglist;
89
129
  }
130
+ // consumed parameter
90
131
  ++ip;
132
+ // no more paramaters
91
133
  break;
92
134
  }
93
135
 
@@ -104,7 +146,11 @@ namespace Sass {
104
146
  a = static_cast<Argument*>((*arglist)[0]);
105
147
  } else {
106
148
  Expression* a_to_convert = (*arglist)[0];
107
- a = new (ctx.mem) Argument(a_to_convert->pstate(), a_to_convert, "", false);
149
+ a = new (ctx.mem) Argument(a_to_convert->pstate(),
150
+ a_to_convert,
151
+ "",
152
+ false,
153
+ false);
108
154
  }
109
155
  arglist->elements().erase(arglist->elements().begin());
110
156
  if (!arglist->length() || (!arglist->is_arglist() && ip + 1 == LP)) {
@@ -162,6 +208,7 @@ namespace Sass {
162
208
  env->local_frame()[a->name()] = a->value();
163
209
  }
164
210
  }
211
+ // EO while ia
165
212
 
166
213
  // If we make it here, we're out of args but may have leftover params.
167
214
  // That's only okay if they have default values, or were already bound by