sassc 2.0.1 → 2.1.0.pre1
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/.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
|