sassc 1.11.1 → 1.11.2
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 +2 -2
- data/README.md +3 -2
- data/ext/libsass/Makefile.conf +2 -1
- data/ext/libsass/appveyor.yml +10 -5
- data/ext/libsass/docs/dev-ast-memory.md +223 -0
- data/ext/libsass/include/sass/base.h +2 -0
- data/ext/libsass/script/bootstrap +7 -4
- data/ext/libsass/script/ci-build-libsass +3 -3
- data/ext/libsass/script/ci-install-compiler +2 -0
- data/ext/libsass/script/ci-report-coverage +2 -1
- data/ext/libsass/script/test-leaks.pl +103 -0
- data/ext/libsass/src/ast.cpp +621 -495
- data/ext/libsass/src/ast.hpp +801 -367
- data/ext/libsass/src/ast_def_macros.hpp +5 -5
- data/ext/libsass/src/ast_fwd_decl.hpp +312 -14
- data/ext/libsass/src/bind.cpp +54 -51
- data/ext/libsass/src/bind.hpp +3 -7
- data/ext/libsass/src/check_nesting.cpp +117 -120
- data/ext/libsass/src/check_nesting.hpp +38 -34
- data/ext/libsass/src/color_maps.cpp +3 -3
- data/ext/libsass/src/color_maps.hpp +3 -3
- data/ext/libsass/src/context.cpp +33 -34
- data/ext/libsass/src/context.hpp +12 -14
- data/ext/libsass/src/cssize.cpp +200 -228
- data/ext/libsass/src/cssize.hpp +49 -49
- data/ext/libsass/src/debugger.hpp +260 -241
- data/ext/libsass/src/emitter.cpp +6 -6
- data/ext/libsass/src/emitter.hpp +7 -7
- data/ext/libsass/src/environment.cpp +2 -2
- data/ext/libsass/src/environment.hpp +0 -2
- data/ext/libsass/src/error_handling.cpp +5 -5
- data/ext/libsass/src/error_handling.hpp +12 -12
- data/ext/libsass/src/eval.cpp +412 -401
- data/ext/libsass/src/eval.hpp +61 -62
- data/ext/libsass/src/expand.cpp +223 -204
- data/ext/libsass/src/expand.hpp +42 -42
- data/ext/libsass/src/extend.cpp +198 -201
- data/ext/libsass/src/extend.hpp +12 -14
- data/ext/libsass/src/file.hpp +4 -5
- data/ext/libsass/src/functions.cpp +413 -418
- data/ext/libsass/src/functions.hpp +7 -10
- data/ext/libsass/src/inspect.cpp +115 -109
- data/ext/libsass/src/inspect.hpp +69 -69
- data/ext/libsass/src/listize.cpp +31 -33
- data/ext/libsass/src/listize.hpp +8 -10
- data/ext/libsass/src/memory/SharedPtr.cpp +116 -0
- data/ext/libsass/src/memory/SharedPtr.hpp +202 -0
- data/ext/libsass/src/node.cpp +45 -43
- data/ext/libsass/src/node.hpp +15 -15
- data/ext/libsass/src/operation.hpp +136 -136
- data/ext/libsass/src/output.cpp +48 -49
- data/ext/libsass/src/output.hpp +14 -14
- data/ext/libsass/src/parser.cpp +530 -554
- data/ext/libsass/src/parser.hpp +91 -96
- data/ext/libsass/src/prelexer.cpp +13 -10
- data/ext/libsass/src/remove_placeholders.cpp +25 -21
- data/ext/libsass/src/remove_placeholders.hpp +7 -7
- data/ext/libsass/src/sass2scss.cpp +2 -1
- data/ext/libsass/src/sass_context.cpp +125 -107
- data/ext/libsass/src/sass_context.hpp +1 -1
- data/ext/libsass/src/sass_util.hpp +5 -5
- data/ext/libsass/src/sass_values.cpp +27 -27
- data/ext/libsass/src/source_map.cpp +2 -2
- data/ext/libsass/src/source_map.hpp +2 -2
- data/ext/libsass/src/subset_map.cpp +57 -0
- data/ext/libsass/src/subset_map.hpp +8 -76
- data/ext/libsass/src/to_c.cpp +13 -13
- data/ext/libsass/src/to_c.hpp +14 -14
- data/ext/libsass/src/to_value.cpp +20 -20
- data/ext/libsass/src/to_value.hpp +20 -21
- data/ext/libsass/src/util.cpp +55 -88
- data/ext/libsass/src/util.hpp +9 -13
- data/ext/libsass/src/values.cpp +27 -26
- data/ext/libsass/src/values.hpp +2 -2
- data/ext/libsass/test/test_subset_map.cpp +69 -69
- data/ext/libsass/win/libsass.targets +3 -2
- data/ext/libsass/win/libsass.vcxproj.filters +9 -6
- data/lib/sassc/version.rb +1 -1
- data/sassc.gemspec +0 -1
- data/test/native_test.rb +1 -1
- metadata +7 -5
- data/ext/libsass/src/ast_factory.hpp +0 -92
- data/ext/libsass/src/memory_manager.cpp +0 -77
- data/ext/libsass/src/memory_manager.hpp +0 -48
@@ -28,13 +28,13 @@ class LocalOption {
|
|
28
28
|
|
29
29
|
#define ATTACH_OPERATIONS()\
|
30
30
|
virtual void perform(Operation<void>* op) { (*op)(this); }\
|
31
|
-
virtual
|
32
|
-
virtual
|
33
|
-
virtual
|
34
|
-
virtual
|
31
|
+
virtual AST_Node_Ptr perform(Operation<AST_Node_Ptr>* op) { return (*op)(this); }\
|
32
|
+
virtual Statement_Ptr perform(Operation<Statement_Ptr>* op) { return (*op)(this); }\
|
33
|
+
virtual Expression_Ptr perform(Operation<Expression_Ptr>* op) { return (*op)(this); }\
|
34
|
+
virtual Selector_Ptr perform(Operation<Selector_Ptr>* op) { return (*op)(this); }\
|
35
35
|
virtual std::string perform(Operation<std::string>* op) { return (*op)(this); }\
|
36
36
|
virtual union Sass_Value* perform(Operation<union Sass_Value*>* op) { return (*op)(this); }\
|
37
|
-
virtual
|
37
|
+
virtual Value_Ptr perform(Operation<Value_Ptr>* op) { return (*op)(this); }
|
38
38
|
|
39
39
|
#define ADD_PROPERTY(type, name)\
|
40
40
|
protected:\
|
@@ -1,91 +1,389 @@
|
|
1
1
|
#ifndef SASS_AST_FWD_DECL_H
|
2
2
|
#define SASS_AST_FWD_DECL_H
|
3
3
|
|
4
|
+
#include <vector>
|
5
|
+
#include <iostream>
|
6
|
+
#include <algorithm>
|
7
|
+
#include <unordered_map>
|
8
|
+
#include <unordered_set>
|
9
|
+
#include "memory/SharedPtr.hpp"
|
10
|
+
|
4
11
|
/////////////////////////////////////////////
|
5
12
|
// Forward declarations for the AST visitors.
|
6
13
|
/////////////////////////////////////////////
|
7
14
|
namespace Sass {
|
8
15
|
|
9
16
|
class AST_Node;
|
10
|
-
|
11
|
-
|
17
|
+
typedef AST_Node* AST_Node_Ptr;
|
18
|
+
typedef AST_Node const* AST_Node_Ptr_Const;
|
19
|
+
|
20
|
+
class Has_Block;
|
21
|
+
typedef Has_Block* Has_Block_Ptr;
|
22
|
+
typedef Has_Block const* Has_Block_Ptr_Const;
|
23
|
+
|
24
|
+
class Simple_Selector;
|
25
|
+
typedef Simple_Selector* Simple_Selector_Ptr;
|
26
|
+
typedef Simple_Selector const* Simple_Selector_Ptr_Const;
|
27
|
+
|
28
|
+
class PreValue;
|
29
|
+
typedef PreValue* PreValue_Ptr;
|
30
|
+
typedef PreValue const* PreValue_Ptr_Const;
|
31
|
+
class Thunk;
|
32
|
+
typedef Thunk* Thunk_Ptr;
|
33
|
+
typedef Thunk const* Thunk_Ptr_Const;
|
12
34
|
class Block;
|
35
|
+
typedef Block* Block_Ptr;
|
36
|
+
typedef Block const* Block_Ptr_Const;
|
37
|
+
class Expression;
|
38
|
+
typedef Expression* Expression_Ptr;
|
39
|
+
typedef Expression const* Expression_Ptr_Const;
|
40
|
+
class Statement;
|
41
|
+
typedef Statement* Statement_Ptr;
|
42
|
+
typedef Statement const* Statement_Ptr_Const;
|
43
|
+
class Value;
|
44
|
+
typedef Value* Value_Ptr;
|
45
|
+
typedef Value const* Value_Ptr_Const;
|
46
|
+
class Declaration;
|
47
|
+
typedef Declaration* Declaration_Ptr;
|
48
|
+
typedef Declaration const* Declaration_Ptr_Const;
|
13
49
|
class Ruleset;
|
50
|
+
typedef Ruleset* Ruleset_Ptr;
|
51
|
+
typedef Ruleset const* Ruleset_Ptr_Const;
|
14
52
|
class Bubble;
|
53
|
+
typedef Bubble* Bubble_Ptr;
|
54
|
+
typedef Bubble const* Bubble_Ptr_Const;
|
15
55
|
class Trace;
|
56
|
+
typedef Trace* Trace_Ptr;
|
57
|
+
typedef Trace const* Trace_Ptr_Const;
|
58
|
+
|
16
59
|
class Media_Block;
|
60
|
+
typedef Media_Block* Media_Block_Ptr;
|
61
|
+
typedef Media_Block const* Media_Block_Ptr_Const;
|
17
62
|
class Supports_Block;
|
63
|
+
typedef Supports_Block* Supports_Block_Ptr;
|
64
|
+
typedef Supports_Block const* Supports_Block_Ptr_Const;
|
18
65
|
class Directive;
|
66
|
+
typedef Directive* Directive_Ptr;
|
67
|
+
typedef Directive const* Directive_Ptr_Const;
|
68
|
+
|
69
|
+
|
19
70
|
class Keyframe_Rule;
|
71
|
+
typedef Keyframe_Rule* Keyframe_Rule_Ptr;
|
72
|
+
typedef Keyframe_Rule const* Keyframe_Rule_Ptr_Const;
|
20
73
|
class At_Root_Block;
|
21
|
-
|
74
|
+
typedef At_Root_Block* At_Root_Block_Ptr;
|
75
|
+
typedef At_Root_Block const* At_Root_Block_Ptr_Const;
|
22
76
|
class Assignment;
|
77
|
+
typedef Assignment* Assignment_Ptr;
|
78
|
+
typedef Assignment const* Assignment_Ptr_Const;
|
79
|
+
|
23
80
|
class Import;
|
81
|
+
typedef Import* Import_Ptr;
|
82
|
+
typedef Import const* Import_Ptr_Const;
|
24
83
|
class Import_Stub;
|
84
|
+
typedef Import_Stub* Import_Stub_Ptr;
|
85
|
+
typedef Import_Stub const* Import_Stub_Ptr_Const;
|
25
86
|
class Warning;
|
87
|
+
typedef Warning* Warning_Ptr;
|
88
|
+
typedef Warning const* Warning_Ptr_Const;
|
89
|
+
|
26
90
|
class Error;
|
91
|
+
typedef Error* Error_Ptr;
|
92
|
+
typedef Error const* Error_Ptr_Const;
|
27
93
|
class Debug;
|
94
|
+
typedef Debug* Debug_Ptr;
|
95
|
+
typedef Debug const* Debug_Ptr_Const;
|
28
96
|
class Comment;
|
97
|
+
typedef Comment* Comment_Ptr;
|
98
|
+
typedef Comment const* Comment_Ptr_Const;
|
99
|
+
|
29
100
|
class If;
|
101
|
+
typedef If* If_Ptr;
|
102
|
+
typedef If const* If_Ptr_Const;
|
30
103
|
class For;
|
104
|
+
typedef For* For_Ptr;
|
105
|
+
typedef For const* For_Ptr_Const;
|
31
106
|
class Each;
|
107
|
+
typedef Each* Each_Ptr;
|
108
|
+
typedef Each const* Each_Ptr_Const;
|
32
109
|
class While;
|
110
|
+
typedef While* While_Ptr;
|
111
|
+
typedef While const* While_Ptr_Const;
|
33
112
|
class Return;
|
113
|
+
typedef Return* Return_Ptr;
|
114
|
+
typedef Return const* Return_Ptr_Const;
|
34
115
|
class Content;
|
116
|
+
typedef Content* Content_Ptr;
|
117
|
+
typedef Content const* Content_Ptr_Const;
|
35
118
|
class Extension;
|
119
|
+
typedef Extension* Extension_Ptr;
|
120
|
+
typedef Extension const* Extension_Ptr_Const;
|
36
121
|
class Definition;
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
class Expression;
|
122
|
+
typedef Definition* Definition_Ptr;
|
123
|
+
typedef Definition const* Definition_Ptr_Const;
|
124
|
+
|
41
125
|
class List;
|
126
|
+
typedef List* List_Ptr;
|
127
|
+
typedef List const* List_Ptr_Const;
|
42
128
|
class Map;
|
129
|
+
typedef Map* Map_Ptr;
|
130
|
+
typedef Map const* Map_Ptr_Const;
|
131
|
+
|
132
|
+
class Mixin_Call;
|
133
|
+
typedef Mixin_Call* Mixin_Call_Ptr;
|
134
|
+
typedef Mixin_Call const* Mixin_Call_Ptr_Const;
|
43
135
|
class Binary_Expression;
|
136
|
+
typedef Binary_Expression* Binary_Expression_Ptr;
|
137
|
+
typedef Binary_Expression const* Binary_Expression_Ptr_Const;
|
44
138
|
class Unary_Expression;
|
139
|
+
typedef Unary_Expression* Unary_Expression_Ptr;
|
140
|
+
typedef Unary_Expression const* Unary_Expression_Ptr_Const;
|
45
141
|
class Function_Call;
|
142
|
+
typedef Function_Call* Function_Call_Ptr;
|
143
|
+
typedef Function_Call const* Function_Call_Ptr_Const;
|
46
144
|
class Function_Call_Schema;
|
145
|
+
typedef Function_Call_Schema* Function_Call_Schema_Ptr;
|
146
|
+
typedef Function_Call_Schema const* Function_Call_Schema_Ptr_Const;
|
47
147
|
class Custom_Warning;
|
148
|
+
typedef Custom_Warning* Custom_Warning_Ptr;
|
149
|
+
typedef Custom_Warning const* Custom_Warning_Ptr_Const;
|
48
150
|
class Custom_Error;
|
151
|
+
typedef Custom_Error* Custom_Error_Ptr;
|
152
|
+
typedef Custom_Error const* Custom_Error_Ptr_Const;
|
153
|
+
|
49
154
|
class Variable;
|
155
|
+
typedef Variable* Variable_Ptr;
|
156
|
+
typedef Variable const* Variable_Ptr_Const;
|
50
157
|
class Textual;
|
158
|
+
typedef Textual* Textual_Ptr;
|
159
|
+
typedef Textual const* Textual_Ptr_Const;
|
51
160
|
class Number;
|
161
|
+
typedef Number* Number_Ptr;
|
162
|
+
typedef Number const* Number_Ptr_Const;
|
52
163
|
class Color;
|
164
|
+
typedef Color* Color_Ptr;
|
165
|
+
typedef Color const* Color_Ptr_Const;
|
53
166
|
class Boolean;
|
54
|
-
|
167
|
+
typedef Boolean* Boolean_Ptr;
|
168
|
+
typedef Boolean const* Boolean_Ptr_Const;
|
55
169
|
class String;
|
170
|
+
typedef String* String_Ptr;
|
171
|
+
typedef String const* String_Ptr_Const;
|
172
|
+
|
173
|
+
class String_Schema;
|
174
|
+
typedef String_Schema* String_Schema_Ptr;
|
175
|
+
typedef String_Schema const* String_Schema_Ptr_Const;
|
56
176
|
class String_Constant;
|
177
|
+
typedef String_Constant* String_Constant_Ptr;
|
178
|
+
typedef String_Constant const* String_Constant_Ptr_Const;
|
57
179
|
class String_Quoted;
|
180
|
+
typedef String_Quoted* String_Quoted_Ptr;
|
181
|
+
typedef String_Quoted const* String_Quoted_Ptr_Const;
|
182
|
+
|
58
183
|
class Media_Query;
|
184
|
+
typedef Media_Query* Media_Query_Ptr;
|
185
|
+
typedef Media_Query const* Media_Query_Ptr_Const;
|
59
186
|
class Media_Query_Expression;
|
187
|
+
typedef Media_Query_Expression* Media_Query_Expression_Ptr;
|
188
|
+
typedef Media_Query_Expression const* Media_Query_Expression_Ptr_Const;
|
60
189
|
class Supports_Condition;
|
190
|
+
typedef Supports_Condition* Supports_Condition_Ptr;
|
191
|
+
typedef Supports_Condition const* Supports_Condition_Ptr_Const;
|
61
192
|
class Supports_Operator;
|
193
|
+
typedef Supports_Operator* Supports_Operator_Ptr;
|
194
|
+
typedef Supports_Operator const* Supports_Operator_Ptr_Const;
|
62
195
|
class Supports_Negation;
|
196
|
+
typedef Supports_Negation* Supports_Negation_Ptr;
|
197
|
+
typedef Supports_Negation const* Supports_Negation_Ptr_Const;
|
63
198
|
class Supports_Declaration;
|
199
|
+
typedef Supports_Declaration* Supports_Declaration_Ptr;
|
200
|
+
typedef Supports_Declaration const* Supports_Declaration_Ptr_Const;
|
64
201
|
class Supports_Interpolation;
|
65
|
-
|
202
|
+
typedef Supports_Interpolation* Supports_Interpolation_Ptr;
|
203
|
+
typedef Supports_Interpolation const* Supports_Interpolation_Ptr_Const;
|
204
|
+
|
205
|
+
|
66
206
|
class Null;
|
207
|
+
typedef Null* Null_Ptr;
|
208
|
+
typedef Null const* Null_Ptr_Const;
|
209
|
+
|
210
|
+
class At_Root_Query;
|
211
|
+
typedef At_Root_Query* At_Root_Query_Ptr;
|
212
|
+
typedef At_Root_Query const* At_Root_Query_Ptr_Const;
|
67
213
|
class Parent_Selector;
|
68
|
-
|
214
|
+
typedef Parent_Selector* Parent_Selector_Ptr;
|
215
|
+
typedef Parent_Selector const* Parent_Selector_Ptr_Const;
|
69
216
|
class Parameter;
|
217
|
+
typedef Parameter* Parameter_Ptr;
|
218
|
+
typedef Parameter const* Parameter_Ptr_Const;
|
70
219
|
class Parameters;
|
220
|
+
typedef Parameters* Parameters_Ptr;
|
221
|
+
typedef Parameters const* Parameters_Ptr_Const;
|
71
222
|
class Argument;
|
223
|
+
typedef Argument* Argument_Ptr;
|
224
|
+
typedef Argument const* Argument_Ptr_Const;
|
72
225
|
class Arguments;
|
73
|
-
|
226
|
+
typedef Arguments* Arguments_Ptr;
|
227
|
+
typedef Arguments const* Arguments_Ptr_Const;
|
74
228
|
class Selector;
|
229
|
+
typedef Selector* Selector_Ptr;
|
230
|
+
typedef Selector const* Selector_Ptr_Const;
|
231
|
+
|
232
|
+
|
75
233
|
class Selector_Schema;
|
234
|
+
typedef Selector_Schema* Selector_Schema_Ptr;
|
235
|
+
typedef Selector_Schema const* Selector_Schema_Ptr_Const;
|
76
236
|
class Placeholder_Selector;
|
237
|
+
typedef Placeholder_Selector* Placeholder_Selector_Ptr;
|
238
|
+
typedef Placeholder_Selector const* Placeholder_Selector_Ptr_Const;
|
77
239
|
class Element_Selector;
|
240
|
+
typedef Element_Selector* Element_Selector_Ptr;
|
241
|
+
typedef Element_Selector const* Element_Selector_Ptr_Const;
|
78
242
|
class Class_Selector;
|
243
|
+
typedef Class_Selector* Class_Selector_Ptr;
|
244
|
+
typedef Class_Selector const* Class_Selector_Ptr_Const;
|
79
245
|
class Id_Selector;
|
246
|
+
typedef Id_Selector* Id_Selector_Ptr;
|
247
|
+
typedef Id_Selector const* Id_Selector_Ptr_Const;
|
80
248
|
class Attribute_Selector;
|
249
|
+
typedef Attribute_Selector* Attribute_Selector_Ptr;
|
250
|
+
typedef Attribute_Selector const* Attribute_Selector_Ptr_Const;
|
251
|
+
|
81
252
|
class Pseudo_Selector;
|
253
|
+
typedef Pseudo_Selector* Pseudo_Selector_Ptr;
|
254
|
+
typedef Pseudo_Selector const * Pseudo_Selector_Ptr_Const;
|
82
255
|
class Wrapped_Selector;
|
83
|
-
|
84
|
-
|
85
|
-
class
|
256
|
+
typedef Wrapped_Selector* Wrapped_Selector_Ptr;
|
257
|
+
typedef Wrapped_Selector const * Wrapped_Selector_Ptr_Const;
|
258
|
+
class Compound_Selector;
|
259
|
+
typedef Compound_Selector* Compound_Selector_Ptr;
|
260
|
+
typedef Compound_Selector const * Compound_Selector_Ptr_Const;
|
261
|
+
class Complex_Selector;
|
262
|
+
typedef Complex_Selector* Complex_Selector_Ptr;
|
263
|
+
typedef Complex_Selector const * Complex_Selector_Ptr_Const;
|
264
|
+
class Selector_List;
|
265
|
+
typedef Selector_List* Selector_List_Ptr;
|
266
|
+
typedef Selector_List const * Selector_List_Ptr_Const;
|
267
|
+
|
86
268
|
|
87
269
|
// common classes
|
88
270
|
class Context;
|
271
|
+
class Expand;
|
272
|
+
class Eval;
|
273
|
+
|
274
|
+
// declare classes that are instances of memory nodes
|
275
|
+
// #define IMPL_MEM_OBJ(type) using type##_Obj = SharedImpl<type>
|
276
|
+
#define IMPL_MEM_OBJ(type) typedef SharedImpl<type> type##_Obj
|
277
|
+
|
278
|
+
IMPL_MEM_OBJ(AST_Node);
|
279
|
+
IMPL_MEM_OBJ(Statement);
|
280
|
+
IMPL_MEM_OBJ(Block);
|
281
|
+
IMPL_MEM_OBJ(Ruleset);
|
282
|
+
IMPL_MEM_OBJ(Bubble);
|
283
|
+
IMPL_MEM_OBJ(Trace);
|
284
|
+
IMPL_MEM_OBJ(Media_Block);
|
285
|
+
IMPL_MEM_OBJ(Supports_Block);
|
286
|
+
IMPL_MEM_OBJ(Directive);
|
287
|
+
IMPL_MEM_OBJ(Keyframe_Rule);
|
288
|
+
IMPL_MEM_OBJ(At_Root_Block);
|
289
|
+
IMPL_MEM_OBJ(Declaration);
|
290
|
+
IMPL_MEM_OBJ(Assignment);
|
291
|
+
IMPL_MEM_OBJ(Import);
|
292
|
+
IMPL_MEM_OBJ(Import_Stub);
|
293
|
+
IMPL_MEM_OBJ(Warning);
|
294
|
+
IMPL_MEM_OBJ(Error);
|
295
|
+
IMPL_MEM_OBJ(Debug);
|
296
|
+
IMPL_MEM_OBJ(Comment);
|
297
|
+
IMPL_MEM_OBJ(PreValue);
|
298
|
+
IMPL_MEM_OBJ(Has_Block);
|
299
|
+
IMPL_MEM_OBJ(Thunk);
|
300
|
+
IMPL_MEM_OBJ(If);
|
301
|
+
IMPL_MEM_OBJ(For);
|
302
|
+
IMPL_MEM_OBJ(Each);
|
303
|
+
IMPL_MEM_OBJ(While);
|
304
|
+
IMPL_MEM_OBJ(Return);
|
305
|
+
IMPL_MEM_OBJ(Content);
|
306
|
+
IMPL_MEM_OBJ(Extension);
|
307
|
+
IMPL_MEM_OBJ(Definition);
|
308
|
+
IMPL_MEM_OBJ(Mixin_Call);
|
309
|
+
IMPL_MEM_OBJ(Value);
|
310
|
+
IMPL_MEM_OBJ(Expression);
|
311
|
+
IMPL_MEM_OBJ(List);
|
312
|
+
IMPL_MEM_OBJ(Map);
|
313
|
+
IMPL_MEM_OBJ(Binary_Expression);
|
314
|
+
IMPL_MEM_OBJ(Unary_Expression);
|
315
|
+
IMPL_MEM_OBJ(Function_Call);
|
316
|
+
IMPL_MEM_OBJ(Function_Call_Schema);
|
317
|
+
IMPL_MEM_OBJ(Custom_Warning);
|
318
|
+
IMPL_MEM_OBJ(Custom_Error);
|
319
|
+
IMPL_MEM_OBJ(Variable);
|
320
|
+
IMPL_MEM_OBJ(Textual);
|
321
|
+
IMPL_MEM_OBJ(Number);
|
322
|
+
IMPL_MEM_OBJ(Color);
|
323
|
+
IMPL_MEM_OBJ(Boolean);
|
324
|
+
IMPL_MEM_OBJ(String_Schema);
|
325
|
+
IMPL_MEM_OBJ(String);
|
326
|
+
IMPL_MEM_OBJ(String_Constant);
|
327
|
+
IMPL_MEM_OBJ(String_Quoted);
|
328
|
+
IMPL_MEM_OBJ(Media_Query);
|
329
|
+
IMPL_MEM_OBJ(Media_Query_Expression);
|
330
|
+
IMPL_MEM_OBJ(Supports_Condition);
|
331
|
+
IMPL_MEM_OBJ(Supports_Operator);
|
332
|
+
IMPL_MEM_OBJ(Supports_Negation);
|
333
|
+
IMPL_MEM_OBJ(Supports_Declaration);
|
334
|
+
IMPL_MEM_OBJ(Supports_Interpolation);
|
335
|
+
IMPL_MEM_OBJ(At_Root_Query);
|
336
|
+
IMPL_MEM_OBJ(Null);
|
337
|
+
IMPL_MEM_OBJ(Parent_Selector);
|
338
|
+
IMPL_MEM_OBJ(Parameter);
|
339
|
+
IMPL_MEM_OBJ(Parameters);
|
340
|
+
IMPL_MEM_OBJ(Argument);
|
341
|
+
IMPL_MEM_OBJ(Arguments);
|
342
|
+
IMPL_MEM_OBJ(Selector);
|
343
|
+
IMPL_MEM_OBJ(Selector_Schema);
|
344
|
+
IMPL_MEM_OBJ(Simple_Selector);
|
345
|
+
IMPL_MEM_OBJ(Placeholder_Selector);
|
346
|
+
IMPL_MEM_OBJ(Element_Selector);
|
347
|
+
IMPL_MEM_OBJ(Class_Selector);
|
348
|
+
IMPL_MEM_OBJ(Id_Selector);
|
349
|
+
IMPL_MEM_OBJ(Attribute_Selector);
|
350
|
+
IMPL_MEM_OBJ(Pseudo_Selector);
|
351
|
+
IMPL_MEM_OBJ(Wrapped_Selector);
|
352
|
+
IMPL_MEM_OBJ(Compound_Selector);
|
353
|
+
IMPL_MEM_OBJ(Complex_Selector);
|
354
|
+
IMPL_MEM_OBJ(Selector_List);
|
355
|
+
|
356
|
+
|
357
|
+
struct HashExpression {
|
358
|
+
size_t operator() (Expression_Obj ex) const;
|
359
|
+
};
|
360
|
+
struct CompareExpression {
|
361
|
+
bool operator()(const Expression_Obj& lhs, const Expression_Obj& rhs) const;
|
362
|
+
};
|
363
|
+
|
364
|
+
struct HashSimpleSelector {
|
365
|
+
size_t operator() (Simple_Selector_Obj ex) const;
|
366
|
+
};
|
367
|
+
|
368
|
+
struct CompareSimpleSelector {
|
369
|
+
bool operator()(Simple_Selector_Obj lhs, Simple_Selector_Obj rhs) const;
|
370
|
+
};
|
371
|
+
|
372
|
+
typedef std::unordered_map<
|
373
|
+
Expression_Obj, // key
|
374
|
+
Expression_Obj, // value
|
375
|
+
HashExpression, // hasher
|
376
|
+
CompareExpression // compare
|
377
|
+
> ExpressionMap;
|
378
|
+
typedef std::unordered_set<
|
379
|
+
Expression_Obj, // value
|
380
|
+
HashExpression, // hasher
|
381
|
+
CompareExpression // compare
|
382
|
+
> ExpressionSet;
|
383
|
+
|
384
|
+
typedef std::string Subset_Map_Key;
|
385
|
+
typedef std::vector<size_t> Subset_Map_Arr;
|
386
|
+
typedef std::pair<Complex_Selector_Obj, Compound_Selector_Obj> Subset_Map_Val;
|
89
387
|
|
90
388
|
}
|
91
389
|
|
data/ext/libsass/src/bind.cpp
CHANGED
@@ -9,14 +9,14 @@
|
|
9
9
|
|
10
10
|
namespace Sass {
|
11
11
|
|
12
|
-
void bind(std::string type, std::string name,
|
12
|
+
void bind(std::string type, std::string name, Parameters_Obj ps, Arguments_Obj as, Context* ctx, Env* env, Eval* eval)
|
13
13
|
{
|
14
14
|
std::string callee(type + " " + name);
|
15
15
|
|
16
|
-
std::map<std::string,
|
16
|
+
std::map<std::string, Parameter_Obj> param_map;
|
17
17
|
|
18
18
|
for (size_t i = 0, L = as->length(); i < L; ++i) {
|
19
|
-
if (auto str =
|
19
|
+
if (auto str = SASS_MEMORY_CAST(String_Quoted, (*as)[i]->value())) {
|
20
20
|
// force optional quotes (only if needed)
|
21
21
|
if (str->quote_mark()) {
|
22
22
|
str->quote_mark('*');
|
@@ -27,7 +27,7 @@ namespace Sass {
|
|
27
27
|
// Set up a map to ensure named arguments refer to actual parameters. Also
|
28
28
|
// eval each default value left-to-right, wrt env, populating env as we go.
|
29
29
|
for (size_t i = 0, L = ps->length(); i < L; ++i) {
|
30
|
-
|
30
|
+
Parameter_Obj p = ps->at(i);
|
31
31
|
param_map[p->name()] = p;
|
32
32
|
// if (p->default_value()) {
|
33
33
|
// env->local_frame()[p->name()] = p->default_value()->perform(eval->with(env));
|
@@ -38,11 +38,11 @@ namespace Sass {
|
|
38
38
|
size_t ip = 0, LP = ps->length();
|
39
39
|
size_t ia = 0, LA = as->length();
|
40
40
|
while (ia < LA) {
|
41
|
-
|
41
|
+
Argument_Obj a = as->at(ia);
|
42
42
|
if (ip >= LP) {
|
43
43
|
// skip empty rest arguments
|
44
44
|
if (a->is_rest_argument()) {
|
45
|
-
if (
|
45
|
+
if (List_Obj l = SASS_MEMORY_CAST(List, a->value())) {
|
46
46
|
if (l->length() == 0) {
|
47
47
|
++ ia; continue;
|
48
48
|
}
|
@@ -53,7 +53,7 @@ namespace Sass {
|
|
53
53
|
msg << " for `" << name << "'";
|
54
54
|
return error(msg.str(), as->pstate());
|
55
55
|
}
|
56
|
-
|
56
|
+
Parameter_Obj p = ps->at(ip);
|
57
57
|
|
58
58
|
// If the current parameter is the rest parameter, process and break the loop
|
59
59
|
if (p->is_rest_parameter()) {
|
@@ -61,24 +61,24 @@ namespace Sass {
|
|
61
61
|
if (a->is_rest_argument()) {
|
62
62
|
|
63
63
|
// We should always get a list for rest arguments
|
64
|
-
if (
|
64
|
+
if (List_Obj rest = SASS_MEMORY_CAST(List, a->value())) {
|
65
65
|
// create a new list object for wrapped items
|
66
|
-
|
66
|
+
List_Ptr arglist = SASS_MEMORY_NEW(List,
|
67
67
|
p->pstate(),
|
68
68
|
0,
|
69
69
|
rest->separator(),
|
70
70
|
true);
|
71
71
|
// wrap each item from list as an argument
|
72
|
-
for (
|
73
|
-
if (
|
74
|
-
|
72
|
+
for (Expression_Obj item : rest->elements()) {
|
73
|
+
if (Argument_Obj arg = SASS_MEMORY_CAST(Argument, item)) {
|
74
|
+
arglist->append(SASS_MEMORY_COPY(arg)); // copy
|
75
75
|
} else {
|
76
|
-
(
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
76
|
+
arglist->append(SASS_MEMORY_NEW(Argument,
|
77
|
+
item->pstate(),
|
78
|
+
&item,
|
79
|
+
"",
|
80
|
+
false,
|
81
|
+
false));
|
82
82
|
}
|
83
83
|
}
|
84
84
|
// assign new arglist to environment
|
@@ -91,23 +91,23 @@ namespace Sass {
|
|
91
91
|
} else if (a->is_keyword_argument()) {
|
92
92
|
|
93
93
|
// expand keyword arguments into their parameters
|
94
|
-
|
94
|
+
List_Ptr arglist = SASS_MEMORY_NEW(List, p->pstate(), 0, SASS_COMMA, true);
|
95
95
|
env->local_frame()[p->name()] = arglist;
|
96
|
-
|
96
|
+
Map_Obj argmap = SASS_MEMORY_CAST(Map, a->value());
|
97
97
|
for (auto key : argmap->keys()) {
|
98
|
-
std::string name = unquote(
|
99
|
-
(
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
98
|
+
std::string name = unquote(SASS_MEMORY_CAST(String_Constant, key)->value());
|
99
|
+
arglist->append(SASS_MEMORY_NEW(Argument,
|
100
|
+
key->pstate(),
|
101
|
+
argmap->at(key),
|
102
|
+
"$" + name,
|
103
|
+
false,
|
104
|
+
false));
|
105
105
|
}
|
106
106
|
|
107
107
|
} else {
|
108
108
|
|
109
109
|
// create a new list object for wrapped items
|
110
|
-
|
110
|
+
List_Obj arglist = SASS_MEMORY_NEW(List,
|
111
111
|
p->pstate(),
|
112
112
|
0,
|
113
113
|
SASS_COMMA,
|
@@ -117,26 +117,28 @@ namespace Sass {
|
|
117
117
|
// get and post inc
|
118
118
|
a = (*as)[ia++];
|
119
119
|
// maybe we have another list as argument
|
120
|
-
|
120
|
+
List_Obj ls = SASS_MEMORY_CAST(List, a->value());
|
121
121
|
// skip any list completely if empty
|
122
122
|
if (ls && ls->empty() && a->is_rest_argument()) continue;
|
123
123
|
|
124
|
-
|
125
|
-
|
124
|
+
Expression_Obj value = a->value();
|
125
|
+
if (Argument_Obj arg = SASS_MEMORY_CAST(Argument, value)) {
|
126
|
+
arglist->append(&arg);
|
126
127
|
}
|
127
128
|
// check if we have rest argument
|
128
129
|
else if (a->is_rest_argument()) {
|
129
130
|
// preserve the list separator from rest args
|
130
|
-
if (
|
131
|
+
if (List_Obj rest = SASS_MEMORY_CAST(List, a->value())) {
|
131
132
|
arglist->separator(rest->separator());
|
132
133
|
|
133
134
|
for (size_t i = 0, L = rest->size(); i < L; ++i) {
|
134
|
-
|
135
|
-
|
136
|
-
(
|
135
|
+
Expression_Obj obj = rest->at(i);
|
136
|
+
arglist->append(SASS_MEMORY_NEW(Argument,
|
137
|
+
obj->pstate(),
|
138
|
+
&obj,
|
137
139
|
"",
|
138
140
|
false,
|
139
|
-
false);
|
141
|
+
false));
|
140
142
|
}
|
141
143
|
}
|
142
144
|
// no more arguments
|
@@ -144,16 +146,16 @@ namespace Sass {
|
|
144
146
|
}
|
145
147
|
// wrap all other value types into Argument
|
146
148
|
else {
|
147
|
-
(
|
149
|
+
arglist->append(SASS_MEMORY_NEW(Argument,
|
148
150
|
a->pstate(),
|
149
151
|
a->value(),
|
150
152
|
a->name(),
|
151
153
|
false,
|
152
|
-
false);
|
154
|
+
false));
|
153
155
|
}
|
154
156
|
}
|
155
157
|
// assign new arglist to environment
|
156
|
-
env->local_frame()[p->name()] = arglist;
|
158
|
+
env->local_frame()[p->name()] = &arglist;
|
157
159
|
}
|
158
160
|
// consumed parameter
|
159
161
|
++ip;
|
@@ -164,7 +166,7 @@ namespace Sass {
|
|
164
166
|
// If the current argument is the rest argument, extract a value for processing
|
165
167
|
else if (a->is_rest_argument()) {
|
166
168
|
// normal param and rest arg
|
167
|
-
|
169
|
+
List_Obj arglist = SASS_MEMORY_CAST(List, a->value());
|
168
170
|
// empty rest arg - treat all args as default values
|
169
171
|
if (!arglist->length()) {
|
170
172
|
break;
|
@@ -184,9 +186,10 @@ namespace Sass {
|
|
184
186
|
}
|
185
187
|
}
|
186
188
|
// otherwise move one of the rest args into the param, converting to argument if necessary
|
187
|
-
|
188
|
-
|
189
|
-
|
189
|
+
Expression_Obj obj = arglist->at(0);
|
190
|
+
if (!(a = SASS_MEMORY_CAST(Argument, obj))) {
|
191
|
+
Expression_Ptr a_to_convert = &obj;
|
192
|
+
a = SASS_MEMORY_NEW(Argument,
|
190
193
|
a_to_convert->pstate(),
|
191
194
|
a_to_convert,
|
192
195
|
"",
|
@@ -199,17 +202,17 @@ namespace Sass {
|
|
199
202
|
}
|
200
203
|
|
201
204
|
} else if (a->is_keyword_argument()) {
|
202
|
-
|
205
|
+
Map_Obj argmap = SASS_MEMORY_CAST(Map, a->value());
|
203
206
|
|
204
207
|
for (auto key : argmap->keys()) {
|
205
|
-
std::string name = "$" + unquote(
|
208
|
+
std::string name = "$" + unquote(SASS_MEMORY_CAST(String_Constant, key)->value());
|
206
209
|
|
207
210
|
if (!param_map.count(name)) {
|
208
211
|
std::stringstream msg;
|
209
212
|
msg << callee << " has no parameter named " << name;
|
210
213
|
error(msg.str(), a->pstate());
|
211
214
|
}
|
212
|
-
env->local_frame()[name] = argmap->at(key);
|
215
|
+
env->local_frame()[name] = &argmap->at(&key);
|
213
216
|
}
|
214
217
|
++ia;
|
215
218
|
continue;
|
@@ -225,7 +228,7 @@ namespace Sass {
|
|
225
228
|
error(msg.str(), a->pstate());
|
226
229
|
}
|
227
230
|
// ordinal arg -- bind it to the next param
|
228
|
-
env->local_frame()[p->name()] = a->value();
|
231
|
+
env->local_frame()[p->name()] = &a->value();
|
229
232
|
++ip;
|
230
233
|
}
|
231
234
|
else {
|
@@ -247,7 +250,7 @@ namespace Sass {
|
|
247
250
|
<< "provided more than once in call to " << callee;
|
248
251
|
error(msg.str(), a->pstate());
|
249
252
|
}
|
250
|
-
env->local_frame()[a->name()] = a->value();
|
253
|
+
env->local_frame()[a->name()] = &a->value();
|
251
254
|
}
|
252
255
|
}
|
253
256
|
// EO while ia
|
@@ -256,20 +259,20 @@ namespace Sass {
|
|
256
259
|
// That's only okay if they have default values, or were already bound by
|
257
260
|
// named arguments, or if it's a single rest-param.
|
258
261
|
for (size_t i = ip; i < LP; ++i) {
|
259
|
-
|
262
|
+
Parameter_Obj leftover = ps->at(i);
|
260
263
|
// cerr << "env for default params:" << endl;
|
261
264
|
// env->print();
|
262
265
|
// cerr << "********" << endl;
|
263
266
|
if (!env->has_local(leftover->name())) {
|
264
267
|
if (leftover->is_rest_parameter()) {
|
265
|
-
env->local_frame()[leftover->name()] = SASS_MEMORY_NEW(
|
268
|
+
env->local_frame()[leftover->name()] = SASS_MEMORY_NEW(List,
|
266
269
|
leftover->pstate(),
|
267
270
|
0,
|
268
271
|
SASS_COMMA,
|
269
272
|
true);
|
270
273
|
}
|
271
274
|
else if (leftover->default_value()) {
|
272
|
-
|
275
|
+
Expression_Ptr dv = leftover->default_value()->perform(eval);
|
273
276
|
env->local_frame()[leftover->name()] = dv;
|
274
277
|
}
|
275
278
|
else {
|