sassc 1.11.1 → 1.11.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -2
  3. data/README.md +3 -2
  4. data/ext/libsass/Makefile.conf +2 -1
  5. data/ext/libsass/appveyor.yml +10 -5
  6. data/ext/libsass/docs/dev-ast-memory.md +223 -0
  7. data/ext/libsass/include/sass/base.h +2 -0
  8. data/ext/libsass/script/bootstrap +7 -4
  9. data/ext/libsass/script/ci-build-libsass +3 -3
  10. data/ext/libsass/script/ci-install-compiler +2 -0
  11. data/ext/libsass/script/ci-report-coverage +2 -1
  12. data/ext/libsass/script/test-leaks.pl +103 -0
  13. data/ext/libsass/src/ast.cpp +621 -495
  14. data/ext/libsass/src/ast.hpp +801 -367
  15. data/ext/libsass/src/ast_def_macros.hpp +5 -5
  16. data/ext/libsass/src/ast_fwd_decl.hpp +312 -14
  17. data/ext/libsass/src/bind.cpp +54 -51
  18. data/ext/libsass/src/bind.hpp +3 -7
  19. data/ext/libsass/src/check_nesting.cpp +117 -120
  20. data/ext/libsass/src/check_nesting.hpp +38 -34
  21. data/ext/libsass/src/color_maps.cpp +3 -3
  22. data/ext/libsass/src/color_maps.hpp +3 -3
  23. data/ext/libsass/src/context.cpp +33 -34
  24. data/ext/libsass/src/context.hpp +12 -14
  25. data/ext/libsass/src/cssize.cpp +200 -228
  26. data/ext/libsass/src/cssize.hpp +49 -49
  27. data/ext/libsass/src/debugger.hpp +260 -241
  28. data/ext/libsass/src/emitter.cpp +6 -6
  29. data/ext/libsass/src/emitter.hpp +7 -7
  30. data/ext/libsass/src/environment.cpp +2 -2
  31. data/ext/libsass/src/environment.hpp +0 -2
  32. data/ext/libsass/src/error_handling.cpp +5 -5
  33. data/ext/libsass/src/error_handling.hpp +12 -12
  34. data/ext/libsass/src/eval.cpp +412 -401
  35. data/ext/libsass/src/eval.hpp +61 -62
  36. data/ext/libsass/src/expand.cpp +223 -204
  37. data/ext/libsass/src/expand.hpp +42 -42
  38. data/ext/libsass/src/extend.cpp +198 -201
  39. data/ext/libsass/src/extend.hpp +12 -14
  40. data/ext/libsass/src/file.hpp +4 -5
  41. data/ext/libsass/src/functions.cpp +413 -418
  42. data/ext/libsass/src/functions.hpp +7 -10
  43. data/ext/libsass/src/inspect.cpp +115 -109
  44. data/ext/libsass/src/inspect.hpp +69 -69
  45. data/ext/libsass/src/listize.cpp +31 -33
  46. data/ext/libsass/src/listize.hpp +8 -10
  47. data/ext/libsass/src/memory/SharedPtr.cpp +116 -0
  48. data/ext/libsass/src/memory/SharedPtr.hpp +202 -0
  49. data/ext/libsass/src/node.cpp +45 -43
  50. data/ext/libsass/src/node.hpp +15 -15
  51. data/ext/libsass/src/operation.hpp +136 -136
  52. data/ext/libsass/src/output.cpp +48 -49
  53. data/ext/libsass/src/output.hpp +14 -14
  54. data/ext/libsass/src/parser.cpp +530 -554
  55. data/ext/libsass/src/parser.hpp +91 -96
  56. data/ext/libsass/src/prelexer.cpp +13 -10
  57. data/ext/libsass/src/remove_placeholders.cpp +25 -21
  58. data/ext/libsass/src/remove_placeholders.hpp +7 -7
  59. data/ext/libsass/src/sass2scss.cpp +2 -1
  60. data/ext/libsass/src/sass_context.cpp +125 -107
  61. data/ext/libsass/src/sass_context.hpp +1 -1
  62. data/ext/libsass/src/sass_util.hpp +5 -5
  63. data/ext/libsass/src/sass_values.cpp +27 -27
  64. data/ext/libsass/src/source_map.cpp +2 -2
  65. data/ext/libsass/src/source_map.hpp +2 -2
  66. data/ext/libsass/src/subset_map.cpp +57 -0
  67. data/ext/libsass/src/subset_map.hpp +8 -76
  68. data/ext/libsass/src/to_c.cpp +13 -13
  69. data/ext/libsass/src/to_c.hpp +14 -14
  70. data/ext/libsass/src/to_value.cpp +20 -20
  71. data/ext/libsass/src/to_value.hpp +20 -21
  72. data/ext/libsass/src/util.cpp +55 -88
  73. data/ext/libsass/src/util.hpp +9 -13
  74. data/ext/libsass/src/values.cpp +27 -26
  75. data/ext/libsass/src/values.hpp +2 -2
  76. data/ext/libsass/test/test_subset_map.cpp +69 -69
  77. data/ext/libsass/win/libsass.targets +3 -2
  78. data/ext/libsass/win/libsass.vcxproj.filters +9 -6
  79. data/lib/sassc/version.rb +1 -1
  80. data/sassc.gemspec +0 -1
  81. data/test/native_test.rb +1 -1
  82. metadata +7 -5
  83. data/ext/libsass/src/ast_factory.hpp +0 -92
  84. data/ext/libsass/src/memory_manager.cpp +0 -77
  85. 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 AST_Node* perform(Operation<AST_Node*>* op) { return (*op)(this); }\
