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
@@ -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
  }