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