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.
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 {