32
- virtual Statement* perform(Operation<Statement*>* op) { return (*op)(this); }\
33
- virtual Expression* perform(Operation<Expression*>* op) { return (*op)(this); }\
34
- virtual Selector* perform(Operation<Selector*>* op) { return (*op)(this); }\
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 Value* perform(Operation<Value*>* op) { return (*op)(this); }
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
- // statements
11
- class Statement;
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
- class Declaration;
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
- class Mixin_Call;
38
- // expressions
39
- class Value;
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
- class String_Schema;
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
- class At_Root_Query;
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
- // parameters and arguments
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
- // selectors
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
- class SimpleSequence_Selector;
84
- class Sequence_Selector;
85
- class CommaSequence_Selector;
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
 
@@ -9,14 +9,14 @@
9
9
 
10
10
  namespace Sass {
11
11
 
12
- void bind(std::string type, std::string name, Parameters* ps, Arguments* as, Context* ctx, Env* env, Eval* eval)
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, Parameter*> param_map;
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 = dynamic_cast<String_Quoted*>((*as)[i]->value())) {
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
- Parameter* p = (*ps)[i];
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
- Argument* a = (*as)[ia];
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 (List* l = dynamic_cast<List*>(a->value())) {
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
- Parameter* p = (*ps)[ip];
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 (List* rest = dynamic_cast<List*>(a->value())) {
64
+ if (List_Obj rest = SASS_MEMORY_CAST(List, a->value())) {
65
65
  // create a new list object for wrapped items
66
- List* arglist = SASS_MEMORY_NEW(ctx->mem, List,
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 (Expression* item : rest->elements()) {
73
- if (Argument* arg = dynamic_cast<Argument*>(item)) {
74
- (*arglist) << SASS_MEMORY_NEW(ctx->mem, Argument, *arg);
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
- (*arglist) << SASS_MEMORY_NEW(ctx->mem, Argument,
77
- item->pstate(),
78
- item,
79
- "",
80
- false,
81
- false);
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
- List* arglist = SASS_MEMORY_NEW(ctx->mem, List, p->pstate(), 0, SASS_COMMA, true);
94
+ List_Ptr arglist = SASS_MEMORY_NEW(List, p->pstate(), 0, SASS_COMMA, true);
95
95
  env->local_frame()[p->name()] = arglist;
96
- Map* argmap = static_cast<Map*>(a->value());
96
+ Map_Obj argmap = SASS_MEMORY_CAST(Map, a->value());
97
97
  for (auto key : argmap->keys()) {
98
- std::string name = unquote(static_cast<String_Constant*>(key)->value());
99
- (*arglist) << SASS_MEMORY_NEW(ctx->mem, Argument,
100
- key->pstate(),
101
- argmap->at(key),
102
- "$" + name,
103
- false,
104
- false);
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
- List* arglist = SASS_MEMORY_NEW(ctx->mem, List,
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
- List* ls = dynamic_cast<List*>(a->value());
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
- if (Argument* arg = dynamic_cast<Argument*>(a->value())) {
125
- (*arglist) << SASS_MEMORY_NEW(ctx->mem, Argument, *arg);
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 (List* rest = dynamic_cast<List*>(a->value())) {
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
- (*arglist) << SASS_MEMORY_NEW(ctx->mem, Argument,
135
- (*rest)[i]->pstate(),
136
- (*rest)[i],
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
- (*arglist) << SASS_MEMORY_NEW(ctx->mem, Argument,
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
- List* arglist = static_cast<List*>(a->value());
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
- if (!(a = dynamic_cast<Argument*>((*arglist)[0]))) {
188
- Expression* a_to_convert = (*arglist)[0];
189
- a = SASS_MEMORY_NEW(ctx->mem, Argument,
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
- Map* argmap = static_cast<Map*>(a->value());
205
+ Map_Obj argmap = SASS_MEMORY_CAST(Map, a->value());
203
206
 
204
207
  for (auto key : argmap->keys()) {
205
- std::string name = "$" + unquote(static_cast<String_Constant*>(key)->value());
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
- Parameter* leftover = (*ps)[i];
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(ctx->mem, List,
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
- Expression* dv = leftover->default_value()->perform(eval);
275
+ Expression_Ptr dv = leftover->default_value()->perform(eval);
273
276
  env->local_frame()[leftover->name()] = dv;
274
277
  }
275
278
  else {