sassc 2.1.0.pre3 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -0
  3. data/CHANGELOG.md +24 -0
  4. data/Rakefile +2 -4
  5. data/ext/extconf.rb +13 -5
  6. data/ext/libsass/VERSION +1 -1
  7. data/ext/libsass/include/sass/base.h +2 -1
  8. data/ext/libsass/include/sass/context.h +4 -0
  9. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  10. data/ext/libsass/src/ast.cpp +158 -168
  11. data/ext/libsass/src/ast.hpp +389 -230
  12. data/ext/libsass/src/ast_def_macros.hpp +18 -10
  13. data/ext/libsass/src/ast_fwd_decl.cpp +4 -3
  14. data/ext/libsass/src/ast_fwd_decl.hpp +98 -165
  15. data/ext/libsass/src/ast_helpers.hpp +292 -0
  16. data/ext/libsass/src/ast_sel_cmp.cpp +219 -732
  17. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  18. data/ext/libsass/src/ast_sel_unify.cpp +207 -212
  19. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  20. data/ext/libsass/src/ast_selectors.cpp +594 -1026
  21. data/ext/libsass/src/ast_selectors.hpp +339 -385
  22. data/ext/libsass/src/ast_supports.cpp +36 -52
  23. data/ext/libsass/src/ast_supports.hpp +29 -29
  24. data/ext/libsass/src/ast_values.cpp +271 -84
  25. data/ext/libsass/src/ast_values.hpp +116 -107
  26. data/ext/libsass/src/backtrace.cpp +9 -9
  27. data/ext/libsass/src/backtrace.hpp +5 -5
  28. data/ext/libsass/src/base64vlq.cpp +2 -2
  29. data/ext/libsass/src/base64vlq.hpp +1 -1
  30. data/ext/libsass/src/bind.cpp +18 -18
  31. data/ext/libsass/src/bind.hpp +1 -1
  32. data/ext/libsass/src/c2ast.cpp +3 -3
  33. data/ext/libsass/src/c2ast.hpp +1 -1
  34. data/ext/libsass/src/cencode.c +4 -6
  35. data/ext/libsass/src/check_nesting.cpp +40 -41
  36. data/ext/libsass/src/check_nesting.hpp +6 -2
  37. data/ext/libsass/src/color_maps.cpp +14 -13
  38. data/ext/libsass/src/color_maps.hpp +1 -9
  39. data/ext/libsass/src/constants.cpp +5 -0
  40. data/ext/libsass/src/constants.hpp +6 -0
  41. data/ext/libsass/src/context.cpp +92 -119
  42. data/ext/libsass/src/context.hpp +41 -53
  43. data/ext/libsass/src/cssize.cpp +66 -149
  44. data/ext/libsass/src/cssize.hpp +17 -23
  45. data/ext/libsass/src/dart_helpers.hpp +199 -0
  46. data/ext/libsass/src/debugger.hpp +451 -295
  47. data/ext/libsass/src/emitter.cpp +15 -16
  48. data/ext/libsass/src/emitter.hpp +10 -12
  49. data/ext/libsass/src/environment.cpp +27 -27
  50. data/ext/libsass/src/environment.hpp +29 -24
  51. data/ext/libsass/src/error_handling.cpp +62 -41
  52. data/ext/libsass/src/error_handling.hpp +61 -51
  53. data/ext/libsass/src/eval.cpp +167 -281
  54. data/ext/libsass/src/eval.hpp +27 -29
  55. data/ext/libsass/src/eval_selectors.cpp +75 -0
  56. data/ext/libsass/src/expand.cpp +275 -222
  57. data/ext/libsass/src/expand.hpp +36 -16
  58. data/ext/libsass/src/extender.cpp +1188 -0
  59. data/ext/libsass/src/extender.hpp +399 -0
  60. data/ext/libsass/src/extension.cpp +43 -0
  61. data/ext/libsass/src/extension.hpp +89 -0
  62. data/ext/libsass/src/file.cpp +81 -72
  63. data/ext/libsass/src/file.hpp +28 -37
  64. data/ext/libsass/src/fn_colors.cpp +20 -18
  65. data/ext/libsass/src/fn_lists.cpp +30 -29
  66. data/ext/libsass/src/fn_maps.cpp +3 -3
  67. data/ext/libsass/src/fn_miscs.cpp +34 -46
  68. data/ext/libsass/src/fn_numbers.cpp +20 -13
  69. data/ext/libsass/src/fn_selectors.cpp +98 -128
  70. data/ext/libsass/src/fn_strings.cpp +47 -33
  71. data/ext/libsass/src/fn_utils.cpp +31 -29
  72. data/ext/libsass/src/fn_utils.hpp +17 -11
  73. data/ext/libsass/src/inspect.cpp +186 -148
  74. data/ext/libsass/src/inspect.hpp +31 -29
  75. data/ext/libsass/src/lexer.cpp +20 -82
  76. data/ext/libsass/src/lexer.hpp +5 -16
  77. data/ext/libsass/src/listize.cpp +23 -37
  78. data/ext/libsass/src/listize.hpp +8 -9
  79. data/ext/libsass/src/mapping.hpp +1 -0
  80. data/ext/libsass/src/memory.hpp +12 -0
  81. data/ext/libsass/src/memory/allocator.cpp +48 -0
  82. data/ext/libsass/src/memory/allocator.hpp +138 -0
  83. data/ext/libsass/src/memory/config.hpp +20 -0
  84. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  85. data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
  86. data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +55 -9
  87. data/ext/libsass/src/operation.hpp +71 -61
  88. data/ext/libsass/src/operators.cpp +19 -18
  89. data/ext/libsass/src/operators.hpp +11 -11
  90. data/ext/libsass/src/ordered_map.hpp +112 -0
  91. data/ext/libsass/src/output.cpp +45 -64
  92. data/ext/libsass/src/output.hpp +6 -6
  93. data/ext/libsass/src/parser.cpp +512 -700
  94. data/ext/libsass/src/parser.hpp +89 -97
  95. data/ext/libsass/src/parser_selectors.cpp +189 -0
  96. data/ext/libsass/src/permutate.hpp +164 -0
  97. data/ext/libsass/src/plugins.cpp +7 -7
  98. data/ext/libsass/src/plugins.hpp +8 -8
  99. data/ext/libsass/src/position.cpp +7 -26
  100. data/ext/libsass/src/position.hpp +44 -21
  101. data/ext/libsass/src/prelexer.cpp +6 -6
  102. data/ext/libsass/src/remove_placeholders.cpp +55 -56
  103. data/ext/libsass/src/remove_placeholders.hpp +21 -18
  104. data/ext/libsass/src/sass.cpp +16 -15
  105. data/ext/libsass/src/sass.hpp +10 -5
  106. data/ext/libsass/src/sass2scss.cpp +4 -4
  107. data/ext/libsass/src/sass_context.cpp +91 -122
  108. data/ext/libsass/src/sass_context.hpp +2 -2
  109. data/ext/libsass/src/sass_functions.cpp +1 -1
  110. data/ext/libsass/src/sass_values.cpp +8 -11
  111. data/ext/libsass/src/settings.hpp +19 -0
  112. data/ext/libsass/src/source.cpp +69 -0
  113. data/ext/libsass/src/source.hpp +95 -0
  114. data/ext/libsass/src/source_data.hpp +32 -0
  115. data/ext/libsass/src/source_map.cpp +22 -18
  116. data/ext/libsass/src/source_map.hpp +12 -9
  117. data/ext/libsass/src/stylesheet.cpp +22 -0
  118. data/ext/libsass/src/stylesheet.hpp +57 -0
  119. data/ext/libsass/src/to_value.cpp +2 -2
  120. data/ext/libsass/src/to_value.hpp +1 -1
  121. data/ext/libsass/src/units.cpp +24 -22
  122. data/ext/libsass/src/units.hpp +8 -8
  123. data/ext/libsass/src/utf8_string.cpp +9 -10
  124. data/ext/libsass/src/utf8_string.hpp +7 -6
  125. data/ext/libsass/src/util.cpp +48 -50
  126. data/ext/libsass/src/util.hpp +20 -21
  127. data/ext/libsass/src/util_string.cpp +111 -61
  128. data/ext/libsass/src/util_string.hpp +62 -8
  129. data/ext/libsass/src/values.cpp +12 -12
  130. data/lib/sassc/engine.rb +5 -3
  131. data/lib/sassc/functions_handler.rb +11 -13
  132. data/lib/sassc/native.rb +9 -7
  133. data/lib/sassc/script.rb +4 -6
  134. data/lib/sassc/version.rb +1 -1
  135. data/test/functions_test.rb +38 -1
  136. data/test/native_test.rb +4 -4
  137. metadata +31 -18
  138. data/ext/libsass/src/extend.cpp +0 -2132
  139. data/ext/libsass/src/extend.hpp +0 -86
  140. data/ext/libsass/src/node.cpp +0 -322
  141. data/ext/libsass/src/node.hpp +0 -118
  142. data/ext/libsass/src/paths.hpp +0 -71
  143. data/ext/libsass/src/sass_util.cpp +0 -152
  144. data/ext/libsass/src/sass_util.hpp +0 -256
  145. data/ext/libsass/src/subset_map.cpp +0 -58
  146. data/ext/libsass/src/subset_map.hpp +0 -76
  147. data/lib/sassc/native/lib_c.rb +0 -21
