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
@@ -3,16 +3,12 @@
3
3
 
4
4
  #include <string>
5
5
  #include "environment.hpp"
6
+ #include "ast_fwd_decl.hpp"
6
7
 
7
8
  namespace Sass {
8
- class AST_Node;
9
- class Parameters;
10
- class Arguments;
11
- class Context;
12
- class Eval;
13
- typedef Environment<AST_Node*> Env;
9
+ typedef Environment<AST_Node_Obj> Env;
14
10
 
15
- void bind(std::string type, std::string name, Parameters*, Arguments*, Context*, Env*, Eval*);
11
+ void bind(std::string type, std::string name, Parameters_Obj, Arguments_Obj, Context*, Env*, Eval*);
16
12
  }
17
13
 
18
14
  #endif
@@ -6,35 +6,30 @@
6
6
  namespace Sass {
7
7
 
8
8
  CheckNesting::CheckNesting()
9
- : parents(std::vector<Statement*>()),
9
+ : parents(std::vector<Statement_Ptr>()),
10
10
  parent(0),
11
11
  current_mixin_definition(0)
12
12
  { }
13
13
 
14
- Statement* CheckNesting::before(Statement* s) {
15
- if (this->should_visit(s)) return s;
16
- return 0;
17
- }
18
-
19
- Statement* CheckNesting::visit_children(Statement* parent) {
20
-
21
- Statement* old_parent = this->parent;
14
+ Statement_Ptr CheckNesting::visit_children(Statement_Ptr parent)
15
+ {
16
+ Statement_Ptr old_parent = this->parent;
22
17
 
23
- if (dynamic_cast<At_Root_Block*>(parent)) {
24
- std::vector<Statement*> old_parents = this->parents;
25
- std::vector<Statement*> new_parents;
18
+ if (At_Root_Block_Ptr root = SASS_MEMORY_CAST_PTR(At_Root_Block, parent)) {
19
+ std::vector<Statement_Ptr> old_parents = this->parents;
20
+ std::vector<Statement_Ptr> new_parents;
26
21
 
27
22
  for (size_t i = 0, L = this->parents.size(); i < L; i++) {
28
- Statement* p = this->parents.at(i);
29
- if (!dynamic_cast<At_Root_Block*>(parent)->exclude_node(p)) {
23
+ Statement_Ptr p = this->parents.at(i);
24
+ if (!root->exclude_node(p)) {
30
25
  new_parents.push_back(p);
31
26
  }
32
27
  }
33
28
  this->parents = new_parents;
34
29
 
35
30
  for (size_t i = this->parents.size(); i > 0; i--) {
36
- Statement* p = 0;
37
- Statement* gp = 0;
31
+ Statement_Ptr p = 0;
32
+ Statement_Ptr gp = 0;
38
33
  if (i > 0) p = this->parents.at(i - 1);
39
34
  if (i > 1) gp = this->parents.at(i - 2);
40
35
 
@@ -44,8 +39,8 @@ namespace Sass {
44
39
  }
45
40
  }
46
41
 
47
- At_Root_Block* ar = dynamic_cast<At_Root_Block*>(parent);
48
- Statement* ret = this->visit_children(ar->block());
42
+ At_Root_Block_Ptr ar = SASS_MEMORY_CAST_PTR(At_Root_Block, parent);
43
+ Statement_Ptr ret = this->visit_children(&ar->block());
49
44
 
50
45
  this->parent = old_parent;
51
46
  this->parents = old_parents;
@@ -53,27 +48,25 @@ namespace Sass {
53
48
  return ret;
54
49
  }
55
50
 
56
-
57
51
  if (!this->is_transparent_parent(parent, old_parent)) {
58
52
  this->parent = parent;
59
53
  }
60
54
 
61
55
  this->parents.push_back(parent);
62
56
 
63
- Block* b = dynamic_cast<Block*>(parent);
57
+ Block_Ptr b = SASS_MEMORY_CAST_PTR(Block, parent);
64
58
 
65
59
  if (!b) {
66
- if (Has_Block* bb = dynamic_cast<Has_Block*>(parent)) {
67
- b = bb->block();
60
+ if (Has_Block_Ptr bb = SASS_MEMORY_CAST(Has_Block, *parent)) {
61
+ b = &bb->block();
68
62
  }
69
63
  }
70
64
 
71
65
  if (b) {
72
- for (auto n : *b) {
66
+ for (auto n : b->elements()) {
73
67
  n->perform(this);
74
68
  }
75
69
  }
76
-
77
70
  this->parent = old_parent;
78
71
  this->parents.pop_back();
79
72
 
@@ -81,16 +74,20 @@ namespace Sass {
81
74
  }
82
75
 
83
76
 
84
- Statement* CheckNesting::operator()(Block* b)
77
+ Statement_Ptr CheckNesting::operator()(Block_Ptr b)
85
78
  {
86
79
  return this->visit_children(b);
87
80
  }
88
81
 
89
- Statement* CheckNesting::operator()(Definition* n)
82
+ Statement_Ptr CheckNesting::operator()(Definition_Ptr n)
90
83
  {
91
- if (!is_mixin(n)) return n;
84
+ if (!this->should_visit(n)) return NULL;
85
+ if (!is_mixin(n)) {
86
+ visit_children(n);
87
+ return n;
88
+ }
92
89
 
93
- Definition* old_mixin_definition = this->current_mixin_definition;
90
+ Definition_Ptr old_mixin_definition = this->current_mixin_definition;
94
91
  this->current_mixin_definition = n;
95
92
 
96
93
  visit_children(n);
@@ -100,28 +97,27 @@ namespace Sass {
100
97
  return n;
101
98
  }
102
99
 
103
- Statement* CheckNesting::fallback_impl(Statement* s)
100
+ Statement_Ptr CheckNesting::fallback_impl(Statement_Ptr s)
104
101
  {
105
- if (dynamic_cast<Block*>(s) || dynamic_cast<Has_Block*>(s)) {
106
- return visit_children(s);
107
- }
108
- return s;
102
+ Block_Ptr b1 = SASS_MEMORY_CAST_PTR(Block, s);
103
+ Has_Block_Ptr b2 = SASS_MEMORY_CAST_PTR(Has_Block, s);
104
+ return b1 || b2 ? visit_children(s) : s;
109
105
  }
110
106
 
111
- bool CheckNesting::should_visit(Statement* node)
107
+ bool CheckNesting::should_visit(Statement_Ptr node)
112
108
  {
113
109
  if (!this->parent) return true;
114
110
 
115
- if (dynamic_cast<Content*>(node))
111
+ if (SASS_MEMORY_CAST_PTR(Content, node))
116
112
  { this->invalid_content_parent(this->parent); }
117
113
 
118
114
  if (is_charset(node))
119
115
  { this->invalid_charset_parent(this->parent); }
120
116
 
121
- if (dynamic_cast<Extension*>(node))
117
+ if (SASS_MEMORY_CAST_PTR(Extension, node))
122
118
  { this->invalid_extend_parent(this->parent); }
123
119
 
124
- // if (dynamic_cast<Import*>(node))
120
+ // if (SASS_MEMORY_CAST(Import, node))
125
121
  // { this->invalid_import_parent(this->parent); }
126
122
 
127
123
  if (this->is_mixin(node))
@@ -133,20 +129,19 @@ namespace Sass {
133
129
  if (this->is_function(this->parent))
134
130
  { this->invalid_function_child(node); }
135
131
 
136
- if (dynamic_cast<Declaration*>(node))
132
+ if (SASS_MEMORY_CAST_PTR(Declaration, node))
137
133
  { this->invalid_prop_parent(this->parent); }
138
134
 
139
- if (
140
- dynamic_cast<Declaration*>(this->parent)
141
- ) { this->invalid_prop_child(node); }
135
+ if (SASS_MEMORY_CAST_PTR(Declaration, this->parent))
136
+ { this->invalid_prop_child(node); }
142
137
 
143
- if (dynamic_cast<Return*>(node))
138
+ if (SASS_MEMORY_CAST_PTR(Return, node))
144
139
  { this->invalid_return_parent(this->parent); }
145
140
 
146
141
  return true;
147
142
  }
148
143
 
149
- void CheckNesting::invalid_content_parent(Statement* parent)
144
+ void CheckNesting::invalid_content_parent(Statement_Ptr parent)
150
145
  {
151
146
  if (!this->current_mixin_definition) {
152
147
  throw Exception::InvalidSass(
@@ -156,7 +151,7 @@ namespace Sass {
156
151
  }
157
152
  }
158
153
 
159
- void CheckNesting::invalid_charset_parent(Statement* parent)
154
+ void CheckNesting::invalid_charset_parent(Statement_Ptr parent)
160
155
  {
161
156
  if (!(
162
157
  is_root_node(parent)
@@ -168,11 +163,11 @@ namespace Sass {
168
163
  }
169
164
  }
170
165
 
171
- void CheckNesting::invalid_extend_parent(Statement* parent)
166
+ void CheckNesting::invalid_extend_parent(Statement_Ptr parent)
172
167
  {
173
168
  if (!(
174
- dynamic_cast<Ruleset*>(parent) ||
175
- dynamic_cast<Mixin_Call*>(parent) ||
169
+ SASS_MEMORY_CAST_PTR(Ruleset, parent) ||
170
+ SASS_MEMORY_CAST_PTR(Mixin_Call, parent) ||
176
171
  is_mixin(parent)
177
172
  )) {
178
173
  throw Exception::InvalidSass(
@@ -182,16 +177,16 @@ namespace Sass {
182
177
  }
183
178
  }
184
179
 
185
- // void CheckNesting::invalid_import_parent(Statement* parent)
180
+ // void CheckNesting::invalid_import_parent(Statement_Ptr parent)
186
181
  // {
187
182
  // for (auto pp : this->parents) {
188
183
  // if (
189
- // dynamic_cast<Each*>(pp) ||
190
- // dynamic_cast<For*>(pp) ||
191
- // dynamic_cast<If*>(pp) ||
192
- // dynamic_cast<While*>(pp) ||
193
- // dynamic_cast<Trace*>(pp) ||
194
- // dynamic_cast<Mixin_Call*>(pp) ||
184
+ // SASS_MEMORY_CAST(Each, pp) ||
185
+ // SASS_MEMORY_CAST(For, pp) ||
186
+ // SASS_MEMORY_CAST(If, pp) ||
187
+ // SASS_MEMORY_CAST(While, pp) ||
188
+ // SASS_MEMORY_CAST(Trace, pp) ||
189
+ // SASS_MEMORY_CAST(Mixin_Call, pp) ||
195
190
  // is_mixin(pp)
196
191
  // ) {
197
192
  // throw Exception::InvalidSass(
@@ -213,16 +208,16 @@ namespace Sass {
213
208
  // }
214
209
  // }
215
210
 
216
- void CheckNesting::invalid_mixin_definition_parent(Statement* parent)
211
+ void CheckNesting::invalid_mixin_definition_parent(Statement_Ptr parent)
217
212
  {
218
- for (auto pp : this->parents) {
213
+ for (Statement_Ptr pp : this->parents) {
219
214
  if (
220
- dynamic_cast<Each*>(pp) ||
221
- dynamic_cast<For*>(pp) ||
222
- dynamic_cast<If*>(pp) ||
223
- dynamic_cast<While*>(pp) ||
224
- dynamic_cast<Trace*>(pp) ||
225
- dynamic_cast<Mixin_Call*>(pp) ||
215
+ SASS_MEMORY_CAST_PTR(Each, pp) ||
216
+ SASS_MEMORY_CAST_PTR(For, pp) ||
217
+ SASS_MEMORY_CAST_PTR(If, pp) ||
218
+ SASS_MEMORY_CAST_PTR(While, pp) ||
219
+ SASS_MEMORY_CAST_PTR(Trace, pp) ||
220
+ SASS_MEMORY_CAST_PTR(Mixin_Call, pp) ||
226
221
  is_mixin(pp)
227
222
  ) {
228
223
  throw Exception::InvalidSass(
@@ -233,16 +228,16 @@ namespace Sass {
233
228
  }
234
229
  }
235
230
 
236
- void CheckNesting::invalid_function_parent(Statement* parent)
231
+ void CheckNesting::invalid_function_parent(Statement_Ptr parent)
237
232
  {
238
- for (auto pp : this->parents) {
233
+ for (Statement_Ptr pp : this->parents) {
239
234
  if (
240
- dynamic_cast<Each*>(pp) ||
241
- dynamic_cast<For*>(pp) ||
242
- dynamic_cast<If*>(pp) ||
243
- dynamic_cast<While*>(pp) ||
244
- dynamic_cast<Trace*>(pp) ||
245
- dynamic_cast<Mixin_Call*>(pp) ||
235
+ SASS_MEMORY_CAST_PTR(Each, pp) ||
236
+ SASS_MEMORY_CAST_PTR(For, pp) ||
237
+ SASS_MEMORY_CAST_PTR(If, pp) ||
238
+ SASS_MEMORY_CAST_PTR(While, pp) ||
239
+ SASS_MEMORY_CAST_PTR(Trace, pp) ||
240
+ SASS_MEMORY_CAST_PTR(Mixin_Call, pp) ||
246
241
  is_mixin(pp)
247
242
  ) {
248
243
  throw Exception::InvalidSass(
@@ -253,20 +248,22 @@ namespace Sass {
253
248
  }
254
249
  }
255
250
 
256
- void CheckNesting::invalid_function_child(Statement* child)
251
+ void CheckNesting::invalid_function_child(Statement_Ptr child)
257
252
  {
258
253
  if (!(
259
- dynamic_cast<Each*>(child) ||
260
- dynamic_cast<For*>(child) ||
261
- dynamic_cast<If*>(child) ||
262
- dynamic_cast<While*>(child) ||
263
- dynamic_cast<Trace*>(child) ||
264
- dynamic_cast<Comment*>(child) ||
265
- dynamic_cast<Debug*>(child) ||
266
- dynamic_cast<Return*>(child) ||
267
- dynamic_cast<Variable*>(child) ||
268
- dynamic_cast<Warning*>(child) ||
269
- dynamic_cast<Error*>(child)
254
+ SASS_MEMORY_CAST_PTR(Each, child) ||
255
+ SASS_MEMORY_CAST_PTR(For, child) ||
256
+ SASS_MEMORY_CAST_PTR(If, child) ||
257
+ SASS_MEMORY_CAST_PTR(While, child) ||
258
+ SASS_MEMORY_CAST_PTR(Trace, child) ||
259
+ SASS_MEMORY_CAST_PTR(Comment, child) ||
260
+ SASS_MEMORY_CAST_PTR(Debug, child) ||
261
+ SASS_MEMORY_CAST_PTR(Return, child) ||
262
+ SASS_MEMORY_CAST_PTR(Variable, child) ||
263
+ // Ruby Sass doesn't distinguish variables and assignments
264
+ SASS_MEMORY_CAST_PTR(Assignment, child) ||
265
+ SASS_MEMORY_CAST_PTR(Warning, child) ||
266
+ SASS_MEMORY_CAST_PTR(Error, child)
270
267
  )) {
271
268
  throw Exception::InvalidSass(
272
269
  child->pstate(),
@@ -275,17 +272,17 @@ namespace Sass {
275
272
  }
276
273
  }
277
274
 
278
- void CheckNesting::invalid_prop_child(Statement* child)
275
+ void CheckNesting::invalid_prop_child(Statement_Ptr child)
279
276
  {
280
277
  if (!(
281
- dynamic_cast<Each*>(child) ||
282
- dynamic_cast<For*>(child) ||
283
- dynamic_cast<If*>(child) ||
284
- dynamic_cast<While*>(child) ||
285
- dynamic_cast<Trace*>(child) ||
286
- dynamic_cast<Comment*>(child) ||
287
- dynamic_cast<Declaration*>(child) ||
288
- dynamic_cast<Mixin_Call*>(child)
278
+ SASS_MEMORY_CAST_PTR(Each, child) ||
279
+ SASS_MEMORY_CAST_PTR(For, child) ||
280
+ SASS_MEMORY_CAST_PTR(If, child) ||
281
+ SASS_MEMORY_CAST_PTR(While, child) ||
282
+ SASS_MEMORY_CAST_PTR(Trace, child) ||
283
+ SASS_MEMORY_CAST_PTR(Comment, child) ||
284
+ SASS_MEMORY_CAST_PTR(Declaration, child) ||
285
+ SASS_MEMORY_CAST_PTR(Mixin_Call, child)
289
286
  )) {
290
287
  throw Exception::InvalidSass(
291
288
  child->pstate(),
@@ -294,15 +291,15 @@ namespace Sass {
294
291
  }
295
292
  }
296
293
 
297
- void CheckNesting::invalid_prop_parent(Statement* parent)
294
+ void CheckNesting::invalid_prop_parent(Statement_Ptr parent)
298
295
  {
299
296
  if (!(
300
297
  is_mixin(parent) ||
301
298
  is_directive_node(parent) ||
302
- dynamic_cast<Ruleset*>(parent) ||
303
- dynamic_cast<Keyframe_Rule*>(parent) ||
304
- dynamic_cast<Declaration*>(parent) ||
305
- dynamic_cast<Mixin_Call*>(parent)
299
+ SASS_MEMORY_CAST_PTR(Ruleset, parent) ||
300
+ SASS_MEMORY_CAST_PTR(Keyframe_Rule, parent) ||
301
+ SASS_MEMORY_CAST_PTR(Declaration, parent) ||
302
+ SASS_MEMORY_CAST_PTR(Mixin_Call, parent)
306
303
  )) {
307
304
  throw Exception::InvalidSass(
308
305
  parent->pstate(),
@@ -311,7 +308,7 @@ namespace Sass {
311
308
  }
312
309
  }
313
310
 
314
- void CheckNesting::invalid_return_parent(Statement* parent)
311
+ void CheckNesting::invalid_return_parent(Statement_Ptr parent)
315
312
  {
316
313
  if (!this->is_function(parent)) {
317
314
  throw Exception::InvalidSass(
@@ -321,7 +318,7 @@ namespace Sass {
321
318
  }
322
319
  }
323
320
 
324
- bool CheckNesting::is_transparent_parent(Statement* parent, Statement* grandparent)
321
+ bool CheckNesting::is_transparent_parent(Statement_Ptr parent, Statement_Ptr grandparent)
325
322
  {
326
323
  bool parent_bubbles = parent && parent->bubbles();
327
324
 
@@ -329,51 +326,51 @@ namespace Sass {
329
326
  !is_root_node(grandparent) &&
330
327
  !is_at_root_node(grandparent);
331
328
 
332
- return dynamic_cast<Import*>(parent) ||
333
- dynamic_cast<Each*>(parent) ||
334
- dynamic_cast<For*>(parent) ||
335
- dynamic_cast<If*>(parent) ||
336
- dynamic_cast<While*>(parent) ||
337
- dynamic_cast<Trace*>(parent) ||
329
+ return SASS_MEMORY_CAST_PTR(Import, parent) ||
330
+ SASS_MEMORY_CAST_PTR(Each, parent) ||
331
+ SASS_MEMORY_CAST_PTR(For, parent) ||
332
+ SASS_MEMORY_CAST_PTR(If, parent) ||
333
+ SASS_MEMORY_CAST_PTR(While, parent) ||
334
+ SASS_MEMORY_CAST_PTR(Trace, parent) ||
338
335
  valid_bubble_node;
339
336
  }
340
337
 
341
- bool CheckNesting::is_charset(Statement* n)
338
+ bool CheckNesting::is_charset(Statement_Ptr n)
342
339
  {
343
- Directive* d = dynamic_cast<Directive*>(n);
340
+ Directive_Ptr d = SASS_MEMORY_CAST_PTR(Directive, n);
344
341
  return d && d->keyword() == "charset";
345
342
  }
346
343
 
347
- bool CheckNesting::is_mixin(Statement* n)
344
+ bool CheckNesting::is_mixin(Statement_Ptr n)
348
345
  {
349
- Definition* def = dynamic_cast<Definition*>(n);
346
+ Definition_Ptr def = SASS_MEMORY_CAST_PTR(Definition, n);
350
347
  return def && def->type() == Definition::MIXIN;
351
348
  }
352
349
 
353
- bool CheckNesting::is_function(Statement* n)
350
+ bool CheckNesting::is_function(Statement_Ptr n)
354
351
  {
355
- Definition* def = dynamic_cast<Definition*>(n);
352
+ Definition_Ptr def = SASS_MEMORY_CAST_PTR(Definition, n);
356
353
  return def && def->type() == Definition::FUNCTION;
357
354
  }
358
355
 
359
- bool CheckNesting::is_root_node(Statement* n)
356
+ bool CheckNesting::is_root_node(Statement_Ptr n)
360
357
  {
361
- if (dynamic_cast<Ruleset*>(n)) return false;
358
+ if (SASS_MEMORY_CAST_PTR(Ruleset, n)) return false;
362
359
 
363
- Block* b = dynamic_cast<Block*>(n);
360
+ Block_Ptr b = SASS_MEMORY_CAST_PTR(Block, n);
364
361
  return b && b->is_root();
365
362
  }
366
363
 
367
- bool CheckNesting::is_at_root_node(Statement* n)
364
+ bool CheckNesting::is_at_root_node(Statement_Ptr n)
368
365
  {
369
- return dynamic_cast<At_Root_Block*>(n) != NULL;
366
+ return SASS_MEMORY_CAST_PTR(At_Root_Block, n) != NULL;
370
367
  }
371
368
 
372
- bool CheckNesting::is_directive_node(Statement* n)
369
+ bool CheckNesting::is_directive_node(Statement_Ptr n)
373
370
  {
374
- return dynamic_cast<Directive*>(n) ||
375
- dynamic_cast<Import*>(n) ||
376
- dynamic_cast<Media_Block*>(n) ||
377
- dynamic_cast<Supports_Block*>(n);
371
+ return SASS_MEMORY_CAST_PTR(Directive, n) ||
372
+ SASS_MEMORY_CAST_PTR(Import, n) ||
373
+ SASS_MEMORY_CAST_PTR(Media_Block, n) ||
374
+ SASS_MEMORY_CAST_PTR(Supports_Block, n);
378
375
  }
379
376
  }