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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/CHANGELOG.md +5 -0
- data/ext/libsass/VERSION +1 -1
- data/ext/libsass/include/sass/context.h +3 -0
- data/ext/libsass/src/MurmurHash2.hpp +91 -0
- data/ext/libsass/src/ast.cpp +117 -117
- data/ext/libsass/src/ast.hpp +160 -162
- data/ext/libsass/src/ast_def_macros.hpp +10 -10
- data/ext/libsass/src/ast_fwd_decl.cpp +2 -2
- data/ext/libsass/src/ast_fwd_decl.hpp +61 -52
- data/ext/libsass/src/ast_helpers.hpp +5 -5
- data/ext/libsass/src/ast_sel_cmp.cpp +18 -18
- data/ext/libsass/src/ast_sel_super.cpp +52 -52
- data/ext/libsass/src/ast_sel_unify.cpp +16 -16
- data/ext/libsass/src/ast_sel_weave.cpp +62 -62
- data/ext/libsass/src/ast_selectors.cpp +87 -77
- data/ext/libsass/src/ast_selectors.hpp +72 -62
- data/ext/libsass/src/ast_supports.cpp +35 -35
- data/ext/libsass/src/ast_supports.hpp +29 -29
- data/ext/libsass/src/ast_values.cpp +58 -58
- data/ext/libsass/src/ast_values.hpp +75 -75
- data/ext/libsass/src/backtrace.cpp +9 -9
- data/ext/libsass/src/backtrace.hpp +5 -5
- data/ext/libsass/src/base64vlq.cpp +2 -2
- data/ext/libsass/src/base64vlq.hpp +1 -1
- data/ext/libsass/src/bind.cpp +17 -17
- data/ext/libsass/src/bind.hpp +1 -1
- data/ext/libsass/src/c2ast.cpp +3 -3
- data/ext/libsass/src/c2ast.hpp +1 -1
- data/ext/libsass/src/check_nesting.cpp +36 -36
- data/ext/libsass/src/check_nesting.hpp +2 -2
- data/ext/libsass/src/color_maps.cpp +5 -5
- data/ext/libsass/src/color_maps.hpp +1 -1
- data/ext/libsass/src/context.cpp +63 -60
- data/ext/libsass/src/context.hpp +33 -33
- data/ext/libsass/src/cssize.cpp +30 -29
- data/ext/libsass/src/cssize.hpp +13 -13
- data/ext/libsass/src/dart_helpers.hpp +5 -5
- data/ext/libsass/src/debugger.hpp +127 -128
- data/ext/libsass/src/emitter.cpp +12 -12
- data/ext/libsass/src/emitter.hpp +10 -10
- data/ext/libsass/src/environment.cpp +27 -27
- data/ext/libsass/src/environment.hpp +24 -24
- data/ext/libsass/src/error_handling.cpp +42 -42
- data/ext/libsass/src/error_handling.hpp +38 -50
- data/ext/libsass/src/eval.cpp +138 -132
- data/ext/libsass/src/eval.hpp +17 -17
- data/ext/libsass/src/eval_selectors.cpp +3 -3
- data/ext/libsass/src/expand.cpp +70 -64
- data/ext/libsass/src/expand.hpp +12 -12
- data/ext/libsass/src/extender.cpp +55 -53
- data/ext/libsass/src/extender.hpp +14 -14
- data/ext/libsass/src/file.cpp +66 -58
- data/ext/libsass/src/file.hpp +23 -25
- data/ext/libsass/src/fn_colors.cpp +9 -9
- data/ext/libsass/src/fn_lists.cpp +18 -18
- data/ext/libsass/src/fn_maps.cpp +3 -3
- data/ext/libsass/src/fn_miscs.cpp +15 -15
- data/ext/libsass/src/fn_numbers.cpp +7 -7
- data/ext/libsass/src/fn_selectors.cpp +8 -8
- data/ext/libsass/src/fn_strings.cpp +34 -22
- data/ext/libsass/src/fn_utils.cpp +29 -26
- data/ext/libsass/src/fn_utils.hpp +10 -10
- data/ext/libsass/src/inspect.cpp +35 -34
- data/ext/libsass/src/inspect.hpp +21 -21
- data/ext/libsass/src/lexer.cpp +3 -1
- data/ext/libsass/src/listize.cpp +2 -2
- data/ext/libsass/src/mapping.hpp +1 -0
- data/ext/libsass/src/memory.hpp +12 -0
- data/ext/libsass/src/memory/allocator.cpp +48 -0
- data/ext/libsass/src/memory/allocator.hpp +138 -0
- data/ext/libsass/src/memory/config.hpp +20 -0
- data/ext/libsass/src/memory/memory_pool.hpp +186 -0
- data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
- data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +18 -6
- data/ext/libsass/src/operation.hpp +44 -44
- data/ext/libsass/src/operators.cpp +18 -18
- data/ext/libsass/src/operators.hpp +11 -11
- data/ext/libsass/src/ordered_map.hpp +18 -18
- data/ext/libsass/src/output.cpp +16 -16
- data/ext/libsass/src/output.hpp +5 -5
- data/ext/libsass/src/parser.cpp +327 -345
- data/ext/libsass/src/parser.hpp +77 -87
- data/ext/libsass/src/parser_selectors.cpp +6 -6
- data/ext/libsass/src/permutate.hpp +39 -15
- data/ext/libsass/src/plugins.cpp +7 -7
- data/ext/libsass/src/plugins.hpp +8 -8
- data/ext/libsass/src/position.cpp +7 -26
- data/ext/libsass/src/position.hpp +44 -21
- data/ext/libsass/src/remove_placeholders.cpp +4 -4
- data/ext/libsass/src/remove_placeholders.hpp +3 -3
- data/ext/libsass/src/sass.cpp +16 -15
- data/ext/libsass/src/sass.hpp +9 -5
- data/ext/libsass/src/sass_context.cpp +52 -34
- data/ext/libsass/src/sass_values.cpp +8 -10
- data/ext/libsass/src/settings.hpp +19 -0
- data/ext/libsass/src/source.cpp +69 -0
- data/ext/libsass/src/source.hpp +95 -0
- data/ext/libsass/src/source_data.hpp +32 -0
- data/ext/libsass/src/source_map.cpp +22 -18
- data/ext/libsass/src/source_map.hpp +12 -9
- data/ext/libsass/src/units.cpp +19 -19
- data/ext/libsass/src/units.hpp +8 -8
- data/ext/libsass/src/utf8_string.cpp +9 -10
- data/ext/libsass/src/utf8_string.hpp +7 -6
- data/ext/libsass/src/util.cpp +38 -38
- data/ext/libsass/src/util.hpp +18 -18
- data/ext/libsass/src/util_string.cpp +13 -13
- data/ext/libsass/src/util_string.hpp +9 -8
- data/ext/libsass/src/values.cpp +12 -12
- data/lib/sassc/native.rb +3 -5
- data/lib/sassc/version.rb +1 -1
- data/test/native_test.rb +4 -4
- metadata +14 -5
- 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
|
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
|
24
|
+
void hsla_alpha_percent_deprecation(const SourceSpan& pstate, const sass::string val)
|
25
25
|
{
|
26
26
|
|
27
|
-
|
28
|
-
|
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
|
-
|
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,
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
24
|
+
ExpressionObj obj = arglist->at(i);
|
25
25
|
Argument_Obj arg = (Argument*) obj.ptr(); // XXX
|
26
|
-
|
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 `" +
|
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 `" +
|
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 `" +
|
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 `" +
|
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 `" +
|
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
|
-
|
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
|
-
|
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 `" +
|
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 `" +
|
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
|
-
|
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
|
-
|
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 `" +
|
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
|
-
|
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
|
-
|
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 `" +
|
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
|
-
|
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
|
}
|
data/ext/libsass/src/fn_maps.cpp
CHANGED
@@ -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
|
-
|
19
|
+
ExpressionObj v = ARG("$key", Expression);
|
20
20
|
try {
|
21
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
82
|
+
sass::string s = unquote(ARG("$feature", String_Constant)->value());
|
83
83
|
|
84
|
-
static const auto *const features = new std::unordered_set<
|
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
|
-
|
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
|
-
//
|
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
|
-
|
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
|
-
|
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
|
-
|
160
|
+
ExpressionObj cond = ARG("$condition", Expression)->perform(&expand.eval);
|
161
161
|
bool is_true = !cond->is_false();
|
162
|
-
|
163
|
-
|
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
|
-
|
220
|
-
|
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 `" +
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
39
|
-
|
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
|
-
|
93
|
-
|
94
|
-
|
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
|
-
|
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
|
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
|
-
|
21
|
+
sass::string msg("utf8::invalid_code_point");
|
22
22
|
error(msg, pstate, traces);
|
23
23
|
}
|
24
24
|
catch (utf8::not_enough_room&) {
|
25
|
-
|
25
|
+
sass::string msg("utf8::not_enough_room");
|
26
26
|
error(msg, pstate, traces);
|
27
27
|
}
|
28
28
|
catch (utf8::invalid_utf8&) {
|
29
|
-
|
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
|
-
|
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 =
|
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
|
-
|
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
|
-
|
100
|
+
sass::string ins = i->value();
|
101
101
|
double index = ARGVAL("$index");
|
102
102
|
if (index != (int)index) {
|
103
|
-
|
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 =
|
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
|
-
|
146
|
-
|
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 ==
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
218
|
+
sass::string::iterator start = str.begin();
|
207
219
|
utf8::advance(start, start_at - 1, str.end());
|
208
|
-
|
220
|
+
sass::string::iterator end = start;
|
209
221
|
utf8::advance(end, end_at - start_at + 1, str.end());
|
210
|
-
newstr =
|
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
|
-
|
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
|
-
|
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)) {
|