sassc 2.0.1 → 2.1.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.gitmodules +1 -1
- data/.travis.yml +7 -3
- data/CHANGELOG.md +3 -0
- data/CODE_OF_CONDUCT.md +1 -1
- data/README.md +1 -1
- data/Rakefile +23 -8
- data/ext/extconf.rb +39 -0
- data/ext/libsass/.gitignore +1 -0
- data/ext/libsass/GNUmakefile.am +23 -39
- data/ext/libsass/Makefile +56 -91
- data/ext/libsass/Makefile.conf +16 -2
- data/ext/libsass/configure.ac +8 -12
- data/ext/libsass/include/sass/base.h +1 -0
- data/ext/libsass/include/sass/context.h +1 -1
- data/ext/libsass/src/GNUmakefile.am +1 -5
- data/ext/libsass/src/ast.cpp +747 -2010
- data/ext/libsass/src/ast.hpp +239 -2383
- data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
- data/ext/libsass/src/ast2c.hpp +39 -0
- data/ext/libsass/src/ast_def_macros.hpp +62 -10
- data/ext/libsass/src/ast_fwd_decl.cpp +1 -0
- data/ext/libsass/src/ast_fwd_decl.hpp +43 -165
- data/ext/libsass/src/ast_sel_cmp.cpp +909 -0
- data/ext/libsass/src/ast_sel_unify.cpp +280 -0
- data/ext/libsass/src/ast_selectors.cpp +1475 -0
- data/ext/libsass/src/ast_selectors.hpp +568 -0
- data/ext/libsass/src/ast_supports.cpp +130 -0
- data/ext/libsass/src/ast_supports.hpp +121 -0
- data/ext/libsass/src/ast_values.cpp +967 -0
- data/ext/libsass/src/ast_values.hpp +489 -0
- data/ext/libsass/src/backtrace.cpp +4 -0
- data/ext/libsass/src/base64vlq.cpp +3 -0
- data/ext/libsass/src/bind.cpp +18 -17
- data/ext/libsass/src/bind.hpp +3 -1
- data/ext/libsass/src/c2ast.cpp +64 -0
- data/ext/libsass/src/c2ast.hpp +14 -0
- data/ext/libsass/src/cencode.c +2 -2
- data/ext/libsass/src/check_nesting.cpp +52 -56
- data/ext/libsass/src/check_nesting.hpp +35 -34
- data/ext/libsass/src/color_maps.cpp +156 -153
- data/ext/libsass/src/color_maps.hpp +152 -152
- data/ext/libsass/src/constants.cpp +15 -0
- data/ext/libsass/src/constants.hpp +13 -0
- data/ext/libsass/src/context.cpp +24 -14
- data/ext/libsass/src/context.hpp +6 -6
- data/ext/libsass/src/cssize.cpp +69 -71
- data/ext/libsass/src/cssize.hpp +50 -50
- data/ext/libsass/src/debugger.hpp +117 -110
- data/ext/libsass/src/emitter.cpp +13 -12
- data/ext/libsass/src/emitter.hpp +13 -9
- data/ext/libsass/src/environment.cpp +15 -1
- data/ext/libsass/src/environment.hpp +6 -0
- data/ext/libsass/src/error_handling.cpp +36 -59
- data/ext/libsass/src/error_handling.hpp +29 -16
- data/ext/libsass/src/eval.cpp +302 -323
- data/ext/libsass/src/eval.hpp +64 -55
- data/ext/libsass/src/expand.cpp +94 -88
- data/ext/libsass/src/expand.hpp +33 -37
- data/ext/libsass/src/extend.cpp +38 -36
- data/ext/libsass/src/extend.hpp +15 -15
- data/ext/libsass/src/file.cpp +34 -2
- data/ext/libsass/src/fn_colors.cpp +594 -0
- data/ext/libsass/src/fn_colors.hpp +85 -0
- data/ext/libsass/src/fn_lists.cpp +284 -0
- data/ext/libsass/src/fn_lists.hpp +34 -0
- data/ext/libsass/src/fn_maps.cpp +94 -0
- data/ext/libsass/src/fn_maps.hpp +30 -0
- data/ext/libsass/src/fn_miscs.cpp +256 -0
- data/ext/libsass/src/fn_miscs.hpp +40 -0
- data/ext/libsass/src/fn_numbers.cpp +220 -0
- data/ext/libsass/src/fn_numbers.hpp +45 -0
- data/ext/libsass/src/fn_selectors.cpp +235 -0
- data/ext/libsass/src/fn_selectors.hpp +35 -0
- data/ext/libsass/src/fn_strings.cpp +254 -0
- data/ext/libsass/src/fn_strings.hpp +34 -0
- data/ext/libsass/src/fn_utils.cpp +156 -0
- data/ext/libsass/src/fn_utils.hpp +56 -0
- data/ext/libsass/src/inspect.cpp +101 -152
- data/ext/libsass/src/inspect.hpp +69 -73
- data/ext/libsass/src/json.cpp +2 -2
- data/ext/libsass/src/lexer.cpp +6 -3
- data/ext/libsass/src/listize.cpp +9 -11
- data/ext/libsass/src/listize.hpp +11 -7
- data/ext/libsass/src/memory/SharedPtr.cpp +2 -83
- data/ext/libsass/src/memory/SharedPtr.hpp +127 -143
- data/ext/libsass/src/node.cpp +13 -10
- data/ext/libsass/src/node.hpp +3 -3
- data/ext/libsass/src/operation.hpp +184 -144
- data/ext/libsass/src/operators.cpp +43 -17
- data/ext/libsass/src/operators.hpp +5 -5
- data/ext/libsass/src/output.cpp +21 -18
- data/ext/libsass/src/output.hpp +14 -21
- data/ext/libsass/src/parser.cpp +215 -183
- data/ext/libsass/src/parser.hpp +28 -24
- data/ext/libsass/src/plugins.cpp +5 -1
- data/ext/libsass/src/position.cpp +3 -0
- data/ext/libsass/src/prelexer.cpp +9 -3
- data/ext/libsass/src/prelexer.hpp +9 -9
- data/ext/libsass/src/remove_placeholders.cpp +14 -11
- data/ext/libsass/src/remove_placeholders.hpp +8 -9
- data/ext/libsass/src/sass.cpp +9 -3
- data/ext/libsass/src/sass.hpp +12 -9
- data/ext/libsass/src/sass2scss.cpp +45 -14
- data/ext/libsass/src/sass_context.cpp +18 -15
- data/ext/libsass/src/sass_functions.cpp +6 -3
- data/ext/libsass/src/sass_functions.hpp +1 -1
- data/ext/libsass/src/sass_util.cpp +3 -0
- data/ext/libsass/src/sass_values.cpp +21 -13
- data/ext/libsass/src/source_map.cpp +5 -2
- data/ext/libsass/src/source_map.hpp +2 -2
- data/ext/libsass/src/subset_map.cpp +4 -1
- data/ext/libsass/src/to_value.cpp +23 -21
- data/ext/libsass/src/to_value.hpp +18 -22
- data/ext/libsass/src/units.cpp +4 -0
- data/ext/libsass/src/units.hpp +1 -0
- data/ext/libsass/src/utf8/checked.h +12 -10
- data/ext/libsass/src/utf8/core.h +3 -0
- data/ext/libsass/src/utf8_string.cpp +3 -0
- data/ext/libsass/src/util.cpp +67 -75
- data/ext/libsass/src/util.hpp +64 -19
- data/ext/libsass/src/util_string.cpp +75 -0
- data/ext/libsass/src/util_string.hpp +19 -0
- data/ext/libsass/src/values.cpp +22 -13
- data/ext/libsass/src/values.hpp +2 -2
- data/ext/libsass/win/libsass.targets +30 -4
- data/ext/libsass/win/libsass.vcxproj.filters +82 -4
- data/lib/sassc.rb +24 -0
- data/lib/sassc/engine.rb +2 -2
- data/lib/sassc/native.rb +8 -1
- data/lib/sassc/version.rb +1 -1
- data/sassc.gemspec +19 -11
- data/test/engine_test.rb +26 -1
- data/test/native_test.rb +1 -1
- metadata +66 -72
- data/ext/Rakefile +0 -3
- data/ext/libsass/.github/CONTRIBUTING.md +0 -65
- data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
- data/ext/libsass/.travis.yml +0 -64
- data/ext/libsass/Readme.md +0 -104
- data/ext/libsass/SECURITY.md +0 -10
- data/ext/libsass/appveyor.yml +0 -91
- data/ext/libsass/docs/README.md +0 -20
- data/ext/libsass/docs/api-context-example.md +0 -45
- data/ext/libsass/docs/api-context-internal.md +0 -163
- data/ext/libsass/docs/api-context.md +0 -295
- data/ext/libsass/docs/api-doc.md +0 -215
- data/ext/libsass/docs/api-function-example.md +0 -67
- data/ext/libsass/docs/api-function-internal.md +0 -8
- data/ext/libsass/docs/api-function.md +0 -74
- data/ext/libsass/docs/api-importer-example.md +0 -112
- data/ext/libsass/docs/api-importer-internal.md +0 -20
- data/ext/libsass/docs/api-importer.md +0 -86
- data/ext/libsass/docs/api-value-example.md +0 -55
- data/ext/libsass/docs/api-value-internal.md +0 -76
- data/ext/libsass/docs/api-value.md +0 -154
- data/ext/libsass/docs/build-on-darwin.md +0 -27
- data/ext/libsass/docs/build-on-gentoo.md +0 -55
- data/ext/libsass/docs/build-on-windows.md +0 -139
- data/ext/libsass/docs/build-shared-library.md +0 -35
- data/ext/libsass/docs/build-with-autotools.md +0 -78
- data/ext/libsass/docs/build-with-makefiles.md +0 -68
- data/ext/libsass/docs/build-with-mingw.md +0 -107
- data/ext/libsass/docs/build-with-visual-studio.md +0 -90
- data/ext/libsass/docs/build.md +0 -97
- data/ext/libsass/docs/compatibility-plan.md +0 -48
- data/ext/libsass/docs/contributing.md +0 -17
- data/ext/libsass/docs/custom-functions-internal.md +0 -122
- data/ext/libsass/docs/dev-ast-memory.md +0 -223
- data/ext/libsass/docs/implementations.md +0 -56
- data/ext/libsass/docs/plugins.md +0 -47
- data/ext/libsass/docs/setup-environment.md +0 -68
- data/ext/libsass/docs/source-map-internals.md +0 -51
- data/ext/libsass/docs/trace.md +0 -26
- data/ext/libsass/docs/triage.md +0 -17
- data/ext/libsass/docs/unicode.md +0 -39
- data/ext/libsass/extconf.rb +0 -6
- data/ext/libsass/script/bootstrap +0 -13
- data/ext/libsass/script/branding +0 -10
- data/ext/libsass/script/ci-build-libsass +0 -134
- data/ext/libsass/script/ci-build-plugin +0 -62
- data/ext/libsass/script/ci-install-compiler +0 -6
- data/ext/libsass/script/ci-install-deps +0 -20
- data/ext/libsass/script/ci-report-coverage +0 -42
- data/ext/libsass/script/spec +0 -5
- data/ext/libsass/script/tap-driver +0 -652
- data/ext/libsass/script/tap-runner +0 -1
- data/ext/libsass/script/test-leaks.pl +0 -103
- data/ext/libsass/src/functions.cpp +0 -2234
- data/ext/libsass/src/functions.hpp +0 -198
- data/ext/libsass/src/to_c.hpp +0 -39
- data/ext/libsass/test/test_node.cpp +0 -94
- data/ext/libsass/test/test_paths.cpp +0 -28
- data/ext/libsass/test/test_selector_difference.cpp +0 -25
- data/ext/libsass/test/test_specificity.cpp +0 -25
- data/ext/libsass/test/test_subset_map.cpp +0 -472
- data/ext/libsass/test/test_superselector.cpp +0 -69
- data/ext/libsass/test/test_unification.cpp +0 -31
- data/lib/tasks/libsass.rb +0 -33
data/ext/libsass/src/inspect.hpp
CHANGED
@@ -13,90 +13,86 @@ namespace Sass {
|
|
13
13
|
// import all the class-specific methods and override as desired
|
14
14
|
using Operation_CRTP<void, Inspect>::operator();
|
15
15
|
|
16
|
-
void fallback_impl(AST_Node_Ptr n);
|
17
|
-
|
18
16
|
public:
|
19
17
|
|
20
18
|
Inspect(const Emitter& emi);
|
21
19
|
virtual ~Inspect();
|
22
20
|
|
23
21
|
// statements
|
24
|
-
virtual void operator()(
|
25
|
-
virtual void operator()(
|
26
|
-
virtual void operator()(
|
27
|
-
virtual void operator()(
|
28
|
-
virtual void operator()(
|
29
|
-
virtual void operator()(
|
30
|
-
virtual void operator()(
|
31
|
-
virtual void operator()(
|
32
|
-
virtual void operator()(
|
33
|
-
virtual void operator()(
|
34
|
-
virtual void operator()(
|
35
|
-
virtual void operator()(
|
36
|
-
virtual void operator()(
|
37
|
-
virtual void operator()(
|
38
|
-
virtual void operator()(
|
39
|
-
virtual void operator()(
|
40
|
-
virtual void operator()(
|
41
|
-
virtual void operator()(
|
42
|
-
virtual void operator()(
|
43
|
-
virtual void operator()(
|
44
|
-
virtual void operator()(
|
45
|
-
virtual void operator()(
|
46
|
-
virtual void operator()(
|
47
|
-
virtual void operator()(
|
48
|
-
virtual void operator()(
|
22
|
+
virtual void operator()(Block*);
|
23
|
+
virtual void operator()(Ruleset*);
|
24
|
+
virtual void operator()(Bubble*);
|
25
|
+
virtual void operator()(Supports_Block*);
|
26
|
+
virtual void operator()(Media_Block*);
|
27
|
+
virtual void operator()(At_Root_Block*);
|
28
|
+
virtual void operator()(Directive*);
|
29
|
+
virtual void operator()(Keyframe_Rule*);
|
30
|
+
virtual void operator()(Declaration*);
|
31
|
+
virtual void operator()(Assignment*);
|
32
|
+
virtual void operator()(Import*);
|
33
|
+
virtual void operator()(Import_Stub*);
|
34
|
+
virtual void operator()(Warning*);
|
35
|
+
virtual void operator()(Error*);
|
36
|
+
virtual void operator()(Debug*);
|
37
|
+
virtual void operator()(Comment*);
|
38
|
+
virtual void operator()(If*);
|
39
|
+
virtual void operator()(For*);
|
40
|
+
virtual void operator()(Each*);
|
41
|
+
virtual void operator()(While*);
|
42
|
+
virtual void operator()(Return*);
|
43
|
+
virtual void operator()(Extension*);
|
44
|
+
virtual void operator()(Definition*);
|
45
|
+
virtual void operator()(Mixin_Call*);
|
46
|
+
virtual void operator()(Content*);
|
49
47
|
// expressions
|
50
|
-
virtual void operator()(
|
51
|
-
virtual void operator()(
|
52
|
-
virtual void operator()(
|
53
|
-
virtual void operator()(
|
54
|
-
virtual void operator()(
|
55
|
-
virtual void operator()(
|
56
|
-
virtual void operator()(
|
57
|
-
// virtual void operator()(
|
58
|
-
|
59
|
-
virtual void operator()(
|
60
|
-
virtual void operator()(
|
61
|
-
virtual void operator()(
|
62
|
-
virtual void operator()(
|
63
|
-
virtual void operator()(
|
64
|
-
virtual void operator()(
|
65
|
-
virtual void operator()(
|
66
|
-
virtual void operator()(
|
67
|
-
virtual void operator()(
|
68
|
-
virtual void operator()(
|
69
|
-
virtual void operator()(
|
70
|
-
virtual void operator()(
|
71
|
-
virtual void operator()(
|
72
|
-
virtual void operator()(
|
73
|
-
virtual void operator()(
|
74
|
-
virtual void operator()(
|
75
|
-
virtual void operator()(
|
76
|
-
virtual void operator()(
|
48
|
+
virtual void operator()(Map*);
|
49
|
+
virtual void operator()(Function*);
|
50
|
+
virtual void operator()(List*);
|
51
|
+
virtual void operator()(Binary_Expression*);
|
52
|
+
virtual void operator()(Unary_Expression*);
|
53
|
+
virtual void operator()(Function_Call*);
|
54
|
+
// virtual void operator()(Custom_Warning*);
|
55
|
+
// virtual void operator()(Custom_Error*);
|
56
|
+
virtual void operator()(Variable*);
|
57
|
+
virtual void operator()(Number*);
|
58
|
+
virtual void operator()(Color_RGBA*);
|
59
|
+
virtual void operator()(Color_HSLA*);
|
60
|
+
virtual void operator()(Boolean*);
|
61
|
+
virtual void operator()(String_Schema*);
|
62
|
+
virtual void operator()(String_Constant*);
|
63
|
+
virtual void operator()(String_Quoted*);
|
64
|
+
virtual void operator()(Custom_Error*);
|
65
|
+
virtual void operator()(Custom_Warning*);
|
66
|
+
virtual void operator()(Supports_Operator*);
|
67
|
+
virtual void operator()(Supports_Negation*);
|
68
|
+
virtual void operator()(Supports_Declaration*);
|
69
|
+
virtual void operator()(Supports_Interpolation*);
|
70
|
+
virtual void operator()(Media_Query*);
|
71
|
+
virtual void operator()(Media_Query_Expression*);
|
72
|
+
virtual void operator()(At_Root_Query*);
|
73
|
+
virtual void operator()(Null*);
|
74
|
+
virtual void operator()(Parent_Selector* p);
|
77
75
|
// parameters and arguments
|
78
|
-
virtual void operator()(
|
79
|
-
virtual void operator()(
|
80
|
-
virtual void operator()(
|
81
|
-
virtual void operator()(
|
76
|
+
virtual void operator()(Parameter*);
|
77
|
+
virtual void operator()(Parameters*);
|
78
|
+
virtual void operator()(Argument*);
|
79
|
+
virtual void operator()(Arguments*);
|
82
80
|
// selectors
|
83
|
-
virtual void operator()(
|
84
|
-
virtual void operator()(
|
85
|
-
virtual void operator()(
|
86
|
-
virtual void operator()(
|
87
|
-
virtual void operator()(
|
88
|
-
virtual void operator()(
|
89
|
-
virtual void operator()(
|
90
|
-
virtual void operator()(
|
91
|
-
virtual void operator()(
|
92
|
-
virtual void operator()(
|
93
|
-
virtual void operator()(
|
81
|
+
virtual void operator()(Selector_Schema*);
|
82
|
+
virtual void operator()(Placeholder_Selector*);
|
83
|
+
virtual void operator()(Type_Selector*);
|
84
|
+
virtual void operator()(Class_Selector*);
|
85
|
+
virtual void operator()(Id_Selector*);
|
86
|
+
virtual void operator()(Attribute_Selector*);
|
87
|
+
virtual void operator()(Pseudo_Selector*);
|
88
|
+
virtual void operator()(Wrapped_Selector*);
|
89
|
+
virtual void operator()(Compound_Selector*);
|
90
|
+
virtual void operator()(Complex_Selector*);
|
91
|
+
virtual void operator()(Selector_List*);
|
94
92
|
|
95
|
-
virtual std::string lbracket(
|
96
|
-
virtual std::string rbracket(
|
93
|
+
virtual std::string lbracket(List*);
|
94
|
+
virtual std::string rbracket(List*);
|
97
95
|
|
98
|
-
// template <typename U>
|
99
|
-
// void fallback(U x) { fallback_impl(reinterpret_cast<AST_Node_Ptr>(x)); }
|
100
96
|
};
|
101
97
|
|
102
98
|
}
|
data/ext/libsass/src/json.cpp
CHANGED
@@ -402,7 +402,7 @@ char *json_encode_string(const char *str)
|
|
402
402
|
try {
|
403
403
|
emit_string(&sb, str);
|
404
404
|
}
|
405
|
-
catch (std::exception) {
|
405
|
+
catch (std::exception&) {
|
406
406
|
sb_free(&sb);
|
407
407
|
throw;
|
408
408
|
}
|
@@ -421,7 +421,7 @@ char *json_stringify(const JsonNode *node, const char *space)
|
|
421
421
|
else
|
422
422
|
emit_value(&sb, node);
|
423
423
|
}
|
424
|
-
catch (std::exception) {
|
424
|
+
catch (std::exception&) {
|
425
425
|
sb_free(&sb);
|
426
426
|
throw;
|
427
427
|
}
|
data/ext/libsass/src/lexer.cpp
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
// sass.hpp must go before all system headers to get the
|
2
|
+
// __EXTENSIONS__ fix on Solaris.
|
1
3
|
#include "sass.hpp"
|
4
|
+
|
2
5
|
#include <cctype>
|
3
6
|
#include <iostream>
|
4
7
|
#include <iomanip>
|
@@ -150,11 +153,11 @@ namespace Sass {
|
|
150
153
|
// Match word boundary (zero-width lookahead).
|
151
154
|
const char* word_boundary(const char* src) { return is_character(*src) || *src == '#' ? 0 : src; }
|
152
155
|
|
153
|
-
// Match linefeed /(?:\n|\r\n
|
156
|
+
// Match linefeed /(?:\n|\r\n?|\f)/
|
154
157
|
const char* re_linebreak(const char* src)
|
155
158
|
{
|
156
159
|
// end of file or unix linefeed return here
|
157
|
-
if (*src == 0 || *src == '\n') return src + 1;
|
160
|
+
if (*src == 0 || *src == '\n' || *src == '\f') return src + 1;
|
158
161
|
// a carriage return may optionally be followed by a linefeed
|
159
162
|
if (*src == '\r') return *(src + 1) == '\n' ? src + 2 : src + 1;
|
160
163
|
// no linefeed
|
@@ -166,7 +169,7 @@ namespace Sass {
|
|
166
169
|
const char* end_of_line(const char* src)
|
167
170
|
{
|
168
171
|
// end of file or unix linefeed return here
|
169
|
-
return *src == 0 || *src == '\n' || *src == '\r' ? src : 0;
|
172
|
+
return *src == 0 || *src == '\n' || *src == '\r' || *src == '\f' ? src : 0;
|
170
173
|
}
|
171
174
|
|
172
175
|
// Assert end_of_file boundary (/\z/)
|
data/ext/libsass/src/listize.cpp
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
// sass.hpp must go before all system headers to get the
|
2
|
+
// __EXTENSIONS__ fix on Solaris.
|
1
3
|
#include "sass.hpp"
|
4
|
+
|
2
5
|
#include <iostream>
|
3
6
|
#include <typeinfo>
|
4
7
|
#include <string>
|
@@ -13,7 +16,7 @@ namespace Sass {
|
|
13
16
|
Listize::Listize()
|
14
17
|
{ }
|
15
18
|
|
16
|
-
|
19
|
+
Expression* Listize::operator()(Selector_List* sel)
|
17
20
|
{
|
18
21
|
List_Obj l = SASS_MEMORY_NEW(List, sel->pstate(), sel->length(), SASS_COMMA);
|
19
22
|
l->from_selector(true);
|
@@ -25,24 +28,24 @@ namespace Sass {
|
|
25
28
|
return SASS_MEMORY_NEW(Null, l->pstate());
|
26
29
|
}
|
27
30
|
|
28
|
-
|
31
|
+
Expression* Listize::operator()(Compound_Selector* sel)
|
29
32
|
{
|
30
33
|
std::string str;
|
31
34
|
for (size_t i = 0, L = sel->length(); i < L; ++i) {
|
32
|
-
|
35
|
+
Expression* e = (*sel)[i]->perform(this);
|
33
36
|
if (e) str += e->to_string();
|
34
37
|
}
|
35
38
|
return SASS_MEMORY_NEW(String_Quoted, sel->pstate(), str);
|
36
39
|
}
|
37
40
|
|
38
|
-
|
41
|
+
Expression* Listize::operator()(Complex_Selector* sel)
|
39
42
|
{
|
40
43
|
List_Obj l = SASS_MEMORY_NEW(List, sel->pstate(), 2);
|
41
44
|
l->from_selector(true);
|
42
45
|
Compound_Selector_Obj head = sel->head();
|
43
46
|
if (head && !head->is_empty_reference())
|
44
47
|
{
|
45
|
-
|
48
|
+
Expression* hh = head->perform(this);
|
46
49
|
if (hh) l->append(hh);
|
47
50
|
}
|
48
51
|
|
@@ -71,16 +74,11 @@ namespace Sass {
|
|
71
74
|
if (tail)
|
72
75
|
{
|
73
76
|
Expression_Obj tt = tail->perform(this);
|
74
|
-
if (
|
77
|
+
if (List* ls = Cast<List>(tt))
|
75
78
|
{ l->concat(ls); }
|
76
79
|
}
|
77
80
|
if (l->length() == 0) return 0;
|
78
81
|
return l.detach();
|
79
82
|
}
|
80
83
|
|
81
|
-
Expression_Ptr Listize::fallback_impl(AST_Node_Ptr n)
|
82
|
-
{
|
83
|
-
return Cast<Expression>(n);
|
84
|
-
}
|
85
|
-
|
86
84
|
}
|
data/ext/libsass/src/listize.hpp
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
#ifndef SASS_LISTIZE_H
|
2
2
|
#define SASS_LISTIZE_H
|
3
3
|
|
4
|
+
// sass.hpp must go before all system headers to get the
|
5
|
+
// __EXTENSIONS__ fix on Solaris.
|
6
|
+
#include "sass.hpp"
|
7
|
+
|
4
8
|
#include <vector>
|
5
9
|
#include <iostream>
|
6
10
|
|
@@ -13,20 +17,20 @@ namespace Sass {
|
|
13
17
|
|
14
18
|
struct Backtrace;
|
15
19
|
|
16
|
-
class Listize : public Operation_CRTP<
|
17
|
-
|
18
|
-
Expression_Ptr fallback_impl(AST_Node_Ptr n);
|
20
|
+
class Listize : public Operation_CRTP<Expression*, Listize> {
|
19
21
|
|
20
22
|
public:
|
21
23
|
Listize();
|
22
24
|
~Listize() { }
|
23
25
|
|
24
|
-
|
25
|
-
|
26
|
-
|
26
|
+
Expression* operator()(Selector_List*);
|
27
|
+
Expression* operator()(Complex_Selector*);
|
28
|
+
Expression* operator()(Compound_Selector*);
|
27
29
|
|
30
|
+
// generic fallback
|
28
31
|
template <typename U>
|
29
|
-
|
32
|
+
Expression* fallback(U x)
|
33
|
+
{ return Cast<Expression>(x); }
|
30
34
|
};
|
31
35
|
|
32
36
|
}
|
@@ -18,7 +18,7 @@ namespace Sass {
|
|
18
18
|
std::cerr << "# REPORTING MISSING DEALLOCATIONS #\n";
|
19
19
|
std::cerr << "###################################\n";
|
20
20
|
for (SharedObj* var : all) {
|
21
|
-
if (
|
21
|
+
if (AST_Node* ast = dynamic_cast<AST_Node*>(var)) {
|
22
22
|
debug_ast(ast);
|
23
23
|
} else {
|
24
24
|
std::cerr << "LEAKED " << var << "\n";
|
@@ -30,85 +30,4 @@ namespace Sass {
|
|
30
30
|
#endif
|
31
31
|
|
32
32
|
bool SharedObj::taint = false;
|
33
|
-
|
34
|
-
SharedObj::SharedObj()
|
35
|
-
: detached(false)
|
36
|
-
#ifdef DEBUG_SHARED_PTR
|
37
|
-
, dbg(false)
|
38
|
-
#endif
|
39
|
-
{
|
40
|
-
refcounter = 0;
|
41
|
-
#ifdef DEBUG_SHARED_PTR
|
42
|
-
if (taint) all.push_back(this);
|
43
|
-
#endif
|
44
|
-
};
|
45
|
-
|
46
|
-
SharedObj::~SharedObj() {
|
47
|
-
#ifdef DEBUG_SHARED_PTR
|
48
|
-
if (dbg) std::cerr << "Destruct " << this << "\n";
|
49
|
-
if(!all.empty()) { // check needed for MSVC (no clue why?)
|
50
|
-
all.erase(std::remove(all.begin(), all.end(), this), all.end());
|
51
|
-
}
|
52
|
-
#endif
|
53
|
-
};
|
54
|
-
|
55
|
-
void SharedPtr::decRefCount() {
|
56
|
-
if (node) {
|
57
|
-
-- node->refcounter;
|
58
|
-
#ifdef DEBUG_SHARED_PTR
|
59
|
-
if (node->dbg) std::cerr << "- " << node << " X " << node->refcounter << " (" << this << ") " << "\n";
|
60
|
-
#endif
|
61
|
-
if (node->refcounter == 0) {
|
62
|
-
#ifdef DEBUG_SHARED_PTR
|
63
|
-
// AST_Node_Ptr ast = dynamic_cast<AST_Node*>(node);
|
64
|
-
if (node->dbg) std::cerr << "DELETE NODE " << node << "\n";
|
65
|
-
#endif
|
66
|
-
if (!node->detached) {
|
67
|
-
delete(node);
|
68
|
-
}
|
69
|
-
}
|
70
|
-
}
|
71
|
-
}
|
72
|
-
|
73
|
-
void SharedPtr::incRefCount() {
|
74
|
-
if (node) {
|
75
|
-
++ node->refcounter;
|
76
|
-
node->detached = false;
|
77
|
-
#ifdef DEBUG_SHARED_PTR
|
78
|
-
if (node->dbg) {
|
79
|
-
std::cerr << "+ " << node << " X " << node->refcounter << " (" << this << ") " << "\n";
|
80
|
-
}
|
81
|
-
#endif
|
82
|
-
}
|
83
|
-
}
|
84
|
-
|
85
|
-
SharedPtr::~SharedPtr() {
|
86
|
-
decRefCount();
|
87
|
-
}
|
88
|
-
|
89
|
-
|
90
|
-
// the create constructor
|
91
|
-
SharedPtr::SharedPtr(SharedObj* ptr)
|
92
|
-
: node(ptr) {
|
93
|
-
incRefCount();
|
94
|
-
}
|
95
|
-
// copy assignment operator
|
96
|
-
SharedPtr& SharedPtr::operator=(const SharedPtr& rhs) {
|
97
|
-
void* cur_ptr = (void*) node;
|
98
|
-
void* rhs_ptr = (void*) rhs.node;
|
99
|
-
if (cur_ptr == rhs_ptr) {
|
100
|
-
return *this;
|
101
|
-
}
|
102
|
-
decRefCount();
|
103
|
-
node = rhs.node;
|
104
|
-
incRefCount();
|
105
|
-
return *this;
|
106
|
-
}
|
107
|
-
|
108
|
-
// the copy constructor
|
109
|
-
SharedPtr::SharedPtr(const SharedPtr& obj)
|
110
|
-
: node(obj.node) {
|
111
|
-
incRefCount();
|
112
|
-
}
|
113
|
-
|
114
|
-
}
|
33
|
+
}
|
@@ -3,6 +3,8 @@
|
|
3
3
|
|
4
4
|
#include "sass/base.h"
|
5
5
|
|
6
|
+
#include <iostream>
|
7
|
+
#include <string>
|
6
8
|
#include <vector>
|
7
9
|
|
8
10
|
namespace Sass {
|
@@ -39,168 +41,150 @@ namespace Sass {
|
|
39
41
|
#endif
|
40
42
|
|
41
43
|
class SharedObj {
|
42
|
-
|
43
|
-
|
44
|
-
|
44
|
+
public:
|
45
|
+
SharedObj() : refcount(0), detached(false) {
|
46
|
+
#ifdef DEBUG_SHARED_PTR
|
47
|
+
if (taint) all.push_back(this);
|
48
|
+
#endif
|
49
|
+
}
|
50
|
+
virtual ~SharedObj() {
|
51
|
+
#ifdef DEBUG_SHARED_PTR
|
52
|
+
all.clear();
|
53
|
+
#endif
|
54
|
+
}
|
55
|
+
|
45
56
|
#ifdef DEBUG_SHARED_PTR
|
46
|
-
|
47
|
-
|
48
|
-
|
57
|
+
static void dumpMemLeaks();
|
58
|
+
SharedObj* trace(std::string file, size_t line) {
|
59
|
+
this->file = file;
|
60
|
+
this->line = line;
|
61
|
+
return this;
|
62
|
+
}
|
63
|
+
std::string getDbgFile() { return file; }
|
64
|
+
size_t getDbgLine() { return line; }
|
65
|
+
void setDbg(bool dbg) { this->dbg = dbg; }
|
66
|
+
size_t getRefCount() const { return refcount; }
|
49
67
|
#endif
|
50
|
-
|
51
|
-
|
52
|
-
|
68
|
+
|
69
|
+
static void setTaint(bool val) { taint = val; }
|
70
|
+
|
71
|
+
virtual const std::string to_string() const = 0;
|
72
|
+
protected:
|
73
|
+
friend class SharedPtr;
|
74
|
+
friend class Memory_Manager;
|
75
|
+
size_t refcount;
|
53
76
|
bool detached;
|
77
|
+
static bool taint;
|
54
78
|
#ifdef DEBUG_SHARED_PTR
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
static void dumpMemLeaks();
|
60
|
-
SharedObj* trace(std::string file, size_t line) {
|
61
|
-
this->file = file;
|
62
|
-
this->line = line;
|
63
|
-
return this;
|
64
|
-
}
|
65
|
-
#endif
|
66
|
-
SharedObj();
|
67
|
-
#ifdef DEBUG_SHARED_PTR
|
68
|
-
std::string getDbgFile() {
|
69
|
-
return file;
|
70
|
-
}
|
71
|
-
size_t getDbgLine() {
|
72
|
-
return line;
|
73
|
-
}
|
74
|
-
void setDbg(bool dbg) {
|
75
|
-
this->dbg = dbg;
|
76
|
-
}
|
79
|
+
std::string file;
|
80
|
+
size_t line;
|
81
|
+
bool dbg = false;
|
82
|
+
static std::vector<SharedObj*> all;
|
77
83
|
#endif
|
78
|
-
static void setTaint(bool val) {
|
79
|
-
taint = val;
|
80
|
-
}
|
81
|
-
virtual ~SharedObj();
|
82
|
-
long getRefCount() {
|
83
|
-
return refcounter;
|
84
|
-
}
|
85
84
|
};
|
86
85
|
|
87
|
-
|
88
86
|
class SharedPtr {
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
SharedPtr(SharedObj*
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
// move assignment operator
|
107
|
-
SharedPtr& operator=(SharedPtr&& obj);
|
108
|
-
// pure virtual destructor
|
109
|
-
virtual ~SharedPtr() = 0;
|
110
|
-
public:
|
111
|
-
SharedObj* obj () const {
|
112
|
-
return node;
|
113
|
-
};
|
114
|
-
SharedObj* operator-> () const {
|
115
|
-
return node;
|
116
|
-
};
|
117
|
-
bool isNull () {
|
118
|
-
return node == NULL;
|
119
|
-
};
|
120
|
-
bool isNull () const {
|
121
|
-
return node == NULL;
|
122
|
-
};
|
123
|
-
SharedObj* detach() const {
|
124
|
-
if (node) {
|
125
|
-
node->detached = true;
|
87
|
+
public:
|
88
|
+
SharedPtr() : node(nullptr) {}
|
89
|
+
SharedPtr(SharedObj* ptr) : node(ptr) {
|
90
|
+
incRefCount();
|
91
|
+
}
|
92
|
+
SharedPtr(const SharedPtr& obj) : SharedPtr(obj.node) {}
|
93
|
+
~SharedPtr() {
|
94
|
+
decRefCount();
|
95
|
+
}
|
96
|
+
|
97
|
+
SharedPtr& operator=(SharedObj* other_node) {
|
98
|
+
if (node != other_node) {
|
99
|
+
decRefCount();
|
100
|
+
node = other_node;
|
101
|
+
incRefCount();
|
102
|
+
} else if (node != nullptr) {
|
103
|
+
node->detached = false;
|
126
104
|
}
|
127
|
-
return
|
128
|
-
}
|
129
|
-
operator bool() const {
|
130
|
-
return node != NULL;
|
131
|
-
};
|
105
|
+
return *this;
|
106
|
+
}
|
132
107
|
|
133
|
-
|
108
|
+
SharedPtr& operator=(const SharedPtr& obj) {
|
109
|
+
return *this = obj.node;
|
110
|
+
}
|
134
111
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
: SharedPtr(NULL) {};
|
140
|
-
SharedImpl(T* node)
|
141
|
-
: SharedPtr(node) {};
|
142
|
-
template < class U >
|
143
|
-
SharedImpl(SharedImpl<U> obj)
|
144
|
-
: SharedPtr(static_cast<T*>(obj.ptr())) {}
|
145
|
-
SharedImpl(T&& node)
|
146
|
-
: SharedPtr(node) {};
|
147
|
-
SharedImpl(const T& node)
|
148
|
-
: SharedPtr(node) {};
|
149
|
-
// the copy constructor
|
150
|
-
SharedImpl(const SharedImpl<T>& impl)
|
151
|
-
: SharedPtr(impl.node) {};
|
152
|
-
// the move constructor
|
153
|
-
SharedImpl(SharedImpl<T>&& impl)
|
154
|
-
: SharedPtr(impl.node) {};
|
155
|
-
// copy assignment operator
|
156
|
-
SharedImpl<T>& operator=(const SharedImpl<T>& rhs) {
|
157
|
-
if (node) decRefCount();
|
158
|
-
node = rhs.node;
|
159
|
-
incRefCount();
|
160
|
-
return *this;
|
112
|
+
// Prevents all SharedPtrs from freeing this node until it is assigned to another SharedPtr.
|
113
|
+
SharedObj* detach() {
|
114
|
+
if (node != nullptr) node->detached = true;
|
115
|
+
return node;
|
161
116
|
}
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
117
|
+
|
118
|
+
SharedObj* obj() const { return node; }
|
119
|
+
SharedObj* operator->() const { return node; }
|
120
|
+
bool isNull() const { return node == nullptr; }
|
121
|
+
operator bool() const { return node != nullptr; }
|
122
|
+
|
123
|
+
protected:
|
124
|
+
SharedObj* node;
|
125
|
+
void decRefCount() {
|
126
|
+
if (node == nullptr) return;
|
127
|
+
--node->refcount;
|
128
|
+
#ifdef DEBUG_SHARED_PTR
|
129
|
+
if (node->dbg) std::cerr << "- " << node << " X " << node->refcount << " (" << this << ") " << "\n";
|
130
|
+
#endif
|
131
|
+
if (node->refcount == 0 && !node->detached) {
|
132
|
+
#ifdef DEBUG_SHARED_PTR
|
133
|
+
if (node->dbg) std::cerr << "DELETE NODE " << node << "\n";
|
134
|
+
#endif
|
135
|
+
delete node;
|
169
136
|
}
|
170
|
-
return *this;
|
171
137
|
}
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
138
|
+
void incRefCount() {
|
139
|
+
if (node == nullptr) return;
|
140
|
+
node->detached = false;
|
141
|
+
++node->refcount;
|
142
|
+
#ifdef DEBUG_SHARED_PTR
|
143
|
+
if (node->dbg) std::cerr << "+ " << node << " X " << node->refcount << " (" << this << ") " << "\n";
|
144
|
+
#endif
|
176
145
|
}
|
177
|
-
|
178
|
-
|
146
|
+
};
|
147
|
+
|
148
|
+
template <class T>
|
149
|
+
class SharedImpl : private SharedPtr {
|
150
|
+
public:
|
151
|
+
SharedImpl() : SharedPtr(nullptr) {}
|
152
|
+
|
153
|
+
template <class U>
|
154
|
+
SharedImpl(U* node) :
|
155
|
+
SharedPtr(static_cast<T*>(node)) {}
|
156
|
+
|
157
|
+
template <class U>
|
158
|
+
SharedImpl(const SharedImpl<U>& impl) :
|
159
|
+
SharedImpl(impl.ptr()) {}
|
160
|
+
|
161
|
+
template <class U>
|
162
|
+
SharedImpl<T>& operator=(U *rhs) {
|
163
|
+
return static_cast<SharedImpl<T>&>(
|
164
|
+
SharedPtr::operator=(static_cast<T*>(rhs)));
|
179
165
|
}
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
};
|
186
|
-
T* ptr () const {
|
187
|
-
return static_cast<T*>(this->obj());
|
188
|
-
};
|
189
|
-
T* detach() const {
|
190
|
-
if (this->obj() == NULL) return NULL;
|
191
|
-
return static_cast<T*>(SharedPtr::detach());
|
166
|
+
|
167
|
+
template <class U>
|
168
|
+
SharedImpl<T>& operator=(const SharedImpl<U>& rhs) {
|
169
|
+
return static_cast<SharedImpl<T>&>(
|
170
|
+
SharedPtr::operator=(static_cast<const SharedImpl<T>&>(rhs)));
|
192
171
|
}
|
193
|
-
|
194
|
-
|
172
|
+
|
173
|
+
operator const std::string() const {
|
174
|
+
if (node) return node->to_string();
|
175
|
+
return "[nullptr]";
|
195
176
|
}
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
operator
|
200
|
-
|
201
|
-
};
|
177
|
+
|
178
|
+
using SharedPtr::isNull;
|
179
|
+
using SharedPtr::operator bool;
|
180
|
+
operator T*() const { return static_cast<T*>(this->obj()); }
|
181
|
+
operator T&() const { return *static_cast<T*>(this->obj()); }
|
182
|
+
T& operator* () const { return *static_cast<T*>(this->obj()); };
|
183
|
+
T* operator-> () const { return static_cast<T*>(this->obj()); };
|
184
|
+
T* ptr () const { return static_cast<T*>(this->obj()); };
|
185
|
+
T* detach() { return static_cast<T*>(SharedPtr::detach()); }
|
202
186
|
};
|
203
187
|
|
204
188
|
}
|
205
189
|
|
206
|
-
#endif
|
190
|
+
#endif
|