@@ -2,12 +2,12 @@
2
2
  // __EXTENSIONS__ fix on Solaris.
3
3
  #include "sass.hpp"
4
4
 
5
- #include <cctype>
6
5
  #include <iomanip>
7
6
  #include "ast.hpp"
8
7
  #include "fn_utils.hpp"
9
8
  #include "fn_colors.hpp"
10
9
  #include "util.hpp"
10
+ #include "util_string.hpp"
11
11
 
12
12
  namespace Sass {
13
13
 
@@ -16,16 +16,16 @@ namespace Sass {
16
16
  bool string_argument(AST_Node_Obj obj) {
17
17
  String_Constant* s = Cast<String_Constant>(obj);
18
18
  if (s == nullptr) return false;
19
- const std::string& str = s->value();
19
+ const sass::string& str = s->value();
20
20
  return starts_with(str, "calc(") ||
21
21
  starts_with(str, "var(");
22
22
  }
23
23
 
24
- void hsla_alpha_percent_deprecation(const ParserState& pstate, const std::string val)
24
+ void hsla_alpha_percent_deprecation(const SourceSpan& pstate, const sass::string val)
25
25
  {
26
26
 
27
- std::string msg("Passing a percentage as the alpha value to hsla() will be interpreted");
28
- std::string tail("differently in future versions of Sass. For now, use " + val + " instead.");
27
+ sass::string msg("Passing a percentage as the alpha value to hsla() will be interpreted");
28
+ sass::string tail("differently in future versions of Sass. For now, use " + val + " instead.");
29
29
 
30
30
  deprecated(msg, tail, false, pstate);
31
31
 
@@ -104,7 +104,7 @@ namespace Sass {
104
104
  if (
105
105
  string_argument(env["$alpha"])
106
106
  ) {
107
- std::stringstream strm;
107
+ sass::ostream strm;
108
108
  strm << "rgba("
109
109
  << (int)c_arg->r() << ", "
110
110
  << (int)c_arg->g() << ", "
@@ -145,7 +145,7 @@ namespace Sass {
145
145
  return SASS_MEMORY_NEW(Number, pstate, color->b());
146
146
  }
147
147
 
148
- Color_RGBA* colormix(Context& ctx, ParserState& pstate, Color* color1, Color* color2, double weight) {
148
+ Color_RGBA* colormix(Context& ctx, SourceSpan& pstate, Color* color1, Color* color2, double weight) {
149
149
  Color_RGBA_Obj c1 = color1->toRGBA();
150
150
  Color_RGBA_Obj c2 = color2->toRGBA();
151
151
  double p = weight/100;
@@ -163,11 +163,11 @@ namespace Sass {
163
163
  c1->a()*p + c2->a()*(1-p));
164
164
  }
165
165
 
166
- Signature mix_sig = "mix($color-1, $color-2, $weight: 50%)";
166
+ Signature mix_sig = "mix($color1, $color2, $weight: 50%)";
167
167
  BUILT_IN(mix)
168
168
  {
169
- Color_Obj color1 = ARG("$color-1", Color);
170
- Color_Obj color2 = ARG("$color-2", Color);
169
+ Color_Obj color1 = ARG("$color1", Color);
170
+ Color_Obj color2 = ARG("$color2", Color);
171
171
  double weight = DARG_U_PRCT("$weight");
172
172
  return colormix(ctx, pstate, color1, color2, weight);
173
173
 
@@ -230,7 +230,7 @@ namespace Sass {
230
230
  Number_Obj val = SASS_MEMORY_COPY(alpha);
231
231
  val->numerators.clear(); // convert
232
232
  val->value(val->value() / 100.0);
233
- std::string nr(val->to_string(ctx.c_options));
233
+ sass::string nr(val->to_string(ctx.c_options));
234
234
  hsla_alpha_percent_deprecation(pstate, nr);
235
235
  }
236
236
 
@@ -361,12 +361,16 @@ namespace Sass {
361
361
  {
362
362
  // CSS3 filter function overload: pass literal through directly
363
363
  Number* amount = Cast<Number>(env["$color"]);
364
+ double weight = DARG_U_PRCT("$weight");
364
365
  if (amount) {
366
+ // TODO: does not throw on 100% manually passed as value
367
+ if (weight < 100.0) {
368
+ error("Only one argument may be passed to the plain-CSS invert() function.", pstate, traces);
369
+ }
365
370
  return SASS_MEMORY_NEW(String_Quoted, pstate, "invert(" + amount->to_string(ctx.c_options) + ")");
366
371
  }
367
372
 
368
373
  Color* col = ARG("$color", Color);
369
- double weight = DARG_U_PRCT("$weight");
370
374
  Color_RGBA_Obj inv = col->copyAsRGBA();
371
375
  inv->r(clip(255.0 - inv->r(), 0.0, 255.0));
372
376
  inv->g(clip(255.0 - inv->g(), 0.0, 255.0));
@@ -504,7 +508,7 @@ namespace Sass {
504
508
  double lscale = (l ? DARG_R_PRCT("$lightness") : 0.0) / 100.0;
505
509
  double ascale = (a ? DARG_R_PRCT("$alpha") : 0.0) / 100.0;
506
510
  if (hscale) c->h(c->h() + hscale * (hscale > 0.0 ? 360.0 - c->h() : c->h()));
507
- if (sscale) c->s(c->s() + sscale * (sscale > 0.0 ? 100.0 - c->l() : c->s()));
511
+ if (sscale) c->s(c->s() + sscale * (sscale > 0.0 ? 100.0 - c->s() : c->s()));
508
512
  if (lscale) c->l(c->l() + lscale * (lscale > 0.0 ? 100.0 - c->l() : c->l()));
509
513
  if (ascale) c->a(c->a() + ascale * (ascale > 0.0 ? 1.0 - c->a() : c->a()));
510
514
  return c.detach();
@@ -575,17 +579,15 @@ namespace Sass {
575
579
  double b = clip(c->b(), 0.0, 255.0);
576
580
  double a = clip(c->a(), 0.0, 1.0) * 255.0;
577
581
 
578
- std::stringstream ss;
582
+ sass::ostream ss;
579
583
  ss << '#' << std::setw(2) << std::setfill('0');
580
584
  ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(a, ctx.c_options.precision));
581
585
  ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(r, ctx.c_options.precision));
582
586
  ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(g, ctx.c_options.precision));
583
587
  ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(b, ctx.c_options.precision));
584
588
 
585
- std::string result(ss.str());
586
- for (size_t i = 0, L = result.length(); i < L; ++i) {
587
- result[i] = std::toupper(result[i]);
588
- }
589
+ sass::string result = ss.str();
590
+ Util::ascii_str_toupper(&result);
589
591
  return SASS_MEMORY_NEW(String_Quoted, pstate, result);
590
592
  }
591
593
 
@@ -1,3 +1,7 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
3
+ #include "sass.hpp"
4
+
1
5
  #include "listize.hpp"
2
6
  #include "operators.hpp"
3
7
  #include "fn_utils.hpp"
@@ -17,9 +21,9 @@ namespace Sass {
17
21
  List_Obj arglist = SASS_MEMORY_COPY(ARG("$args", List)); // copy
18
22
  Map_Obj result = SASS_MEMORY_NEW(Map, pstate, 1);
19
23
  for (size_t i = arglist->size(), L = arglist->length(); i < L; ++i) {
20
- Expression_Obj obj = arglist->at(i);
24
+ ExpressionObj obj = arglist->at(i);
21
25
  Argument_Obj arg = (Argument*) obj.ptr(); // XXX
22
- std::string name = std::string(arg->name());
26
+ sass::string name = sass::string(arg->name());
23
27
  name = name.erase(0, 1); // sanitize name (remove dollar sign)
24
28
  *result << std::make_pair(SASS_MEMORY_NEW(String_Quoted,
25
29
  pstate, name),
@@ -31,8 +35,8 @@ namespace Sass {
31
35
  Signature length_sig = "length($list)";
32
36
  BUILT_IN(length)
33
37
  {
34
- if (Selector_List* sl = Cast<Selector_List>(env["$list"])) {
35
- return SASS_MEMORY_NEW(Number, pstate, (double)sl->length());
38
+ if (SelectorList * sl = Cast<SelectorList>(env["$list"])) {
39
+ return SASS_MEMORY_NEW(Number, pstate, (double) sl->length());
36
40
  }
37
41
  Expression* v = ARG("$list", Expression);
38
42
  if (v->concrete_type() == Expression::MAP) {
@@ -40,9 +44,9 @@ namespace Sass {
40
44
  return SASS_MEMORY_NEW(Number, pstate, (double)(map ? map->length() : 1));
41
45
  }
42
46
  if (v->concrete_type() == Expression::SELECTOR) {
43
- if (Compound_Selector* h = Cast<Compound_Selector>(v)) {
47
+ if (CompoundSelector * h = Cast<CompoundSelector>(v)) {
44
48
  return SASS_MEMORY_NEW(Number, pstate, (double)h->length());
45
- } else if (Selector_List* ls = Cast<Selector_List>(v)) {
49
+ } else if (SelectorList * ls = Cast<SelectorList>(v)) {
46
50
  return SASS_MEMORY_NEW(Number, pstate, (double)ls->length());
47
51
  } else {
48
52
  return SASS_MEMORY_NEW(Number, pstate, 1);
@@ -60,18 +64,16 @@ namespace Sass {
60
64
  {
61
65
  double nr = ARGVAL("$n");
62
66
  Map* m = Cast<Map>(env["$list"]);
63
- if (Selector_List* sl = Cast<Selector_List>(env["$list"])) {
67
+ if (SelectorList * sl = Cast<SelectorList>(env["$list"])) {
64
68
  size_t len = m ? m->length() : sl->length();
65
69
  bool empty = m ? m->empty() : sl->empty();
66
- if (empty) error("argument `$list` of `" + std::string(sig) + "` must not be empty", pstate, traces);
70
+ if (empty) error("argument `$list` of `" + sass::string(sig) + "` must not be empty", pstate, traces);
67
71
  double index = std::floor(nr < 0 ? len + nr : nr - 1);
68
- if (index < 0 || index > len - 1) error("index out of bounds for `" + std::string(sig) + "`", pstate, traces);
69
- // return (*sl)[static_cast<int>(index)];
70
- Listize listize;
71
- return Cast<Value>((*sl)[static_cast<int>(index)]->perform(&listize));
72
+ if (index < 0 || index > len - 1) error("index out of bounds for `" + sass::string(sig) + "`", pstate, traces);
73
+ return Cast<Value>(Listize::perform(sl->get(static_cast<int>(index))));
72
74
  }
73
75
  List_Obj l = Cast<List>(env["$list"]);
74
- if (nr == 0) error("argument `$n` of `" + std::string(sig) + "` must be non-zero", pstate, traces);
76
+ if (nr == 0) error("argument `$n` of `" + sass::string(sig) + "` must be non-zero", pstate, traces);
75
77
  // if the argument isn't a list, then wrap it in a singleton list
76
78
  if (!m && !l) {
77
79
  l = SASS_MEMORY_NEW(List, pstate, 1);
@@ -79,9 +81,9 @@ namespace Sass {
79
81
  }
80
82
  size_t len = m ? m->length() : l->length();
81
83
  bool empty = m ? m->empty() : l->empty();
82
- if (empty) error("argument `$list` of `" + std::string(sig) + "` must not be empty", pstate, traces);
84
+ if (empty) error("argument `$list` of `" + sass::string(sig) + "` must not be empty", pstate, traces);
83
85
  double index = std::floor(nr < 0 ? len + nr : nr - 1);
84
- if (index < 0 || index > len - 1) error("index out of bounds for `" + std::string(sig) + "`", pstate, traces);
86
+ if (index < 0 || index > len - 1) error("index out of bounds for `" + sass::string(sig) + "`", pstate, traces);
85
87
 
86
88
  if (m) {
87
89
  l = SASS_MEMORY_NEW(List, pstate, 2);
@@ -90,7 +92,7 @@ namespace Sass {
90
92
  return l.detach();
91
93
  }
92
94
  else {
93
- Value_Obj rv = l->value_at_index(static_cast<int>(index));
95
+ ValueObj rv = l->value_at_index(static_cast<int>(index));
94
96
  rv->set_delayed(false);
95
97
  return rv.detach();
96
98
  }
@@ -102,7 +104,7 @@ namespace Sass {
102
104
  Map_Obj m = Cast<Map>(env["$list"]);
103
105
  List_Obj l = Cast<List>(env["$list"]);
104
106
  Number_Obj n = ARG("$n", Number);
105
- Expression_Obj v = ARG("$value", Expression);
107
+ ExpressionObj v = ARG("$value", Expression);
106
108
  if (!l) {
107
109
  l = SASS_MEMORY_NEW(List, pstate, 1);
108
110
  l->append(ARG("$list", Expression));
@@ -110,9 +112,9 @@ namespace Sass {
110
112
  if (m) {
111
113
  l = m->to_list(pstate);
112
114
  }
113
- if (l->empty()) error("argument `$list` of `" + std::string(sig) + "` must not be empty", pstate, traces);
115
+ if (l->empty()) error("argument `$list` of `" + sass::string(sig) + "` must not be empty", pstate, traces);
114
116
  double index = std::floor(n->value() < 0 ? l->length() + n->value() : n->value() - 1);
115
- if (index < 0 || index > l->length() - 1) error("index out of bounds for `" + std::string(sig) + "`", pstate, traces);
117
+ if (index < 0 || index > l->length() - 1) error("index out of bounds for `" + sass::string(sig) + "`", pstate, traces);
116
118
  List* result = SASS_MEMORY_NEW(List, pstate, l->length(), l->separator(), false, l->is_bracketed());
117
119
  for (size_t i = 0, L = l->length(); i < L; ++i) {
118
120
  result->append(((i == index) ? v : (*l)[i]));
@@ -125,7 +127,7 @@ namespace Sass {
125
127
  {
126
128
  Map_Obj m = Cast<Map>(env["$list"]);
127
129
  List_Obj l = Cast<List>(env["$list"]);
128
- Expression_Obj v = ARG("$value", Expression);
130
+ ExpressionObj v = ARG("$value", Expression);
129
131
  if (!l) {
130
132
  l = SASS_MEMORY_NEW(List, pstate, 1);
131
133
  l->append(ARG("$list", Expression));
@@ -168,10 +170,10 @@ namespace Sass {
168
170
  l2 = m2->to_list(pstate);
169
171
  }
170
172
  size_t len = l1->length() + l2->length();
171
- std::string sep_str = unquote(sep->value());
173
+ sass::string sep_str = unquote(sep->value());
172
174
  if (sep_str == "space") sep_val = SASS_SPACE;
173
175
  else if (sep_str == "comma") sep_val = SASS_COMMA;
174
- else if (sep_str != "auto") error("argument `$separator` of `" + std::string(sig) + "` must be `space`, `comma`, or `auto`", pstate, traces);
176
+ else if (sep_str != "auto") error("argument `$separator` of `" + sass::string(sig) + "` must be `space`, `comma`, or `auto`", pstate, traces);
175
177
  String_Constant_Obj bracketed_as_str = Cast<String_Constant>(bracketed);
176
178
  bool bracketed_is_auto = bracketed_as_str && unquote(bracketed_as_str->value()) == "auto";
177
179
  if (!bracketed_is_auto) {
@@ -188,10 +190,9 @@ namespace Sass {
188
190
  {
189
191
  Map_Obj m = Cast<Map>(env["$list"]);
190
192
  List_Obj l = Cast<List>(env["$list"]);
191
- Expression_Obj v = ARG("$val", Expression);
192
- if (Selector_List* sl = Cast<Selector_List>(env["$list"])) {
193
- Listize listize;
194
- l = Cast<List>(sl->perform(&listize));
193
+ ExpressionObj v = ARG("$val", Expression);
194
+ if (SelectorList * sl = Cast<SelectorList>(env["$list"])) {
195
+ l = Cast<List>(Listize::perform(sl));
195
196
  }
196
197
  String_Constant_Obj sep = ARG("$separator", String_Constant);
197
198
  if (!l) {
@@ -202,11 +203,11 @@ namespace Sass {
202
203
  l = m->to_list(pstate);
203
204
  }
204
205
  List* result = SASS_MEMORY_COPY(l);
205
- std::string sep_str(unquote(sep->value()));
206
+ sass::string sep_str(unquote(sep->value()));
206
207
  if (sep_str != "auto") { // check default first
207
208
  if (sep_str == "space") result->separator(SASS_SPACE);
208
209
  else if (sep_str == "comma") result->separator(SASS_COMMA);
209
- else error("argument `$separator` of `" + std::string(sig) + "` must be `space`, `comma`, or `auto`", pstate, traces);
210
+ else error("argument `$separator` of `" + sass::string(sig) + "` must be `space`, `comma`, or `auto`", pstate, traces);
210
211
  }
211
212
  if (l->is_arglist()) {
212
213
  result->append(SASS_MEMORY_NEW(Argument,
@@ -274,7 +275,7 @@ namespace Sass {
274
275
  Signature is_bracketed_sig = "is-bracketed($list)";
275
276
  BUILT_IN(is_bracketed)
276
277
  {
277
- Value_Obj value = ARG("$list", Value);
278
+ ValueObj value = ARG("$list", Value);
278
279
  List_Obj list = Cast<List>(value);
279
280
  return SASS_MEMORY_NEW(Boolean, pstate, list && list->is_bracketed());
280
281
  }
@@ -16,9 +16,9 @@ namespace Sass {
16
16
  // leaks for "map-get((), foo)" if not Obj
17
17
  // investigate why this is (unexpected)
18
18
  Map_Obj m = ARGM("$map", Map);
19
- Expression_Obj v = ARG("$key", Expression);
19
+ ExpressionObj v = ARG("$key", Expression);
20
20
  try {
21
- Value_Obj val = m->at(v);
21
+ ValueObj val = m->at(v);
22
22
  if (!val) return SASS_MEMORY_NEW(Null, pstate);
23
23
  val->set_delayed(false);
24
24
  return val.detach();
@@ -32,7 +32,7 @@ namespace Sass {
32
32
  BUILT_IN(map_has_key)
33
33
  {
34
34
  Map_Obj m = ARGM("$map", Map);
35
- Expression_Obj v = ARG("$key", Expression);
35
+ ExpressionObj v = ARG("$key", Expression);
36
36
  return SASS_MEMORY_NEW(Boolean, pstate, m->has(v));
37
37
  }
38
38
 
@@ -8,15 +8,6 @@ namespace Sass {
8
8
 
9
9
  namespace Functions {
10
10
 
11
- // features
12
- static std::set<std::string> features {
13
- "global-variable-shadowing",
14
- "extend-selector-pseudoclass",
15
- "at-error",
16
- "units-level-3",
17
- "custom-property"
18
- };
19
-
20
11
  //////////////////////////
21
12
  // INTROSPECTION FUNCTIONS
22
13
  //////////////////////////
@@ -31,7 +22,7 @@ namespace Sass {
31
22
  Signature variable_exists_sig = "variable-exists($name)";
32
23
  BUILT_IN(variable_exists)
33
24
  {
34
- std::string s = Util::normalize_underscores(unquote(ARG("$name", String_Constant)->value()));
25
+ sass::string s = Util::normalize_underscores(unquote(ARG("$name", String_Constant)->value()));
35
26
 
36
27
  if(d_env.has("$"+s)) {
37
28
  return SASS_MEMORY_NEW(Boolean, pstate, true);
@@ -44,7 +35,7 @@ namespace Sass {
44
35
  Signature global_variable_exists_sig = "global-variable-exists($name)";
45
36
  BUILT_IN(global_variable_exists)
46
37
  {
47
- std::string s = Util::normalize_underscores(unquote(ARG("$name", String_Constant)->value()));
38
+ sass::string s = Util::normalize_underscores(unquote(ARG("$name", String_Constant)->value()));
48
39
 
49
40
  if(d_env.has_global("$"+s)) {
50
41
  return SASS_MEMORY_NEW(Boolean, pstate, true);
@@ -62,7 +53,7 @@ namespace Sass {
62
53
  error("$name: " + (env["$name"]->to_string()) + " is not a string for `function-exists'", pstate, traces);
63
54
  }
64
55
 
65
- std::string name = Util::normalize_underscores(unquote(ss->value()));
56
+ sass::string name = Util::normalize_underscores(unquote(ss->value()));
66
57
 
67
58
  if(d_env.has(name+"[f]")) {
68
59
  return SASS_MEMORY_NEW(Boolean, pstate, true);
@@ -75,7 +66,7 @@ namespace Sass {
75
66
  Signature mixin_exists_sig = "mixin-exists($name)";
76
67
  BUILT_IN(mixin_exists)
77
68
  {
78
- std::string s = Util::normalize_underscores(unquote(ARG("$name", String_Constant)->value()));
69
+ sass::string s = Util::normalize_underscores(unquote(ARG("$name", String_Constant)->value()));
79
70
 
80
71
  if(d_env.has(s+"[m]")) {
81
72
  return SASS_MEMORY_NEW(Boolean, pstate, true);
@@ -85,52 +76,54 @@ namespace Sass {
85
76
  }
86
77
  }
87
78
 
88
- Signature feature_exists_sig = "feature-exists($name)";
79
+ Signature feature_exists_sig = "feature-exists($feature)";
89
80
  BUILT_IN(feature_exists)
90
81
  {
91
- std::string s = unquote(ARG("$name", String_Constant)->value());
92
-
93
- if(features.find(s) == features.end()) {
94
- return SASS_MEMORY_NEW(Boolean, pstate, false);
95
- }
96
- else {
97
- return SASS_MEMORY_NEW(Boolean, pstate, true);
98
- }
82
+ sass::string s = unquote(ARG("$feature", String_Constant)->value());
83
+
84
+ static const auto *const features = new std::unordered_set<sass::string> {
85
+ "global-variable-shadowing",
86
+ "extend-selector-pseudoclass",
87
+ "at-error",
88
+ "units-level-3",
89
+ "custom-property"
90
+ };
91
+ return SASS_MEMORY_NEW(Boolean, pstate, features->find(s) != features->end());
99
92
  }
100
93
 
101
- Signature call_sig = "call($name, $args...)";
94
+ Signature call_sig = "call($function, $args...)";
102
95
  BUILT_IN(call)
103
96
  {
104
- std::string name;
105
- Function* ff = Cast<Function>(env["$name"]);
106
- String_Constant* ss = Cast<String_Constant>(env["$name"]);
97
+ sass::string function;
98
+ Function* ff = Cast<Function>(env["$function"]);
99
+ String_Constant* ss = Cast<String_Constant>(env["$function"]);
107
100
 
108
101
  if (ss) {
109
- name = Util::normalize_underscores(unquote(ss->value()));
102
+ function = Util::normalize_underscores(unquote(ss->value()));
110
103
  std::cerr << "DEPRECATION WARNING: ";
111
104
  std::cerr << "Passing a string to call() is deprecated and will be illegal" << std::endl;
112
- std::cerr << "in Sass 4.0. Use call(get-function(" + quote(name) + ")) instead." << std::endl;
105
+ std::cerr << "in Sass 4.0. Use call(get-function(" + quote(function) + ")) instead." << std::endl;
113
106
  std::cerr << std::endl;
114
107
  } else if (ff) {
115
- name = ff->name();
108
+ function = ff->name();
116
109
  }
117
110
 
118
111
  List_Obj arglist = SASS_MEMORY_COPY(ARG("$args", List));
119
112
 
120
113
  Arguments_Obj args = SASS_MEMORY_NEW(Arguments, pstate);
121
- // std::string full_name(name + "[f]");
114
+ // sass::string full_name(name + "[f]");
122
115
  // Definition* def = d_env.has(full_name) ? Cast<Definition>((d_env)[full_name]) : 0;
123
116
  // Parameters* params = def ? def->parameters() : 0;
124
117
  // size_t param_size = params ? params->length() : 0;
125
118
  for (size_t i = 0, L = arglist->length(); i < L; ++i) {
126
- Expression_Obj expr = arglist->value_at_index(i);
119
+ ExpressionObj expr = arglist->value_at_index(i);
127
120
  // if (params && params->has_rest_parameter()) {
128
121
  // Parameter_Obj p = param_size > i ? (*params)[i] : 0;
129
122
  // List* list = Cast<List>(expr);
130
123
  // if (list && p && !p->is_rest_parameter()) expr = (*list)[0];
131
124
  // }
132
125
  if (arglist->is_arglist()) {
133
- Expression_Obj obj = arglist->at(i);
126
+ ExpressionObj obj = arglist->at(i);
134
127
  Argument_Obj arg = (Argument*) obj.ptr(); // XXX
135
128
  args->append(SASS_MEMORY_NEW(Argument,
136
129
  pstate,
@@ -142,8 +135,9 @@ namespace Sass {
142
135
  args->append(SASS_MEMORY_NEW(Argument, pstate, expr));
143
136
  }
144
137
  }
145
- Function_Call_Obj func = SASS_MEMORY_NEW(Function_Call, pstate, name, args);
146
- Expand expand(ctx, &d_env, &selector_stack);
138
+ Function_Call_Obj func = SASS_MEMORY_NEW(Function_Call, pstate, function, args);
139
+
140
+ Expand expand(ctx, &d_env, &selector_stack, &original_stack);
147
141
  func->via_call(true); // calc invoke is allowed
148
142
  if (ff) func->func(ff);
149
143
  return Cast<PreValue>(func->perform(&expand.eval));
@@ -160,15 +154,13 @@ namespace Sass {
160
154
  }
161
155
 
162
156
  Signature if_sig = "if($condition, $if-true, $if-false)";
163
- // BUILT_IN(sass_if)
164
- // { return ARG("$condition", Expression)->is_false() ? ARG("$if-false", Expression) : ARG("$if-true", Expression); }
165
157
  BUILT_IN(sass_if)
166
158
  {
167
- Expand expand(ctx, &d_env, &selector_stack);
168
- Expression_Obj cond = ARG("$condition", Expression)->perform(&expand.eval);
159
+ Expand expand(ctx, &d_env, &selector_stack, &original_stack);
160
+ ExpressionObj cond = ARG("$condition", Expression)->perform(&expand.eval);
169
161
  bool is_true = !cond->is_false();
170
- Expression_Obj res = ARG(is_true ? "$if-true" : "$if-false", Expression);
171
- Value_Obj qwe = Cast<Value>(res->perform(&expand.eval));
162
+ ExpressionObj res = ARG(is_true ? "$if-true" : "$if-false", Expression);
163
+ ValueObj qwe = Cast<Value>(res->perform(&expand.eval));
172
164
  // res = res->perform(&expand.eval.val_eval);
173
165
  qwe->set_delayed(false); // clone?
174
166
  return qwe.detach();
@@ -178,9 +170,6 @@ namespace Sass {
178
170
  // MISCELLANEOUS FUNCTIONS
179
171
  //////////////////////////
180
172
 
181
- // value.check_deprecated_interp if value.is_a?(Sass::Script::Value::String)
182
- // unquoted_string(value.to_sass)
183
-
184
173
  Signature inspect_sig = "inspect($value)";
185
174
  BUILT_IN(inspect)
186
175
  {
@@ -208,7 +197,6 @@ namespace Sass {
208
197
  ctx.c_options.output_style = old_style;
209
198
  return SASS_MEMORY_NEW(String_Quoted, pstate, i.get_buffer());
210
199
  }
211
- // return v;
212
200
  }
213
201
 
214
202
  Signature content_exists_sig = "content-exists()";
@@ -228,8 +216,8 @@ namespace Sass {
228
216
  error("$name: " + (env["$name"]->to_string()) + " is not a string for `get-function'", pstate, traces);
229
217
  }
230
218
 
231
- std::string name = Util::normalize_underscores(unquote(ss->value()));
232
- std::string full_name = name + "[f]";
219
+ sass::string name = Util::normalize_underscores(unquote(ss->value()));
220
+ sass::string full_name = name + "[f]";
233
221
 
234
222
  Boolean_Obj css = ARG("$css", Boolean);
235
223
  if (!css->is_false()) {