sassc 2.3.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
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)) {