sassc 2.3.0 → 2.4.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.
Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/CHANGELOG.md +5 -0
  4. data/ext/libsass/VERSION +1 -1
  5. data/ext/libsass/include/sass/context.h +3 -0
  6. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  7. data/ext/libsass/src/ast.cpp +117 -117
  8. data/ext/libsass/src/ast.hpp +160 -162
  9. data/ext/libsass/src/ast_def_macros.hpp +10 -10
  10. data/ext/libsass/src/ast_fwd_decl.cpp +2 -2
  11. data/ext/libsass/src/ast_fwd_decl.hpp +61 -52
  12. data/ext/libsass/src/ast_helpers.hpp +5 -5
  13. data/ext/libsass/src/ast_sel_cmp.cpp +18 -18
  14. data/ext/libsass/src/ast_sel_super.cpp +52 -52
  15. data/ext/libsass/src/ast_sel_unify.cpp +16 -16
  16. data/ext/libsass/src/ast_sel_weave.cpp +62 -62
  17. data/ext/libsass/src/ast_selectors.cpp +87 -77
  18. data/ext/libsass/src/ast_selectors.hpp +72 -62
  19. data/ext/libsass/src/ast_supports.cpp +35 -35
  20. data/ext/libsass/src/ast_supports.hpp +29 -29
  21. data/ext/libsass/src/ast_values.cpp +58 -58
  22. data/ext/libsass/src/ast_values.hpp +75 -75
  23. data/ext/libsass/src/backtrace.cpp +9 -9
  24. data/ext/libsass/src/backtrace.hpp +5 -5
  25. data/ext/libsass/src/base64vlq.cpp +2 -2
  26. data/ext/libsass/src/base64vlq.hpp +1 -1
  27. data/ext/libsass/src/bind.cpp +17 -17
  28. data/ext/libsass/src/bind.hpp +1 -1
  29. data/ext/libsass/src/c2ast.cpp +3 -3
  30. data/ext/libsass/src/c2ast.hpp +1 -1
  31. data/ext/libsass/src/check_nesting.cpp +36 -36
  32. data/ext/libsass/src/check_nesting.hpp +2 -2
  33. data/ext/libsass/src/color_maps.cpp +5 -5
  34. data/ext/libsass/src/color_maps.hpp +1 -1
  35. data/ext/libsass/src/context.cpp +63 -60
  36. data/ext/libsass/src/context.hpp +33 -33
  37. data/ext/libsass/src/cssize.cpp +30 -29
  38. data/ext/libsass/src/cssize.hpp +13 -13
  39. data/ext/libsass/src/dart_helpers.hpp +5 -5
  40. data/ext/libsass/src/debugger.hpp +127 -128
  41. data/ext/libsass/src/emitter.cpp +12 -12
  42. data/ext/libsass/src/emitter.hpp +10 -10
  43. data/ext/libsass/src/environment.cpp +27 -27
  44. data/ext/libsass/src/environment.hpp +24 -24
  45. data/ext/libsass/src/error_handling.cpp +42 -42
  46. data/ext/libsass/src/error_handling.hpp +38 -50
  47. data/ext/libsass/src/eval.cpp +138 -132
  48. data/ext/libsass/src/eval.hpp +17 -17
  49. data/ext/libsass/src/eval_selectors.cpp +3 -3
  50. data/ext/libsass/src/expand.cpp +70 -64
  51. data/ext/libsass/src/expand.hpp +12 -12
  52. data/ext/libsass/src/extender.cpp +55 -53
  53. data/ext/libsass/src/extender.hpp +14 -14
  54. data/ext/libsass/src/file.cpp +66 -58
  55. data/ext/libsass/src/file.hpp +23 -25
  56. data/ext/libsass/src/fn_colors.cpp +9 -9
  57. data/ext/libsass/src/fn_lists.cpp +18 -18
  58. data/ext/libsass/src/fn_maps.cpp +3 -3
  59. data/ext/libsass/src/fn_miscs.cpp +15 -15
  60. data/ext/libsass/src/fn_numbers.cpp +7 -7
  61. data/ext/libsass/src/fn_selectors.cpp +8 -8
  62. data/ext/libsass/src/fn_strings.cpp +34 -22
  63. data/ext/libsass/src/fn_utils.cpp +29 -26
  64. data/ext/libsass/src/fn_utils.hpp +10 -10
  65. data/ext/libsass/src/inspect.cpp +35 -34
  66. data/ext/libsass/src/inspect.hpp +21 -21
  67. data/ext/libsass/src/lexer.cpp +3 -1
  68. data/ext/libsass/src/listize.cpp +2 -2
  69. data/ext/libsass/src/mapping.hpp +1 -0
  70. data/ext/libsass/src/memory.hpp +12 -0
  71. data/ext/libsass/src/memory/allocator.cpp +48 -0
  72. data/ext/libsass/src/memory/allocator.hpp +138 -0
  73. data/ext/libsass/src/memory/config.hpp +20 -0
  74. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  75. data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
  76. data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +18 -6
  77. data/ext/libsass/src/operation.hpp +44 -44
  78. data/ext/libsass/src/operators.cpp +18 -18
  79. data/ext/libsass/src/operators.hpp +11 -11
  80. data/ext/libsass/src/ordered_map.hpp +18 -18
  81. data/ext/libsass/src/output.cpp +16 -16
  82. data/ext/libsass/src/output.hpp +5 -5
  83. data/ext/libsass/src/parser.cpp +327 -345
  84. data/ext/libsass/src/parser.hpp +77 -87
  85. data/ext/libsass/src/parser_selectors.cpp +6 -6
  86. data/ext/libsass/src/permutate.hpp +39 -15
  87. data/ext/libsass/src/plugins.cpp +7 -7
  88. data/ext/libsass/src/plugins.hpp +8 -8
  89. data/ext/libsass/src/position.cpp +7 -26
  90. data/ext/libsass/src/position.hpp +44 -21
  91. data/ext/libsass/src/remove_placeholders.cpp +4 -4
  92. data/ext/libsass/src/remove_placeholders.hpp +3 -3
  93. data/ext/libsass/src/sass.cpp +16 -15
  94. data/ext/libsass/src/sass.hpp +9 -5
  95. data/ext/libsass/src/sass_context.cpp +52 -34
  96. data/ext/libsass/src/sass_values.cpp +8 -10
  97. data/ext/libsass/src/settings.hpp +19 -0
  98. data/ext/libsass/src/source.cpp +69 -0
  99. data/ext/libsass/src/source.hpp +95 -0
  100. data/ext/libsass/src/source_data.hpp +32 -0
  101. data/ext/libsass/src/source_map.cpp +22 -18
  102. data/ext/libsass/src/source_map.hpp +12 -9
  103. data/ext/libsass/src/units.cpp +19 -19
  104. data/ext/libsass/src/units.hpp +8 -8
  105. data/ext/libsass/src/utf8_string.cpp +9 -10
  106. data/ext/libsass/src/utf8_string.hpp +7 -6
  107. data/ext/libsass/src/util.cpp +38 -38
  108. data/ext/libsass/src/util.hpp +18 -18
  109. data/ext/libsass/src/util_string.cpp +13 -13
  110. data/ext/libsass/src/util_string.hpp +9 -8
  111. data/ext/libsass/src/values.cpp +12 -12
  112. data/lib/sassc/native.rb +3 -5
  113. data/lib/sassc/version.rb +1 -1
  114. data/test/native_test.rb +4 -4
  115. metadata +14 -5
  116. data/lib/sassc/native/lib_c.rb +0 -21
@@ -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;
@@ -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
 
@@ -579,14 +579,14 @@ namespace Sass {
579
579
  double b = clip(c->b(), 0.0, 255.0);
580
580
  double a = clip(c->a(), 0.0, 1.0) * 255.0;
581
581
 
582
- std::stringstream ss;
582
+ sass::ostream ss;
583
583
  ss << '#' << std::setw(2) << std::setfill('0');
584
584
  ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(a, ctx.c_options.precision));
585
585
  ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(r, ctx.c_options.precision));
586
586
  ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(g, ctx.c_options.precision));
587
587
  ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(b, ctx.c_options.precision));
588
588
 
589
- std::string result = ss.str();
589
+ sass::string result = ss.str();
590
590
  Util::ascii_str_toupper(&result);
591
591
  return SASS_MEMORY_NEW(String_Quoted, pstate, result);
592
592
  }
@@ -21,9 +21,9 @@ namespace Sass {
21
21
  List_Obj arglist = SASS_MEMORY_COPY(ARG("$args", List)); // copy
22
22
  Map_Obj result = SASS_MEMORY_NEW(Map, pstate, 1);
23
23
  for (size_t i = arglist->size(), L = arglist->length(); i < L; ++i) {
24
- Expression_Obj obj = arglist->at(i);
24
+ ExpressionObj obj = arglist->at(i);
25
25
  Argument_Obj arg = (Argument*) obj.ptr(); // XXX
26
- std::string name = std::string(arg->name());
26
+ sass::string name = sass::string(arg->name());
27
27
  name = name.erase(0, 1); // sanitize name (remove dollar sign)
28
28
  *result << std::make_pair(SASS_MEMORY_NEW(String_Quoted,
29
29
  pstate, name),
@@ -67,13 +67,13 @@ namespace Sass {
67
67
  if (SelectorList * sl = Cast<SelectorList>(env["$list"])) {
68
68
  size_t len = m ? m->length() : sl->length();
69
69
  bool empty = m ? m->empty() : sl->empty();
70
- 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);
71
71
  double index = std::floor(nr < 0 ? len + nr : nr - 1);
72
- if (index < 0 || index > len - 1) error("index out of bounds for `" + std::string(sig) + "`", pstate, traces);
72
+ if (index < 0 || index > len - 1) error("index out of bounds for `" + sass::string(sig) + "`", pstate, traces);
73
73
  return Cast<Value>(Listize::perform(sl->get(static_cast<int>(index))));
74
74
  }
75
75
  List_Obj l = Cast<List>(env["$list"]);
76
- 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);
77
77
  // if the argument isn't a list, then wrap it in a singleton list
78
78
  if (!m && !l) {
79
79
  l = SASS_MEMORY_NEW(List, pstate, 1);
@@ -81,9 +81,9 @@ namespace Sass {
81
81
  }
82
82
  size_t len = m ? m->length() : l->length();
83
83
  bool empty = m ? m->empty() : l->empty();
84
- 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);
85
85
  double index = std::floor(nr < 0 ? len + nr : nr - 1);
86
- 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);
87
87
 
88
88
  if (m) {
89
89
  l = SASS_MEMORY_NEW(List, pstate, 2);
@@ -92,7 +92,7 @@ namespace Sass {
92
92
  return l.detach();
93
93
  }
94
94
  else {
95
- Value_Obj rv = l->value_at_index(static_cast<int>(index));
95
+ ValueObj rv = l->value_at_index(static_cast<int>(index));
96
96
  rv->set_delayed(false);
97
97
  return rv.detach();
98
98
  }
@@ -104,7 +104,7 @@ namespace Sass {
104
104
  Map_Obj m = Cast<Map>(env["$list"]);
105
105
  List_Obj l = Cast<List>(env["$list"]);
106
106
  Number_Obj n = ARG("$n", Number);
107
- Expression_Obj v = ARG("$value", Expression);
107
+ ExpressionObj v = ARG("$value", Expression);
108
108
  if (!l) {
109
109
  l = SASS_MEMORY_NEW(List, pstate, 1);
110
110
  l->append(ARG("$list", Expression));
@@ -112,9 +112,9 @@ namespace Sass {
112
112
  if (m) {
113
113
  l = m->to_list(pstate);
114
114
  }
115
- 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);
116
116
  double index = std::floor(n->value() < 0 ? l->length() + n->value() : n->value() - 1);
117
- 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);
118
118
  List* result = SASS_MEMORY_NEW(List, pstate, l->length(), l->separator(), false, l->is_bracketed());
119
119
  for (size_t i = 0, L = l->length(); i < L; ++i) {
120
120
  result->append(((i == index) ? v : (*l)[i]));
@@ -127,7 +127,7 @@ namespace Sass {
127
127
  {
128
128
  Map_Obj m = Cast<Map>(env["$list"]);
129
129
  List_Obj l = Cast<List>(env["$list"]);
130
- Expression_Obj v = ARG("$value", Expression);
130
+ ExpressionObj v = ARG("$value", Expression);
131
131
  if (!l) {
132
132
  l = SASS_MEMORY_NEW(List, pstate, 1);
133
133
  l->append(ARG("$list", Expression));
@@ -170,10 +170,10 @@ namespace Sass {
170
170
  l2 = m2->to_list(pstate);
171
171
  }
172
172
  size_t len = l1->length() + l2->length();
173
- std::string sep_str = unquote(sep->value());
173
+ sass::string sep_str = unquote(sep->value());
174
174
  if (sep_str == "space") sep_val = SASS_SPACE;
175
175
  else if (sep_str == "comma") sep_val = SASS_COMMA;
176
- 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);
177
177
  String_Constant_Obj bracketed_as_str = Cast<String_Constant>(bracketed);
178
178
  bool bracketed_is_auto = bracketed_as_str && unquote(bracketed_as_str->value()) == "auto";
179
179
  if (!bracketed_is_auto) {
@@ -190,7 +190,7 @@ namespace Sass {
190
190
  {
191
191
  Map_Obj m = Cast<Map>(env["$list"]);
192
192
  List_Obj l = Cast<List>(env["$list"]);
193
- Expression_Obj v = ARG("$val", Expression);
193
+ ExpressionObj v = ARG("$val", Expression);
194
194
  if (SelectorList * sl = Cast<SelectorList>(env["$list"])) {
195
195
  l = Cast<List>(Listize::perform(sl));
196
196
  }
@@ -203,11 +203,11 @@ namespace Sass {
203
203
  l = m->to_list(pstate);
204
204
  }
205
205
  List* result = SASS_MEMORY_COPY(l);
206
- std::string sep_str(unquote(sep->value()));
206
+ sass::string sep_str(unquote(sep->value()));
207
207
  if (sep_str != "auto") { // check default first
208
208
  if (sep_str == "space") result->separator(SASS_SPACE);
209
209
  else if (sep_str == "comma") result->separator(SASS_COMMA);
210
- 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);
211
211
  }
212
212
  if (l->is_arglist()) {
213
213
  result->append(SASS_MEMORY_NEW(Argument,
@@ -275,7 +275,7 @@ namespace Sass {
275
275
  Signature is_bracketed_sig = "is-bracketed($list)";
276
276
  BUILT_IN(is_bracketed)
277
277
  {
278
- Value_Obj value = ARG("$list", Value);
278
+ ValueObj value = ARG("$list", Value);
279
279
  List_Obj list = Cast<List>(value);
280
280
  return SASS_MEMORY_NEW(Boolean, pstate, list && list->is_bracketed());
281
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
 
@@ -22,7 +22,7 @@ namespace Sass {
22
22
  Signature variable_exists_sig = "variable-exists($name)";
23
23
  BUILT_IN(variable_exists)
24
24
  {
25
- 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()));
26
26
 
27
27
  if(d_env.has("$"+s)) {
28
28
  return SASS_MEMORY_NEW(Boolean, pstate, true);
@@ -35,7 +35,7 @@ namespace Sass {
35
35
  Signature global_variable_exists_sig = "global-variable-exists($name)";
36
36
  BUILT_IN(global_variable_exists)
37
37
  {
38
- 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()));
39
39
 
40
40
  if(d_env.has_global("$"+s)) {
41
41
  return SASS_MEMORY_NEW(Boolean, pstate, true);
@@ -53,7 +53,7 @@ namespace Sass {
53
53
  error("$name: " + (env["$name"]->to_string()) + " is not a string for `function-exists'", pstate, traces);
54
54
  }
55
55
 
56
- std::string name = Util::normalize_underscores(unquote(ss->value()));
56
+ sass::string name = Util::normalize_underscores(unquote(ss->value()));
57
57
 
58
58
  if(d_env.has(name+"[f]")) {
59
59
  return SASS_MEMORY_NEW(Boolean, pstate, true);
@@ -66,7 +66,7 @@ namespace Sass {
66
66
  Signature mixin_exists_sig = "mixin-exists($name)";
67
67
  BUILT_IN(mixin_exists)
68
68
  {
69
- 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()));
70
70
 
71
71
  if(d_env.has(s+"[m]")) {
72
72
  return SASS_MEMORY_NEW(Boolean, pstate, true);
@@ -79,9 +79,9 @@ namespace Sass {
79
79
  Signature feature_exists_sig = "feature-exists($feature)";
80
80
  BUILT_IN(feature_exists)
81
81
  {
82
- std::string s = unquote(ARG("$feature", String_Constant)->value());
82
+ sass::string s = unquote(ARG("$feature", String_Constant)->value());
83
83
 
84
- static const auto *const features = new std::unordered_set<std::string> {
84
+ static const auto *const features = new std::unordered_set<sass::string> {
85
85
  "global-variable-shadowing",
86
86
  "extend-selector-pseudoclass",
87
87
  "at-error",
@@ -94,7 +94,7 @@ namespace Sass {
94
94
  Signature call_sig = "call($function, $args...)";
95
95
  BUILT_IN(call)
96
96
  {
97
- std::string function;
97
+ sass::string function;
98
98
  Function* ff = Cast<Function>(env["$function"]);
99
99
  String_Constant* ss = Cast<String_Constant>(env["$function"]);
100
100
 
@@ -111,19 +111,19 @@ namespace Sass {
111
111
  List_Obj arglist = SASS_MEMORY_COPY(ARG("$args", List));
112
112
 
113
113
  Arguments_Obj args = SASS_MEMORY_NEW(Arguments, pstate);
114
- // std::string full_name(name + "[f]");
114
+ // sass::string full_name(name + "[f]");
115
115
  // Definition* def = d_env.has(full_name) ? Cast<Definition>((d_env)[full_name]) : 0;
116
116
  // Parameters* params = def ? def->parameters() : 0;
117
117
  // size_t param_size = params ? params->length() : 0;
118
118
  for (size_t i = 0, L = arglist->length(); i < L; ++i) {
119
- Expression_Obj expr = arglist->value_at_index(i);
119
+ ExpressionObj expr = arglist->value_at_index(i);
120
120
  // if (params && params->has_rest_parameter()) {
121
121
  // Parameter_Obj p = param_size > i ? (*params)[i] : 0;
122
122
  // List* list = Cast<List>(expr);
123
123
  // if (list && p && !p->is_rest_parameter()) expr = (*list)[0];
124
124
  // }
125
125
  if (arglist->is_arglist()) {
126
- Expression_Obj obj = arglist->at(i);
126
+ ExpressionObj obj = arglist->at(i);
127
127
  Argument_Obj arg = (Argument*) obj.ptr(); // XXX
128
128
  args->append(SASS_MEMORY_NEW(Argument,
129
129
  pstate,
@@ -157,10 +157,10 @@ namespace Sass {
157
157
  BUILT_IN(sass_if)
158
158
  {
159
159
  Expand expand(ctx, &d_env, &selector_stack, &original_stack);
160
- Expression_Obj cond = ARG("$condition", Expression)->perform(&expand.eval);
160
+ ExpressionObj cond = ARG("$condition", Expression)->perform(&expand.eval);
161
161
  bool is_true = !cond->is_false();
162
- Expression_Obj res = ARG(is_true ? "$if-true" : "$if-false", Expression);
163
- 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));
164
164
  // res = res->perform(&expand.eval.val_eval);
165
165
  qwe->set_delayed(false); // clone?
166
166
  return qwe.detach();
@@ -216,8 +216,8 @@ namespace Sass {
216
216
  error("$name: " + (env["$name"]->to_string()) + " is not a string for `get-function'", pstate, traces);
217
217
  }
218
218
 
219
- std::string name = Util::normalize_underscores(unquote(ss->value()));
220
- std::string full_name = name + "[f]";
219
+ sass::string name = Util::normalize_underscores(unquote(ss->value()));
220
+ sass::string full_name = name + "[f]";
221
221
 
222
222
  Boolean_Obj css = ARG("$css", Boolean);
223
223
  if (!css->is_false()) {
@@ -60,7 +60,7 @@ namespace Sass {
60
60
  BUILT_IN(percentage)
61
61
  {
62
62
  Number_Obj n = ARGN("$number");
63
- if (!n->is_unitless()) error("argument $number of `" + std::string(sig) + "` must be unitless", pstate, traces);
63
+ if (!n->is_unitless()) error("argument $number of `" + sass::string(sig) + "` must be unitless", pstate, traces);
64
64
  return SASS_MEMORY_NEW(Number, pstate, n->value() * 100, "%");
65
65
  }
66
66
 
@@ -110,7 +110,7 @@ namespace Sass {
110
110
  error("At least one argument must be passed.", pstate, traces);
111
111
  }
112
112
  for (size_t i = 0; i < L; ++i) {
113
- Expression_Obj val = arglist->value_at_index(i);
113
+ ExpressionObj val = arglist->value_at_index(i);
114
114
  Number_Obj xi = Cast<Number>(val);
115
115
  if (!xi) {
116
116
  error("\"" + val->to_string(ctx.c_options) + "\" is not a number for `min'", pstate, traces);
@@ -132,7 +132,7 @@ namespace Sass {
132
132
  error("At least one argument must be passed.", pstate, traces);
133
133
  }
134
134
  for (size_t i = 0; i < L; ++i) {
135
- Expression_Obj val = arglist->value_at_index(i);
135
+ ExpressionObj val = arglist->value_at_index(i);
136
136
  Number_Obj xi = Cast<Number>(val);
137
137
  if (!xi) {
138
138
  error("\"" + val->to_string(ctx.c_options) + "\" is not a number for `max'", pstate, traces);
@@ -154,13 +154,13 @@ namespace Sass {
154
154
  if (l) {
155
155
  double lv = l->value();
156
156
  if (lv < 1) {
157
- std::stringstream err;
157
+ sass::ostream err;
158
158
  err << "$limit " << lv << " must be greater than or equal to 1 for `random'";
159
159
  error(err.str(), pstate, traces);
160
160
  }
161
161
  bool eq_int = std::fabs(trunc(lv) - lv) < NUMBER_EPSILON;
162
162
  if (!eq_int) {
163
- std::stringstream err;
163
+ sass::ostream err;
164
164
  err << "Expected $limit to be an integer but got " << lv << " for `random'";
165
165
  error(err.str(), pstate, traces);
166
166
  }
@@ -184,7 +184,7 @@ namespace Sass {
184
184
  Signature unique_id_sig = "unique-id()";
185
185
  BUILT_IN(unique_id)
186
186
  {
187
- std::stringstream ss;
187
+ sass::ostream ss;
188
188
  std::uniform_real_distribution<> distributor(0, 4294967296); // 16^8
189
189
  uint_fast32_t distributed = static_cast<uint_fast32_t>(distributor(rand));
190
190
  ss << "u" << std::setfill('0') << std::setw(8) << std::hex << distributed;
@@ -195,7 +195,7 @@ namespace Sass {
195
195
  BUILT_IN(unit)
196
196
  {
197
197
  Number_Obj arg = ARGN("$number");
198
- std::string str(quote(arg->unit(), '"'));
198
+ sass::string str(quote(arg->unit(), '"'));
199
199
  return SASS_MEMORY_NEW(String_Quoted, pstate, str);
200
200
  }
201
201
 
@@ -25,7 +25,7 @@ namespace Sass {
25
25
  // Parse args into vector of selectors
26
26
  SelectorStack parsedSelectors;
27
27
  for (size_t i = 0, L = arglist->length(); i < L; ++i) {
28
- Expression_Obj exp = Cast<Expression>(arglist->value_at_index(i));
28
+ ExpressionObj exp = Cast<Expression>(arglist->value_at_index(i));
29
29
  if (exp->concrete_type() == Expression::NULL_VAL) {
30
30
  error(
31
31
  "$selectors: null is not a valid selector: it must be a string,\n"
@@ -35,8 +35,9 @@ namespace Sass {
35
35
  if (String_Constant_Obj str = Cast<String_Constant>(exp)) {
36
36
  str->quote_mark(0);
37
37
  }
38
- std::string exp_src = exp->to_string(ctx.c_options);
39
- SelectorListObj sel = Parser::parse_selector(exp_src.c_str(), ctx, traces);
38
+ sass::string exp_src = exp->to_string(ctx.c_options);
39
+ ItplFile* source = SASS_MEMORY_NEW(ItplFile, exp_src.c_str(), exp->pstate());
40
+ SelectorListObj sel = Parser::parse_selector(source, ctx, traces);
40
41
  parsedSelectors.push_back(sel);
41
42
  }
42
43
 
@@ -89,10 +90,9 @@ namespace Sass {
89
90
  if (String_Constant* str = Cast<String_Constant>(exp)) {
90
91
  str->quote_mark(0);
91
92
  }
92
- std::string exp_src = exp->to_string();
93
- SelectorListObj sel = Parser::parse_selector(exp_src.c_str(), ctx, traces,
94
- exp->pstate(), pstate.src,
95
- /*allow_parent=*/true);
93
+ sass::string exp_src = exp->to_string();
94
+ ItplFile* source = SASS_MEMORY_NEW(ItplFile, exp_src.c_str(), exp->pstate());
95
+ SelectorListObj sel = Parser::parse_selector(source, ctx, traces, true);
96
96
 
97
97
  for (auto& complex : sel->elements()) {
98
98
  if (complex->empty()) {
@@ -157,7 +157,7 @@ namespace Sass {
157
157
 
158
158
  for (size_t i = 0, L = sel->length(); i < L; ++i) {
159
159
  const SimpleSelectorObj& ss = sel->get(i);
160
- std::string ss_string = ss->to_string() ;
160
+ sass::string ss_string = ss->to_string() ;
161
161
  l->append(SASS_MEMORY_NEW(String_Quoted, ss->pstate(), ss_string));
162
162
  }
163
163
 
@@ -12,21 +12,21 @@ namespace Sass {
12
12
 
13
13
  namespace Functions {
14
14
 
15
- void handle_utf8_error (const ParserState& pstate, Backtraces traces)
15
+ void handle_utf8_error (const SourceSpan& pstate, Backtraces traces)
16
16
  {
17
17
  try {
18
18
  throw;
19
19
  }
20
20
  catch (utf8::invalid_code_point&) {
21
- std::string msg("utf8::invalid_code_point");
21
+ sass::string msg("utf8::invalid_code_point");
22
22
  error(msg, pstate, traces);
23
23
  }
24
24
  catch (utf8::not_enough_room&) {
25
- std::string msg("utf8::not_enough_room");
25
+ sass::string msg("utf8::not_enough_room");
26
26
  error(msg, pstate, traces);
27
27
  }
28
28
  catch (utf8::invalid_utf8&) {
29
- std::string msg("utf8::invalid_utf8");
29
+ sass::string msg("utf8::invalid_utf8");
30
30
  error(msg, pstate, traces);
31
31
  }
32
32
  catch (...) { throw; }
@@ -52,7 +52,7 @@ namespace Sass {
52
52
  else if (Value* ex = Cast<Value>(arg)) {
53
53
  Sass_Output_Style oldstyle = ctx.c_options.output_style;
54
54
  ctx.c_options.output_style = SASS_STYLE_NESTED;
55
- std::string val(arg->to_string(ctx.c_options));
55
+ sass::string val(arg->to_string(ctx.c_options));
56
56
  val = Cast<Null>(arg) ? "null" : val;
57
57
  ctx.c_options.output_style = oldstyle;
58
58
 
@@ -76,7 +76,7 @@ namespace Sass {
76
76
  Signature str_length_sig = "str-length($string)";
77
77
  BUILT_IN(str_length)
78
78
  {
79
- size_t len = std::string::npos;
79
+ size_t len = sass::string::npos;
80
80
  try {
81
81
  String_Constant* s = ARG("$string", String_Constant);
82
82
  len = UTF_8::code_point_count(s->value(), 0, s->value().size());
@@ -92,15 +92,19 @@ namespace Sass {
92
92
  Signature str_insert_sig = "str-insert($string, $insert, $index)";
93
93
  BUILT_IN(str_insert)
94
94
  {
95
- std::string str;
95
+ sass::string str;
96
96
  try {
97
97
  String_Constant* s = ARG("$string", String_Constant);
98
98
  str = s->value();
99
99
  String_Constant* i = ARG("$insert", String_Constant);
100
- std::string ins = i->value();
100
+ sass::string ins = i->value();
101
101
  double index = ARGVAL("$index");
102
102
  if (index != (int)index) {
103
- error("$index: " + std::to_string(index) + " is not an int", pstate, traces);
103
+ sass::ostream strm;
104
+ strm << "$index: ";
105
+ strm << std::to_string(index);
106
+ strm << " is not an int";
107
+ error(strm.str(), pstate, traces);
104
108
  }
105
109
  size_t len = UTF_8::code_point_count(str, 0, str.size());
106
110
 
@@ -138,15 +142,15 @@ namespace Sass {
138
142
  Signature str_index_sig = "str-index($string, $substring)";
139
143
  BUILT_IN(str_index)
140
144
  {
141
- size_t index = std::string::npos;
145
+ size_t index = sass::string::npos;
142
146
  try {
143
147
  String_Constant* s = ARG("$string", String_Constant);
144
148
  String_Constant* t = ARG("$substring", String_Constant);
145
- std::string str = s->value();
146
- std::string substr = t->value();
149
+ sass::string str = s->value();
150
+ sass::string substr = t->value();
147
151
 
148
152
  size_t c_index = str.find(substr);
149
- if(c_index == std::string::npos) {
153
+ if(c_index == sass::string::npos) {
150
154
  return SASS_MEMORY_NEW(Null, pstate);
151
155
  }
152
156
  index = UTF_8::code_point_count(str, 0, c_index) + 1;
@@ -161,19 +165,23 @@ namespace Sass {
161
165
  Signature str_slice_sig = "str-slice($string, $start-at, $end-at:-1)";
162
166
  BUILT_IN(str_slice)
163
167
  {
164
- std::string newstr;
168
+ sass::string newstr;
165
169
  try {
166
170
  String_Constant* s = ARG("$string", String_Constant);
167
171
  double start_at = ARGVAL("$start-at");
168
172
  double end_at = ARGVAL("$end-at");
169
173
 
170
174
  if (start_at != (int)start_at) {
171
- error("$start-at: " + std::to_string(start_at) + " is not an int", pstate, traces);
175
+ sass::ostream strm;
176
+ strm << "$start-at: ";
177
+ strm << std::to_string(start_at);
178
+ strm << " is not an int";
179
+ error(strm.str(), pstate, traces);
172
180
  }
173
181
 
174
182
  String_Quoted* ss = Cast<String_Quoted>(s);
175
183
 
176
- std::string str(s->value());
184
+ sass::string str(s->value());
177
185
 
178
186
  size_t size = utf8::distance(str.begin(), str.end());
179
187
 
@@ -182,7 +190,11 @@ namespace Sass {
182
190
  }
183
191
 
184
192
  if (end_at != (int)end_at) {
185
- error("$end-at: " + std::to_string(end_at) + " is not an int", pstate, traces);
193
+ sass::ostream strm;
194
+ strm << "$end-at: ";
195
+ strm << std::to_string(end_at);
196
+ strm << " is not an int";
197
+ error(strm.str(), pstate, traces);
186
198
  }
187
199
 
188
200
  if (end_at == 0 || (end_at + size) < 0) {
@@ -203,11 +215,11 @@ namespace Sass {
203
215
 
204
216
  if (start_at <= end_at)
205
217
  {
206
- std::string::iterator start = str.begin();
218
+ sass::string::iterator start = str.begin();
207
219
  utf8::advance(start, start_at - 1, str.end());
208
- std::string::iterator end = start;
220
+ sass::string::iterator end = start;
209
221
  utf8::advance(end, end_at - start_at + 1, str.end());
210
- newstr = std::string(start, end);
222
+ newstr = sass::string(start, end);
211
223
  }
212
224
  if (ss) {
213
225
  if(ss->quote_mark()) newstr = quote(newstr);
@@ -223,7 +235,7 @@ namespace Sass {
223
235
  BUILT_IN(to_upper_case)
224
236
  {
225
237
  String_Constant* s = ARG("$string", String_Constant);
226
- std::string str = s->value();
238
+ sass::string str = s->value();
227
239
  Util::ascii_str_toupper(&str);
228
240
 
229
241
  if (String_Quoted* ss = Cast<String_Quoted>(s)) {
@@ -239,7 +251,7 @@ namespace Sass {
239
251
  BUILT_IN(to_lower_case)
240
252
  {
241
253
  String_Constant* s = ARG("$string", String_Constant);
242
- std::string str = s->value();
254
+ sass::string str = s->value();
243
255
  Util::ascii_str_tolower(&str);
244
256
 
245
257
  if (String_Quoted* ss = Cast<String_Quoted>(s)) {