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
@@ -6,53 +6,57 @@
6
6
 
7
7
  namespace Sass {
8
8
 
9
- typedef Environment<AST_Node*> Env;
9
+ typedef Environment<AST_Node_Obj> Env;
10
10
 
11
- class CheckNesting : public Operation_CRTP<Statement*, CheckNesting> {
11
+ class CheckNesting : public Operation_CRTP<Statement_Ptr, CheckNesting> {
12
12
 
13
- std::vector<Statement*> parents;
14
- Statement* parent;
15
- Definition* current_mixin_definition;
13
+ std::vector<Statement_Ptr> parents;
14
+ Statement_Ptr parent;
15
+ Definition_Ptr current_mixin_definition;
16
16
 
17
- Statement* fallback_impl(Statement*);
18
- Statement* before(Statement*);
19
- Statement* visit_children(Statement*);
17
+ Statement_Ptr fallback_impl(Statement_Ptr);
18
+ Statement_Ptr before(Statement_Ptr);
19
+ Statement_Ptr visit_children(Statement_Ptr);
20
20
 
21
21
  public:
22
22
  CheckNesting();
23
23
  ~CheckNesting() { }
24
24
 
25
- Statement* operator()(Block*);
26
- Statement* operator()(Definition*);
25
+ Statement_Ptr operator()(Block_Ptr);
26
+ Statement_Ptr operator()(Definition_Ptr);
27
27
 
28
28
  template <typename U>
29
- Statement* fallback(U x) {
30
- return fallback_impl(this->before(dynamic_cast<Statement*>(x)));
29
+ Statement_Ptr fallback(U x) {
30
+ Statement_Ptr n = SASS_MEMORY_CAST_PTR(Statement, x);
31
+ if (this->should_visit(n)) {
32
+ return fallback_impl(n);
33
+ }
34
+ return NULL;
31
35
  }
32
36
 
33
37
  private:
34
- void invalid_content_parent(Statement*);
35
- void invalid_charset_parent(Statement*);
36
- void invalid_extend_parent(Statement*);
37
- // void invalid_import_parent(Statement*);
38
- void invalid_mixin_definition_parent(Statement*);
39
- void invalid_function_parent(Statement*);
40
-
41
- void invalid_function_child(Statement*);
42
- void invalid_prop_child(Statement*);
43
- void invalid_prop_parent(Statement*);
44
- void invalid_return_parent(Statement*);
45
-
46
- bool is_transparent_parent(Statement*, Statement*);
47
-
48
- bool should_visit(Statement*);
49
-
50
- bool is_charset(Statement*);
51
- bool is_mixin(Statement*);
52
- bool is_function(Statement*);
53
- bool is_root_node(Statement*);
54
- bool is_at_root_node(Statement*);
55
- bool is_directive_node(Statement*);
38
+ void invalid_content_parent(Statement_Ptr);
39
+ void invalid_charset_parent(Statement_Ptr);
40
+ void invalid_extend_parent(Statement_Ptr);
41
+ // void invalid_import_parent(Statement_Ptr);
42
+ void invalid_mixin_definition_parent(Statement_Ptr);
43
+ void invalid_function_parent(Statement_Ptr);
44
+
45
+ void invalid_function_child(Statement_Ptr);
46
+ void invalid_prop_child(Statement_Ptr);
47
+ void invalid_prop_parent(Statement_Ptr);
48
+ void invalid_return_parent(Statement_Ptr);
49
+
50
+ bool is_transparent_parent(Statement_Ptr, Statement_Ptr);
51
+
52
+ bool should_visit(Statement_Ptr);
53
+
54
+ bool is_charset(Statement_Ptr);
55
+ bool is_mixin(Statement_Ptr);
56
+ bool is_function(Statement_Ptr);
57
+ bool is_root_node(Statement_Ptr);
58
+ bool is_at_root_node(Statement_Ptr);
59
+ bool is_directive_node(Statement_Ptr);
56
60
  };
57
61
 
58
62
  }
@@ -452,7 +452,7 @@ namespace Sass {
452
452
  { 102 * 0x10000 + 51 * 0x100 + 153, ColorNames::rebeccapurple }
453
453
  };
454
454
 
455
- const std::map<const char*, const Color*, map_cmp_str> names_to_colors
455
+ const std::map<const char*, Color_Ptr_Const, map_cmp_str> names_to_colors
456
456
  {
457
457
  { ColorNames::aliceblue, &Colors::aliceblue },
458
458
  { ColorNames::antiquewhite, &Colors::antiquewhite },
@@ -605,7 +605,7 @@ namespace Sass {
605
605
  { ColorNames::transparent, &Colors::transparent }
606
606
  };
607
607
 
608
- const Color* name_to_color(const char* key)
608
+ Color_Ptr_Const name_to_color(const char* key)
609
609
  {
610
610
  auto p = names_to_colors.find(key);
611
611
  if (p != names_to_colors.end()) {
@@ -614,7 +614,7 @@ namespace Sass {
614
614
  return 0;
615
615
  }
616
616
 
617
- const Color* name_to_color(const std::string& key)
617
+ Color_Ptr_Const name_to_color(const std::string& key)
618
618
  {
619
619
  return name_to_color(key.c_str());
620
620
  }
@@ -320,10 +320,10 @@ namespace Sass {
320
320
  }
321
321
 
322
322
  extern const std::map<const int, const char*> colors_to_names;
323
- extern const std::map<const char*, const Color*, map_cmp_str> names_to_colors;
323
+ extern const std::map<const char*, Color_Ptr_Const, map_cmp_str> names_to_colors;
324
324
 
325
- extern const Color* name_to_color(const char*);
326
- extern const Color* name_to_color(const std::string&);
325
+ extern Color_Ptr_Const name_to_color(const char*);
326
+ extern Color_Ptr_Const name_to_color(const std::string&);
327
327
  extern const char* color_to_name(const int);
328
328
  extern const char* color_to_name(const Color&);
329
329
  extern const char* color_to_name(const double);
@@ -64,7 +64,6 @@ namespace Sass {
64
64
  c_options(c_ctx),
65
65
  entry_path(""),
66
66
  head_imports(0),
67
- mem(Memory_Manager()),
68
67
  plugins(),
69
68
  emitter(c_options),
70
69
 
@@ -146,6 +145,7 @@ namespace Sass {
146
145
  }
147
146
  // clear inner structures (vectors) and input source
148
147
  resources.clear(); import_stack.clear();
148
+ subset_map.clear(), sheets.clear();
149
149
  }
150
150
 
151
151
  Data_Context::~Data_Context()
@@ -316,13 +316,13 @@ namespace Sass {
316
316
  sass_import_take_source(import);
317
317
  sass_import_take_srcmap(import);
318
318
  // then parse the root block
319
- Block* root = p.parse();
319
+ Block_Obj root = p.parse();
320
320
  // delete memory of current stack frame
321
321
  sass_delete_import(import_stack.back());
322
322
  // remove current stack frame
323
323
  import_stack.pop_back();
324
324
  // create key/value pair for ast node
325
- std::pair<const std::string, const StyleSheet>
325
+ std::pair<const std::string, StyleSheet>
326
326
  ast_pair(inc.abs_path, { res, root });
327
327
  // register resulting resource
328
328
  sheets.insert(ast_pair);
@@ -369,7 +369,7 @@ namespace Sass {
369
369
 
370
370
  }
371
371
 
372
- void Context::import_url (Import* imp, std::string load_path, const std::string& ctx_path) {
372
+ void Context::import_url (Import_Ptr imp, std::string load_path, const std::string& ctx_path) {
373
373
 
374
374
  ParserState pstate(imp->pstate());
375
375
  std::string imp_path(unquote(load_path));
@@ -384,15 +384,15 @@ namespace Sass {
384
384
 
385
385
  // add urls (protocol other than file) and urls without procotol to `urls` member
386
386
  // ToDo: if ctx_path is already a file resource, we should not add it here?
387
- if (imp->media_queries() || protocol != "file" || imp_path.substr(0, 2) == "//") {
388
- imp->urls().push_back(SASS_MEMORY_NEW(mem, String_Quoted, imp->pstate(), load_path));
387
+ if (imp->import_queries() || protocol != "file" || imp_path.substr(0, 2) == "//") {
388
+ imp->urls().push_back(SASS_MEMORY_NEW(String_Quoted, imp->pstate(), load_path));
389
389
  }
390
390
  else if (imp_path.length() > 4 && imp_path.substr(imp_path.length() - 4, 4) == ".css") {
391
- String_Constant* loc = SASS_MEMORY_NEW(mem, String_Constant, pstate, unquote(load_path));
392
- Argument* loc_arg = SASS_MEMORY_NEW(mem, Argument, pstate, loc);
393
- Arguments* loc_args = SASS_MEMORY_NEW(mem, Arguments, pstate);
394
- (*loc_args) << loc_arg;
395
- Function_Call* new_url = SASS_MEMORY_NEW(mem, Function_Call, pstate, "url", loc_args);
391
+ String_Constant_Ptr loc = SASS_MEMORY_NEW(String_Constant, pstate, unquote(load_path));
392
+ Argument_Obj loc_arg = SASS_MEMORY_NEW(Argument, pstate, loc);
393
+ Arguments_Obj loc_args = SASS_MEMORY_NEW(Arguments, pstate);
394
+ loc_args->append(&loc_arg);
395
+ Function_Call_Ptr new_url = SASS_MEMORY_NEW(Function_Call, pstate, "url", &loc_args);
396
396
  imp->urls().push_back(new_url);
397
397
  }
398
398
  else {
@@ -408,7 +408,7 @@ namespace Sass {
408
408
 
409
409
 
410
410
  // call custom importers on the given (unquoted) load_path and eventually parse the resulting style_sheet
411
- bool Context::call_loader(const std::string& load_path, const char* ctx_path, ParserState& pstate, Import* imp, std::vector<Sass_Importer_Entry> importers, bool only_one)
411
+ bool Context::call_loader(const std::string& load_path, const char* ctx_path, ParserState& pstate, Import_Ptr imp, std::vector<Sass_Importer_Entry> importers, bool only_one)
412
412
  {
413
413
  // unique counter
414
414
  size_t count = 0;
@@ -494,7 +494,7 @@ namespace Sass {
494
494
  void register_c_functions(Context&, Env* env, Sass_Function_List);
495
495
  void register_c_function(Context&, Env* env, Sass_Function_Entry);
496
496
 
497
- char* Context::render(Block* root)
497
+ char* Context::render(Block_Obj root)
498
498
  {
499
499
  // check for valid block
500
500
  if (!root) return 0;
@@ -522,24 +522,24 @@ namespace Sass {
522
522
  return sass_copy_c_string(emitted.buffer.c_str());
523
523
  }
524
524
 
525
- void Context::apply_custom_headers(Block* root, const char* ctx_path, ParserState pstate)
525
+ void Context::apply_custom_headers(Block_Obj root, const char* ctx_path, ParserState pstate)
526
526
  {
527
527
  // create a custom import to resolve headers
528
- Import* imp = SASS_MEMORY_NEW(mem, Import, pstate);
528
+ Import_Obj imp = SASS_MEMORY_NEW(Import, pstate);
529
529
  // dispatch headers which will add custom functions
530
530
  // custom headers are added to the import instance
531
- call_headers(entry_path, ctx_path, pstate, imp);
531
+ call_headers(entry_path, ctx_path, pstate, &imp);
532
532
  // increase head count to skip later
533
533
  head_imports += resources.size() - 1;
534
534
  // add the statement if we have urls
535
- if (!imp->urls().empty()) (*root) << imp;
535
+ if (!imp->urls().empty()) root->append(&imp);
536
536
  // process all other resources (add Import_Stub nodes)
537
537
  for (size_t i = 0, S = imp->incs().size(); i < S; ++i) {
538
- (*root) << SASS_MEMORY_NEW(mem, Import_Stub, pstate, imp->incs()[i]);
538
+ root->append(SASS_MEMORY_NEW(Import_Stub, pstate, imp->incs()[i]));
539
539
  }
540
540
  }
541
541
 
542
- Block* File_Context::parse()
542
+ Block_Obj File_Context::parse()
543
543
  {
544
544
 
545
545
  // check if entry file is given
@@ -562,7 +562,7 @@ namespace Sass {
562
562
  }
563
563
 
564
564
  // abort early if no content could be loaded (various reasons)
565
- if (!contents) throw "File to read not found or unreadable: " + input_path;
565
+ if (!contents) throw std::runtime_error("File to read not found or unreadable: " + input_path);
566
566
 
567
567
  // store entry path
568
568
  entry_path = abs_path;
@@ -585,7 +585,7 @@ namespace Sass {
585
585
 
586
586
  }
587
587
 
588
- Block* Data_Context::parse()
588
+ Block_Obj Data_Context::parse()
589
589
  {
590
590
 
591
591
  // check if source string is given
@@ -629,15 +629,14 @@ namespace Sass {
629
629
 
630
630
 
631
631
  // parse root block from includes
632
- Block* Context::compile()
632
+ Block_Obj Context::compile()
633
633
  {
634
634
  // abort if there is no data
635
635
  if (resources.size() == 0) return 0;
636
636
  // get root block from the first style sheet
637
- Block* root = sheets.at(entry_path).root;
637
+ Block_Obj root = sheets.at(entry_path).root;
638
638
  // abort on invalid root
639
- if (root == 0) return 0;
640
-
639
+ if (root.isNull()) return 0;
641
640
  Env global; // create root environment
642
641
  // register built-in functions on env
643
642
  register_built_in_functions(*this, &global);
@@ -651,19 +650,19 @@ namespace Sass {
651
650
  Cssize cssize(*this, &backtrace);
652
651
  CheckNesting check_nesting;
653
652
  // check nesting
654
- root->perform(&check_nesting)->block();
653
+ check_nesting(&root);
655
654
  // expand and eval the tree
656
- root = root->perform(&expand)->block();
655
+ root = expand(&root);
657
656
  // check nesting
658
- root->perform(&check_nesting)->block();
657
+ check_nesting(&root);
659
658
  // merge and bubble certain rules
660
- root = root->perform(&cssize)->block();
659
+ root = cssize(&root);
661
660
  // should we extend something?
662
661
  if (!subset_map.empty()) {
663
662
  // create crtp visitor object
664
663
  Extend extend(*this, subset_map);
665
664
  // extend tree nodes
666
- root->perform(&extend);
665
+ extend(&root);
667
666
  }
668
667
 
669
668
  // clean up by removing empty placeholders
@@ -719,14 +718,14 @@ namespace Sass {
719
718
 
720
719
  void register_function(Context& ctx, Signature sig, Native_Function f, Env* env)
721
720
  {
722
- Definition* def = make_native_function(sig, f, ctx);
721
+ Definition_Ptr def = make_native_function(sig, f, ctx);
723
722
  def->environment(env);
724
723
  (*env)[def->name() + "[f]"] = def;
725
724
  }
726
725
 
727
726
  void register_function(Context& ctx, Signature sig, Native_Function f, size_t arity, Env* env)
728
727
  {
729
- Definition* def = make_native_function(sig, f, ctx);
728
+ Definition_Ptr def = make_native_function(sig, f, ctx);
730
729
  std::stringstream ss;
731
730
  ss << def->name() << "[f]" << arity;
732
731
  def->environment(env);
@@ -735,7 +734,7 @@ namespace Sass {
735
734
 
736
735
  void register_overload_stub(Context& ctx, std::string name, Env* env)
737
736
  {
738
- Definition* stub = SASS_MEMORY_NEW(ctx.mem, Definition,
737
+ Definition_Ptr stub = SASS_MEMORY_NEW(Definition,
739
738
  ParserState("[built-in function]"),
740
739
  0,
741
740
  name,
@@ -856,7 +855,7 @@ namespace Sass {
856
855
  }
857
856
  void register_c_function(Context& ctx, Env* env, Sass_Function_Entry descr)
858
857
  {
859
- Definition* def = make_c_function(descr, ctx);
858
+ Definition_Ptr def = make_c_function(descr, ctx);
860
859
  def->environment(env);
861
860
  (*env)[def->name() + "[f]"] = def;
862
861
  }
@@ -10,7 +10,6 @@
10
10
 
11
11
  #include "ast_fwd_decl.hpp"
12
12
  #include "kwd_arg_macros.hpp"
13
- #include "memory_manager.hpp"
14
13
  #include "ast_fwd_decl.hpp"
15
14
  #include "sass_context.hpp"
16
15
  #include "environment.hpp"
@@ -27,21 +26,20 @@ namespace Sass {
27
26
 
28
27
  class Context {
29
28
  public:
30
- void import_url (Import* imp, std::string load_path, const std::string& ctx_path);
31
- bool call_headers(const std::string& load_path, const char* ctx_path, ParserState& pstate, Import* imp)
29
+ void import_url (Import_Ptr imp, std::string load_path, const std::string& ctx_path);
30
+ bool call_headers(const std::string& load_path, const char* ctx_path, ParserState& pstate, Import_Ptr imp)
32
31
  { return call_loader(load_path, ctx_path, pstate, imp, c_headers, false); };
33
- bool call_importers(const std::string& load_path, const char* ctx_path, ParserState& pstate, Import* imp)
32
+ bool call_importers(const std::string& load_path, const char* ctx_path, ParserState& pstate, Import_Ptr imp)
34
33
  { return call_loader(load_path, ctx_path, pstate, imp, c_importers, true); };
35
34
 
36
35
  private:
37
- bool call_loader(const std::string& load_path, const char* ctx_path, ParserState& pstate, Import* imp, std::vector<Sass_Importer_Entry> importers, bool only_one = true);
36
+ bool call_loader(const std::string& load_path, const char* ctx_path, ParserState& pstate, Import_Ptr imp, std::vector<Sass_Importer_Entry> importers, bool only_one = true);
38
37
 
39
38
  public:
40
39
  const std::string CWD;
41
40
  struct Sass_Options& c_options;
42
41
  std::string entry_path;
43
42
  size_t head_imports;
44
- Memory_Manager mem;
45
43
  Plugins plugins;
46
44
  Output emitter;
47
45
 
@@ -49,8 +47,8 @@ namespace Sass {
49
47
  // these are guaranteed to be freed
50
48
  std::vector<char*> strings;
51
49
  std::vector<Resource> resources;
52
- std::map<const std::string, const StyleSheet> sheets;
53
- Subset_Map<std::string, std::pair<Sequence_Selector*, SimpleSequence_Selector*> > subset_map;
50
+ std::map<const std::string, StyleSheet> sheets;
51
+ Subset_Map subset_map;
54
52
  std::vector<Sass_Import_Entry> import_stack;
55
53
 
56
54
  struct Sass_Compiler* c_compiler;
@@ -68,7 +66,7 @@ namespace Sass {
68
66
 
69
67
 
70
68
 
71
- void apply_custom_headers(Block* root, const char* path, ParserState pstate);
69
+ void apply_custom_headers(Block_Obj root, const char* path, ParserState pstate);
72
70
 
73
71
  std::vector<Sass_Importer_Entry> c_headers;
74
72
  std::vector<Sass_Importer_Entry> c_importers;
@@ -87,9 +85,9 @@ namespace Sass {
87
85
 
88
86
  virtual ~Context();
89
87
  Context(struct Sass_Context&);
90
- virtual Block* parse() = 0;
91
- virtual Block* compile();
92
- virtual char* render(Block* root);
88
+ virtual Block_Obj parse() = 0;
89
+ virtual Block_Obj compile();
90
+ virtual char* render(Block_Obj root);
93
91
  virtual char* render_srcmap();
94
92
 
95
93
  void register_resource(const Include&, const Resource&, ParserState* = 0);
@@ -123,7 +121,7 @@ namespace Sass {
123
121
  : Context(ctx)
124
122
  { }
125
123
  virtual ~File_Context();
126
- virtual Block* parse();
124
+ virtual Block_Obj parse();
127
125
  };
128
126
 
129
127
  class Data_Context : public Context {
@@ -139,7 +137,7 @@ namespace Sass {
139
137
  ctx.srcmap_string = 0; // passed away
140
138
  }
141
139
  virtual ~Data_Context();
142
- virtual Block* parse();
140
+ virtual Block_Obj parse();
143
141
  };
144
142
 
145
143
  }
@@ -11,38 +11,38 @@ namespace Sass {
11
11
 
12
12
  Cssize::Cssize(Context& ctx, Backtrace* bt)
13
13
  : ctx(ctx),
14
- block_stack(std::vector<Block*>()),
15
- p_stack(std::vector<Statement*>()),
14
+ block_stack(std::vector<Block_Ptr>()),
15
+ p_stack(std::vector<Statement_Ptr>()),
16
16
  backtrace(bt)
17
17
  { }
18
18
 
19
- Statement* Cssize::parent()
19
+ Statement_Ptr Cssize::parent()
20
20
  {
21
21
  return p_stack.size() ? p_stack.back() : block_stack.front();
22
22
  }
23
23
 
24
- Statement* Cssize::operator()(Block* b)
24
+ Block_Ptr Cssize::operator()(Block_Ptr b)
25
25
  {
26
- Block* bb = SASS_MEMORY_NEW(ctx.mem, Block, b->pstate(), b->length(), b->is_root());
26
+ Block_Ptr bb = SASS_MEMORY_NEW(Block, b->pstate(), b->length(), b->is_root());
27
27
  // bb->tabs(b->tabs());
28
28
  block_stack.push_back(bb);
29
- append_block(b);
29
+ append_block(b, bb);
30
30
  block_stack.pop_back();
31
31
  return bb;
32
32
  }
33
33
 
34
- Statement* Cssize::operator()(Trace* t)
34
+ Statement_Ptr Cssize::operator()(Trace_Ptr t)
35
35
  {
36
36
  return t->block()->perform(this);
37
37
  }
38
38
 
39
- Statement* Cssize::operator()(Declaration* d)
39
+ Statement_Ptr Cssize::operator()(Declaration_Ptr d)
40
40
  {
41
- String* property = dynamic_cast<String*>(d->property());
41
+ String_Obj property = SASS_MEMORY_CAST(String, d->property());
42
42
 
43
- if (Declaration* dd = dynamic_cast<Declaration*>(parent())) {
44
- String* parent_property = dynamic_cast<String*>(dd->property());
45
- property = SASS_MEMORY_NEW(ctx.mem, String_Constant,
43
+ if (Declaration_Ptr dd = dynamic_cast<Declaration_Ptr>(parent())) {
44
+ String_Obj parent_property = SASS_MEMORY_CAST(String, dd->property());
45
+ property = SASS_MEMORY_NEW(String_Constant,
46
46
  d->property()->pstate(),
47
47
  parent_property->to_string() + "-" + property->to_string());
48
48
  if (!dd->value()) {
@@ -50,7 +50,7 @@ namespace Sass {
50
50
  }
51
51
  }
52
52
 
53
- Declaration* dd = SASS_MEMORY_NEW(ctx.mem, Declaration,
53
+ Declaration_Obj dd = SASS_MEMORY_NEW(Declaration,
54
54
  d->pstate(),
55
55
  property,
56
56
  d->value(),
@@ -58,99 +58,101 @@ namespace Sass {
58
58
  dd->is_indented(d->is_indented());
59
59
  dd->tabs(d->tabs());
60
60
 
61
- p_stack.push_back(dd);
62
- Block* bb = d->block() ? d->block()->perform(this)->block() : 0;
61
+ p_stack.push_back(&dd);
62
+ Block_Obj bb = d->block() ? operator()(&d->block()) : NULL;
63
63
  p_stack.pop_back();
64
64
 
65
65
  if (bb && bb->length()) {
66
66
  if (dd->value() && !dd->value()->is_invisible()) {
67
- bb->unshift(dd);
67
+ bb->unshift(&dd);
68
68
  }
69
- return bb;
69
+ return bb.detach();
70
70
  }
71
71
  else if (dd->value() && !dd->value()->is_invisible()) {
72
- return dd;
72
+ return dd.detach();
73
73
  }
74
74
 
75
75
  return 0;
76
76
  }
77
77
 
78
- Statement* Cssize::operator()(Directive* r)
78
+ Statement_Ptr Cssize::operator()(Directive_Ptr r)
79
79
  {
80
80
  if (!r->block() || !r->block()->length()) return r;
81
81
 
82
82
  if (parent()->statement_type() == Statement::RULESET)
83
83
  {
84
- return (r->is_keyframes()) ? SASS_MEMORY_NEW(ctx.mem, Bubble, r->pstate(), r) : bubble(r);
84
+ return (r->is_keyframes()) ? SASS_MEMORY_NEW(Bubble, r->pstate(), r) : bubble(r);
85
85
  }
86
86
 
87
87
  p_stack.push_back(r);
88
- Directive* rr = SASS_MEMORY_NEW(ctx.mem, Directive,
88
+ Directive_Obj rr = SASS_MEMORY_NEW(Directive,
89
89
  r->pstate(),
90
90
  r->keyword(),
91
91
  r->selector(),
92
- r->block() ? r->block()->perform(this)->block() : 0);
92
+ r->block() ? operator()(&r->block()) : 0);
93
93
  if (r->value()) rr->value(r->value());
94
94
  p_stack.pop_back();
95
95
 
96
96
  bool directive_exists = false;
97
97
  size_t L = rr->block() ? rr->block()->length() : 0;
98
98
  for (size_t i = 0; i < L && !directive_exists; ++i) {
99
- Statement* s = (*r->block())[i];
99
+ Statement_Obj s = r->block()->at(i);
100
100
  if (s->statement_type() != Statement::BUBBLE) directive_exists = true;
101
101
  else {
102
- s = static_cast<Bubble*>(s)->node();
102
+ Bubble_Obj s_obj = SASS_MEMORY_CAST(Bubble, s);
103
+ s = s_obj->node();
103
104
  if (s->statement_type() != Statement::DIRECTIVE) directive_exists = false;
104
- else directive_exists = (static_cast<Directive*>(s)->keyword() == rr->keyword());
105
+ else directive_exists = (static_cast<Directive_Ptr>(&s)->keyword() == rr->keyword());
105
106
  }
106
107
 
107
108
  }
108
109
 
109
- Block* result = SASS_MEMORY_NEW(ctx.mem, Block, rr->pstate());
110
+ Block_Ptr result = SASS_MEMORY_NEW(Block, rr->pstate());
110
111
  if (!(directive_exists || rr->is_keyframes()))
111
112
  {
112
- Directive* empty_node = static_cast<Directive*>(rr);
113
- empty_node->block(SASS_MEMORY_NEW(ctx.mem, Block, rr->block() ? rr->block()->pstate() : rr->pstate()));
114
- *result << empty_node;
113
+ Directive_Ptr empty_node = SASS_MEMORY_CAST(Directive, rr);
114
+ empty_node->block(SASS_MEMORY_NEW(Block, rr->block() ? rr->block()->pstate() : rr->pstate()));
115
+ result->append(empty_node);
115
116
  }
116
117
 
117
- Statement* ss = debubble(rr->block() ? rr->block() : SASS_MEMORY_NEW(ctx.mem, Block, rr->pstate()), rr);
118
- for (size_t i = 0, L = ss->block()->length(); i < L; ++i) {
119
- *result << (*ss->block())[i];
118
+ Block_Obj ss = debubble(rr->block() ? &rr->block() : SASS_MEMORY_NEW(Block, rr->pstate()), &rr);
119
+ for (size_t i = 0, L = ss->length(); i < L; ++i) {
120
+ result->append(ss->at(i));
120
121
  }
121
122
 
122
123
  return result;
123
124
  }
124
125
 
125
- Statement* Cssize::operator()(Keyframe_Rule* r)
126
+ Statement_Ptr Cssize::operator()(Keyframe_Rule_Ptr r)
126
127
  {
127
128
  if (!r->block() || !r->block()->length()) return r;
128
129
 
129
- Keyframe_Rule* rr = SASS_MEMORY_NEW(ctx.mem, Keyframe_Rule,
130
+ Keyframe_Rule_Obj rr = SASS_MEMORY_NEW(Keyframe_Rule,
130
131
  r->pstate(),
131
- r->block()->perform(this)->block());
132
- if (r->selector()) rr->selector(r->selector());
132
+ operator()(&r->block()));
133
+ if (&r->name()) rr->name(r->name());
133
134
 
134
- return debubble(rr->block(), rr)->block();
135
+ return debubble(&rr->block(), &rr);
135
136
  }
136
137
 
137
- Statement* Cssize::operator()(Ruleset* r)
138
+ Statement_Ptr Cssize::operator()(Ruleset_Ptr r)
138
139
  {
139
140
  p_stack.push_back(r);
140
141
  // this can return a string schema
141
142
  // string schema is not a statement!
142
143
  // r->block() is already a string schema
143
144
  // and that is comming from propset expand
144
- Statement* stmt = r->block()->perform(this);
145
+ Block_Ptr bb = operator()(&r->block());
145
146
  // this should protect us (at least a bit) from our mess
146
147
  // fixing this properly is harder that it should be ...
147
- if (dynamic_cast<Statement*>((AST_Node*)stmt) == NULL) {
148
+ if (dynamic_cast<Statement_Ptr>(bb) == NULL) {
148
149
  error("Illegal nesting: Only properties may be nested beneath properties.", r->block()->pstate());
149
150
  }
150
- Ruleset* rr = SASS_MEMORY_NEW(ctx.mem, Ruleset,
151
+ Ruleset_Obj rr = SASS_MEMORY_NEW(Ruleset,
151
152
  r->pstate(),
152
153
  r->selector(),
153
- stmt->block());
154
+ bb);
155
+
154
156
  rr->is_root(r->is_root());
155
157
  // rr->tabs(r->block()->tabs());
156
158
  p_stack.pop_back();
@@ -159,68 +161,74 @@ namespace Sass {
159
161
  error("Illegal nesting: Only properties may be nested beneath properties.", r->block()->pstate());
160
162
  }
161
163
 
162
- Block* props = SASS_MEMORY_NEW(ctx.mem, Block, rr->block()->pstate());
163
- Block* rules = SASS_MEMORY_NEW(ctx.mem, Block, rr->block()->pstate());
164
+ Block_Obj props = SASS_MEMORY_NEW(Block, rr->block()->pstate());
165
+ Block_Ptr rules = SASS_MEMORY_NEW(Block, rr->block()->pstate());
164
166
  for (size_t i = 0, L = rr->block()->length(); i < L; i++)
165
167
  {
166
- Statement* s = (*rr->block())[i];
167
- if (bubblable(s)) *rules << s;
168
- if (!bubblable(s)) *props << s;
168
+ Statement_Ptr s = &rr->block()->at(i);
169
+ if (bubblable(s)) rules->append(s);
170
+ if (!bubblable(s)) props->append(s);
169
171
  }
170
172
 
171
173
  if (props->length())
172
174
  {
173
- Block* bb = SASS_MEMORY_NEW(ctx.mem, Block, rr->block()->pstate());
174
- *bb += props;
175
+ Block_Obj bb = SASS_MEMORY_NEW(Block, rr->block()->pstate());
176
+ bb->concat(&props);
175
177
  rr->block(bb);
176
178
 
177
179
  for (size_t i = 0, L = rules->length(); i < L; i++)
178
180
  {
179
- (*rules)[i]->tabs((*rules)[i]->tabs() + 1);
181
+ Statement_Ptr stm = &rules->at(i);
182
+ stm->tabs(stm->tabs() + 1);
180
183
  }
181
184
 
182
- rules->unshift(rr);
185
+ rules->unshift(&rr);
183
186
  }
184
187
 
185
- rules = debubble(rules)->block();
188
+ Block_Ptr ptr = rules;
189
+ rules = debubble(rules);
190
+ void* lp = ptr;
191
+ void* rp = rules;
192
+ if (lp != rp) {
193
+ Block_Obj obj = ptr;
194
+ }
186
195
 
187
196
  if (!(!rules->length() ||
188
- !bubblable(rules->last()) ||
197
+ !bubblable(&rules->last()) ||
189
198
  parent()->statement_type() == Statement::RULESET))
190
199
  {
191
200
  rules->last()->group_end(true);
192
201
  }
193
-
194
202
  return rules;
195
203
  }
196
204
 
197
- Statement* Cssize::operator()(Null* m)
205
+ Statement_Ptr Cssize::operator()(Null_Ptr m)
198
206
  {
199
207
  return 0;
200
208
  }
201
209
 
202
- Statement* Cssize::operator()(Media_Block* m)
210
+ Statement_Ptr Cssize::operator()(Media_Block_Ptr m)
203
211
  {
204
212
  if (parent()->statement_type() == Statement::RULESET)
205
213
  { return bubble(m); }
206
214
 
207
215
  if (parent()->statement_type() == Statement::MEDIA)
208
- { return SASS_MEMORY_NEW(ctx.mem, Bubble, m->pstate(), m); }
216
+ { return SASS_MEMORY_NEW(Bubble, m->pstate(), m); }
209
217
 
210
218
  p_stack.push_back(m);
211
219
 
212
- Media_Block* mm = SASS_MEMORY_NEW(ctx.mem, Media_Block,
220
+ Media_Block_Obj mm = SASS_MEMORY_NEW(Media_Block,
213
221
  m->pstate(),
214
- m->media_queries(),
215
- m->block()->perform(this)->block());
222
+ &m->media_queries(),
223
+ operator()(&m->block()));
216
224
  mm->tabs(m->tabs());
217
225
 
218
226
  p_stack.pop_back();
219
227
 
220
- return debubble(mm->block(), mm)->block();
228
+ return debubble(&mm->block(), &mm);
221
229
  }
222
230
 
223
- Statement* Cssize::operator()(Supports_Block* m)
231
+ Statement_Ptr Cssize::operator()(Supports_Block_Ptr m)
224
232
  {
225
233
  if (!m->block()->length())
226
234
  { return m; }
@@ -230,267 +238,231 @@ namespace Sass {
230
238
 
231
239
  p_stack.push_back(m);
232
240
 
233
- Supports_Block* mm = SASS_MEMORY_NEW(ctx.mem, Supports_Block,
241
+ Supports_Block_Obj mm = SASS_MEMORY_NEW(Supports_Block,
234
242
  m->pstate(),
235
- m->condition(),
236
- m->block()->perform(this)->block());
243
+ &m->condition(),
244
+ operator()(&m->block()));
237
245
  mm->tabs(m->tabs());
238
246
 
239
247
  p_stack.pop_back();
240
248
 
241
- return debubble(mm->block(), mm)->block();
249
+ return debubble(&mm->block(), &mm);
242
250
  }
243
251
 
244
- Statement* Cssize::operator()(At_Root_Block* m)
252
+ Statement_Ptr Cssize::operator()(At_Root_Block_Ptr m)
245
253
  {
246
254
  bool tmp = false;
247
255
  for (size_t i = 0, L = p_stack.size(); i < L; ++i) {
248
- Statement* s = p_stack[i];
256
+ Statement_Ptr s = p_stack[i];
249
257
  tmp |= m->exclude_node(s);
250
258
  }
251
259
 
252
260
  if (!tmp)
253
261
  {
254
- Block* bb = m->block()->perform(this)->block();
262
+ Block_Ptr bb = operator()(&m->block());
255
263
  for (size_t i = 0, L = bb->length(); i < L; ++i) {
256
264
  // (bb->elements())[i]->tabs(m->tabs());
257
- if (bubblable((*bb)[i])) (*bb)[i]->tabs((*bb)[i]->tabs() + m->tabs());
265
+ Statement_Obj stm = bb->at(i);
266
+ if (bubblable(&stm)) stm->tabs(stm->tabs() + m->tabs());
258
267
  }
259
- if (bb->length() && bubblable(bb->last())) bb->last()->group_end(m->group_end());
268
+ if (bb->length() && bubblable(&bb->last())) bb->last()->group_end(m->group_end());
260
269
  return bb;
261
270
  }
262
271
 
263
272
  if (m->exclude_node(parent()))
264
273
  {
265
- return SASS_MEMORY_NEW(ctx.mem, Bubble, m->pstate(), m);
274
+ return SASS_MEMORY_NEW(Bubble, m->pstate(), m);
266
275
  }
267
276
 
268
277
  return bubble(m);
269
278
  }
270
279
 
271
- Statement* Cssize::bubble(Directive* m)
280
+ Statement_Ptr Cssize::bubble(Directive_Ptr m)
272
281
  {
273
- Block* bb = SASS_MEMORY_NEW(ctx.mem, Block, this->parent()->pstate());
274
- Has_Block* new_rule = static_cast<Has_Block*>(shallow_copy(this->parent()));
282
+ Block_Ptr bb = SASS_MEMORY_NEW(Block, this->parent()->pstate());
283
+ Has_Block_Obj new_rule = static_cast<Has_Block_Ptr>(SASS_MEMORY_COPY(this->parent()));
275
284
  new_rule->block(bb);
276
285
  new_rule->tabs(this->parent()->tabs());
286
+ new_rule->block()->concat(&m->block());
277
287
 
278
- size_t L = m->block() ? m->block()->length() : 0;
279
- for (size_t i = 0; i < L; ++i) {
280
- *new_rule->block() << (*m->block())[i];
281
- }
282
-
283
- Block* wrapper_block = SASS_MEMORY_NEW(ctx.mem, Block, m->block() ? m->block()->pstate() : m->pstate());
284
- *wrapper_block << new_rule;
285
- Directive* mm = SASS_MEMORY_NEW(ctx.mem, Directive,
288
+ Block_Obj wrapper_block = SASS_MEMORY_NEW(Block, m->block() ? m->block()->pstate() : m->pstate());
289
+ wrapper_block->append(&new_rule);
290
+ Directive_Obj mm = SASS_MEMORY_NEW(Directive,
286
291
  m->pstate(),
287
292
  m->keyword(),
288
293
  m->selector(),
289
294
  wrapper_block);
290
295
  if (m->value()) mm->value(m->value());
291
296
 
292
- Bubble* bubble = SASS_MEMORY_NEW(ctx.mem, Bubble, mm->pstate(), mm);
297
+ Bubble_Ptr bubble = SASS_MEMORY_NEW(Bubble, mm->pstate(), &mm);
293
298
  return bubble;
294
299
  }
295
300
 
296
- Statement* Cssize::bubble(At_Root_Block* m)
301
+ Statement_Ptr Cssize::bubble(At_Root_Block_Ptr m)
297
302
  {
298
- Block* bb = SASS_MEMORY_NEW(ctx.mem, Block, this->parent()->pstate());
299
- Has_Block* new_rule = static_cast<Has_Block*>(shallow_copy(this->parent()));
303
+ Block_Ptr bb = SASS_MEMORY_NEW(Block, this->parent()->pstate());
304
+ Has_Block_Obj new_rule = static_cast<Has_Block_Ptr>(SASS_MEMORY_COPY(this->parent()));
300
305
  new_rule->block(bb);
301
306
  new_rule->tabs(this->parent()->tabs());
307
+ new_rule->block()->concat(&m->block());
302
308
 
303
- for (size_t i = 0, L = m->block()->length(); i < L; ++i) {
304
- *new_rule->block() << (*m->block())[i];
305
- }
306
-
307
- Block* wrapper_block = SASS_MEMORY_NEW(ctx.mem, Block, m->block()->pstate());
308
- *wrapper_block << new_rule;
309
- At_Root_Block* mm = SASS_MEMORY_NEW(ctx.mem, At_Root_Block,
309
+ Block_Ptr wrapper_block = SASS_MEMORY_NEW(Block, m->block()->pstate());
310
+ wrapper_block->append(&new_rule);
311
+ At_Root_Block_Ptr mm = SASS_MEMORY_NEW(At_Root_Block,
310
312
  m->pstate(),
311
313
  wrapper_block,
312
314
  m->expression());
313
- Bubble* bubble = SASS_MEMORY_NEW(ctx.mem, Bubble, mm->pstate(), mm);
315
+ Bubble_Ptr bubble = SASS_MEMORY_NEW(Bubble, mm->pstate(), mm);
314
316
  return bubble;
315
317
  }
316
318
 
317
- Statement* Cssize::bubble(Supports_Block* m)
319
+ Statement_Ptr Cssize::bubble(Supports_Block_Ptr m)
318
320
  {
319
- Ruleset* parent = static_cast<Ruleset*>(shallow_copy(this->parent()));
321
+ Ruleset_Obj parent = static_cast<Ruleset_Ptr>(SASS_MEMORY_COPY(this->parent()));
320
322
 
321
- Block* bb = SASS_MEMORY_NEW(ctx.mem, Block, parent->block()->pstate());
322
- Ruleset* new_rule = SASS_MEMORY_NEW(ctx.mem, Ruleset,
323
+ Block_Ptr bb = SASS_MEMORY_NEW(Block, parent->block()->pstate());
324
+ Ruleset_Ptr new_rule = SASS_MEMORY_NEW(Ruleset,
323
325
  parent->pstate(),
324
326
  parent->selector(),
325
327
  bb);
326
328
  new_rule->tabs(parent->tabs());
329
+ new_rule->block()->concat(&m->block());
327
330
 
328
- for (size_t i = 0, L = m->block()->length(); i < L; ++i) {
329
- *new_rule->block() << (*m->block())[i];
330
- }
331
-
332
- Block* wrapper_block = SASS_MEMORY_NEW(ctx.mem, Block, m->block()->pstate());
333
- *wrapper_block << new_rule;
334
- Supports_Block* mm = SASS_MEMORY_NEW(ctx.mem, Supports_Block,
331
+ Block_Ptr wrapper_block = SASS_MEMORY_NEW(Block, m->block()->pstate());
332
+ wrapper_block->append(new_rule);
333
+ Supports_Block_Ptr mm = SASS_MEMORY_NEW(Supports_Block,
335
334
  m->pstate(),
336
- m->condition(),
335
+ &m->condition(),
337
336
  wrapper_block);
338
337
 
339
338
  mm->tabs(m->tabs());
340
339
 
341
- Bubble* bubble = SASS_MEMORY_NEW(ctx.mem, Bubble, mm->pstate(), mm);
340
+ Bubble_Ptr bubble = SASS_MEMORY_NEW(Bubble, mm->pstate(), mm);
342
341
  return bubble;
343
342
  }
344
343
 
345
- Statement* Cssize::bubble(Media_Block* m)
344
+ Statement_Ptr Cssize::bubble(Media_Block_Ptr m)
346
345
  {
347
- Ruleset* parent = static_cast<Ruleset*>(shallow_copy(this->parent()));
346
+ Ruleset_Obj parent = static_cast<Ruleset_Ptr>(SASS_MEMORY_COPY(this->parent()));
348
347
 
349
- Block* bb = SASS_MEMORY_NEW(ctx.mem, Block, parent->block()->pstate());
350
- Ruleset* new_rule = SASS_MEMORY_NEW(ctx.mem, Ruleset,
348
+ Block_Ptr bb = SASS_MEMORY_NEW(Block, parent->block()->pstate());
349
+ Ruleset_Ptr new_rule = SASS_MEMORY_NEW(Ruleset,
351
350
  parent->pstate(),
352
351
  parent->selector(),
353
352
  bb);
354
353
  new_rule->tabs(parent->tabs());
354
+ new_rule->block()->concat(&m->block());
355
355
 
356
- for (size_t i = 0, L = m->block()->length(); i < L; ++i) {
357
- *new_rule->block() << (*m->block())[i];
358
- }
359
-
360
- Block* wrapper_block = SASS_MEMORY_NEW(ctx.mem, Block, m->block()->pstate());
361
- *wrapper_block << new_rule;
362
- Media_Block* mm = SASS_MEMORY_NEW(ctx.mem, Media_Block,
356
+ Block_Ptr wrapper_block = SASS_MEMORY_NEW(Block, m->block()->pstate());
357
+ wrapper_block->append(new_rule);
358
+ Media_Block_Obj mm = SASS_MEMORY_NEW(Media_Block,
363
359
  m->pstate(),
364
- m->media_queries(),
360
+ &m->media_queries(),
365
361
  wrapper_block,
366
362
  0);
367
363
 
368
364
  mm->tabs(m->tabs());
369
365
 
370
- Bubble* bubble = SASS_MEMORY_NEW(ctx.mem, Bubble, mm->pstate(), mm);
371
-
372
- return bubble;
366
+ return SASS_MEMORY_NEW(Bubble, mm->pstate(), &mm);
373
367
  }
374
368
 
375
- bool Cssize::bubblable(Statement* s)
369
+ bool Cssize::bubblable(Statement_Ptr s)
376
370
  {
377
- return s->statement_type() == Statement::RULESET || s->bubbles();
371
+ return dynamic_cast<Ruleset_Ptr>(s) || s->bubbles();
378
372
  }
379
373
 
380
- Statement* Cssize::flatten(Statement* s)
374
+ Block_Ptr Cssize::flatten(Block_Ptr b)
381
375
  {
382
- Block* bb = s->block();
383
- Block* result = SASS_MEMORY_NEW(ctx.mem, Block, bb->pstate(), 0, bb->is_root());
384
- for (size_t i = 0, L = bb->length(); i < L; ++i) {
385
- Statement* ss = (*bb)[i];
386
- if (ss->block()) {
387
- ss = flatten(ss);
388
- for (size_t j = 0, K = ss->block()->length(); j < K; ++j) {
389
- *result << (*ss->block())[j];
376
+ Block_Ptr result = SASS_MEMORY_NEW(Block, b->pstate(), 0, b->is_root());
377
+ for (size_t i = 0, L = b->length(); i < L; ++i) {
378
+ Statement_Ptr ss = &b->at(i);
379
+ if (Block_Ptr bb = SASS_MEMORY_CAST_PTR(Block, ss)) {
380
+ Block_Obj bs = flatten(bb);
381
+ for (size_t j = 0, K = bs->length(); j < K; ++j) {
382
+ result->append(bs->at(j));
390
383
  }
391
384
  }
392
385
  else {
393
- *result << ss;
386
+ result->append(ss);
394
387
  }
395
388
  }
396
389
  return result;
397
390
  }
398
391
 
399
- std::vector<std::pair<bool, Block*>> Cssize::slice_by_bubble(Statement* b)
392
+ std::vector<std::pair<bool, Block_Obj>> Cssize::slice_by_bubble(Block_Ptr b)
400
393
  {
401
- std::vector<std::pair<bool, Block*>> results;
402
- for (size_t i = 0, L = b->block()->length(); i < L; ++i) {
403
- Statement* value = (*b->block())[i];
404
- bool key = value->statement_type() == Statement::BUBBLE;
394
+ std::vector<std::pair<bool, Block_Obj>> results;
395
+
396
+ for (size_t i = 0, L = b->length(); i < L; ++i) {
397
+ Statement_Obj value = b->at(i);
398
+ bool key = dynamic_cast<Bubble_Ptr>(&value) != NULL;
405
399
 
406
400
  if (!results.empty() && results.back().first == key)
407
401
  {
408
- Block* wrapper_block = results.back().second;
409
- *wrapper_block << value;
402
+ Block_Obj wrapper_block = results.back().second;
403
+ wrapper_block->append(value);
410
404
  }
411
405
  else
412
406
  {
413
- Block* wrapper_block = SASS_MEMORY_NEW(ctx.mem, Block, value->pstate());
414
- *wrapper_block << value;
407
+ Block_Ptr wrapper_block = SASS_MEMORY_NEW(Block, value->pstate());
408
+ wrapper_block->append(value);
415
409
  results.push_back(std::make_pair(key, wrapper_block));
416
410
  }
417
411
  }
418
412
  return results;
419
413
  }
420
414
 
421
- Statement* Cssize::shallow_copy(Statement* s)
415
+ Block_Ptr Cssize::debubble(Block_Ptr children, Statement_Ptr parent)
422
416
  {
423
- switch (s->statement_type())
424
- {
425
- case Statement::RULESET:
426
- return SASS_MEMORY_NEW(ctx.mem, Ruleset, *static_cast<Ruleset*>(s));
427
- case Statement::MEDIA:
428
- return SASS_MEMORY_NEW(ctx.mem, Media_Block, *static_cast<Media_Block*>(s));
429
- case Statement::BUBBLE:
430
- return SASS_MEMORY_NEW(ctx.mem, Bubble, *static_cast<Bubble*>(s));
431
- case Statement::DIRECTIVE:
432
- return SASS_MEMORY_NEW(ctx.mem, Directive, *static_cast<Directive*>(s));
433
- case Statement::SUPPORTS:
434
- return SASS_MEMORY_NEW(ctx.mem, Supports_Block, *static_cast<Supports_Block*>(s));
435
- case Statement::ATROOT:
436
- return SASS_MEMORY_NEW(ctx.mem, At_Root_Block, *static_cast<At_Root_Block*>(s));
437
- case Statement::KEYFRAMERULE:
438
- return SASS_MEMORY_NEW(ctx.mem, Keyframe_Rule, *static_cast<Keyframe_Rule*>(s));
439
- case Statement::NONE:
440
- default:
441
- error("unknown internal error; please contact the LibSass maintainers", s->pstate(), backtrace);
442
- String_Quoted* msg = SASS_MEMORY_NEW(ctx.mem, String_Quoted, ParserState("[WARN]"), std::string("`CSSize` can't clone ") + typeid(*s).name());
443
- return SASS_MEMORY_NEW(ctx.mem, Warning, ParserState("[WARN]"), msg);
444
- }
445
- }
446
-
447
- Statement* Cssize::debubble(Block* children, Statement* parent)
448
- {
449
- Has_Block* previous_parent = 0;
450
- std::vector<std::pair<bool, Block*>> baz = slice_by_bubble(children);
451
- Block* result = SASS_MEMORY_NEW(ctx.mem, Block, children->pstate());
417
+ Has_Block_Obj previous_parent = 0;
418
+ std::vector<std::pair<bool, Block_Obj>> baz = slice_by_bubble(children);
419
+ Block_Obj result = SASS_MEMORY_NEW(Block, children->pstate());
452
420
 
453
421
  for (size_t i = 0, L = baz.size(); i < L; ++i) {
454
422
  bool is_bubble = baz[i].first;
455
- Block* slice = baz[i].second;
423
+ Block_Obj slice = baz[i].second;
456
424
 
457
425
  if (!is_bubble) {
458
426
  if (!parent) {
459
- *result << slice;
427
+ result->append(&slice);
460
428
  }
461
429
  else if (previous_parent) {
462
- *previous_parent->block() += slice;
430
+ previous_parent->block()->concat(&slice);
463
431
  }
464
432
  else {
465
- previous_parent = static_cast<Has_Block*>(shallow_copy(parent));
433
+ previous_parent = static_cast<Has_Block_Ptr>(SASS_MEMORY_COPY(parent));
466
434
  previous_parent->block(slice);
467
435
  previous_parent->tabs(parent->tabs());
468
436
 
469
- Has_Block* new_parent = previous_parent;
470
-
471
- *result << new_parent;
437
+ result->append(&previous_parent);
472
438
  }
473
439
  continue;
474
440
  }
475
441
 
476
442
  for (size_t j = 0, K = slice->length(); j < K; ++j)
477
443
  {
478
- Statement* ss = 0;
479
- Bubble* node = static_cast<Bubble*>((*slice)[j]);
480
-
444
+ Statement_Ptr ss = NULL;
445
+ Statement_Obj stm = slice->at(j);
446
+ // this has to go now here (too bad)
447
+ Bubble_Obj node = SASS_MEMORY_CAST(Bubble, stm);
448
+ Media_Block_Ptr m1 = NULL;
449
+ Media_Block_Ptr m2 = NULL;
450
+ if (parent) m1 = SASS_MEMORY_CAST(Media_Block, *parent);
451
+ if (node) m2 = SASS_MEMORY_CAST(Media_Block, node->node());
481
452
  if (!parent ||
482
453
  parent->statement_type() != Statement::MEDIA ||
483
454
  node->node()->statement_type() != Statement::MEDIA ||
484
- static_cast<Media_Block*>(node->node())->media_queries() == static_cast<Media_Block*>(parent)->media_queries())
455
+ (m1 && m2 && &m1->media_queries() == &m2->media_queries())
456
+ )
485
457
  {
486
- ss = node->node();
458
+ ss = &node->node();
487
459
  }
488
460
  else
489
461
  {
490
- List* mq = merge_media_queries(static_cast<Media_Block*>(node->node()), static_cast<Media_Block*>(parent));
462
+ List_Obj mq = merge_media_queries(static_cast<Media_Block_Ptr>(&node->node()), static_cast<Media_Block_Ptr>(parent));
491
463
  if (!mq->length()) continue;
492
- static_cast<Media_Block*>(node->node())->media_queries(mq);
493
- ss = node->node();
464
+ static_cast<Media_Block_Ptr>(&node->node())->media_queries(mq);
465
+ ss = &node->node();
494
466
  }
495
467
 
496
468
  if (!ss) continue;
@@ -500,69 +472,68 @@ namespace Sass {
500
472
 
501
473
  if (!ss) continue;
502
474
 
503
- Block* bb = SASS_MEMORY_NEW(ctx.mem, Block,
504
- children->block()->pstate(),
505
- children->block()->length(),
506
- children->block()->is_root());
507
- *bb << ss->perform(this);
475
+ Block_Obj bb = SASS_MEMORY_NEW(Block,
476
+ children->pstate(),
477
+ children->length(),
478
+ children->is_root());
479
+ bb->append(ss->perform(this));
508
480
 
509
- Block* wrapper_block = SASS_MEMORY_NEW(ctx.mem, Block,
510
- children->block()->pstate(),
511
- children->block()->length(),
512
- children->block()->is_root());
481
+ Block_Obj wrapper_block = SASS_MEMORY_NEW(Block,
482
+ children->pstate(),
483
+ children->length(),
484
+ children->is_root());
513
485
 
514
- Statement* wrapper = flatten(bb);
515
- *wrapper_block << wrapper;
486
+ Block_Ptr wrapper = flatten(&bb);
487
+ wrapper_block->append(wrapper);
516
488
 
517
- if (wrapper->block()->length()) {
518
- previous_parent = 0;
489
+ if (wrapper->length()) {
490
+ previous_parent = NULL;
519
491
  }
520
492
 
521
493
  if (wrapper_block) {
522
- *result << wrapper_block;
494
+ result->append(&wrapper_block);
523
495
  }
524
496
  }
525
497
  }
526
498
 
527
- return flatten(result);
499
+ return flatten(&result);
528
500
  }
529
501
 
530
- Statement* Cssize::fallback_impl(AST_Node* n)
502
+ Statement_Ptr Cssize::fallback_impl(AST_Node_Ptr n)
531
503
  {
532
- return static_cast<Statement*>(n);
504
+ return static_cast<Statement_Ptr>(n);
533
505
  }
534
506
 
535
- void Cssize::append_block(Block* b)
507
+ void Cssize::append_block(Block_Ptr b, Block_Ptr cur)
536
508
  {
537
- Block* current_block = block_stack.back();
538
-
539
509
  for (size_t i = 0, L = b->length(); i < L; ++i) {
540
- Statement* ith = (*b)[i]->perform(this);
541
- if (ith && ith->block()) {
542
- for (size_t j = 0, K = ith->block()->length(); j < K; ++j) {
543
- *current_block << (*ith->block())[j];
510
+ Statement_Obj ith = b->at(i)->perform(this);
511
+ if (Block_Ptr bb = SASS_MEMORY_CAST(Block, ith)) {
512
+ for (size_t j = 0, K = bb->length(); j < K; ++j) {
513
+ cur->append(bb->at(j));
544
514
  }
545
515
  }
546
516
  else if (ith) {
547
- *current_block << ith;
517
+ cur->append(ith);
548
518
  }
549
519
  }
550
520
  }
551
521
 
552
- List* Cssize::merge_media_queries(Media_Block* m1, Media_Block* m2)
522
+ List_Ptr Cssize::merge_media_queries(Media_Block_Ptr m1, Media_Block_Ptr m2)
553
523
  {
554
- List* qq = SASS_MEMORY_NEW(ctx.mem, List,
524
+ List_Ptr qq = SASS_MEMORY_NEW(List,
555
525
  m1->media_queries()->pstate(),
556
526
  m1->media_queries()->length(),
557
527
  SASS_COMMA);
558
528
 
559
529
  for (size_t i = 0, L = m1->media_queries()->length(); i < L; i++) {
560
530
  for (size_t j = 0, K = m2->media_queries()->length(); j < K; j++) {
561
- Media_Query* mq1 = static_cast<Media_Query*>((*m1->media_queries())[i]);
562
- Media_Query* mq2 = static_cast<Media_Query*>((*m2->media_queries())[j]);
563
- Media_Query* mq = merge_media_query(mq1, mq2);
564
-
565
- if (mq) *qq << mq;
531
+ Expression_Obj l1 = m1->media_queries()->at(i);
532
+ Expression_Obj l2 = m2->media_queries()->at(j);
533
+ Media_Query_Ptr mq1 = SASS_MEMORY_CAST(Media_Query, l1);
534
+ Media_Query_Ptr mq2 = SASS_MEMORY_CAST(Media_Query, l2);
535
+ Media_Query_Ptr mq = merge_media_query(mq1, mq2);
536
+ if (mq) qq->append(mq);
566
537
  }
567
538
  }
568
539
 
@@ -570,16 +541,16 @@ namespace Sass {
570
541
  }
571
542
 
572
543
 
573
- Media_Query* Cssize::merge_media_query(Media_Query* mq1, Media_Query* mq2)
544
+ Media_Query_Ptr Cssize::merge_media_query(Media_Query_Ptr mq1, Media_Query_Ptr mq2)
574
545
  {
575
546
 
576
547
  std::string type;
577
548
  std::string mod;
578
549
 
579
550
  std::string m1 = std::string(mq1->is_restricted() ? "only" : mq1->is_negated() ? "not" : "");
580
- std::string t1 = mq1->media_type() ? mq1->media_type()->to_string(ctx.c_options) : "";
551
+ std::string t1 = &mq1->media_type() ? mq1->media_type()->to_string(ctx.c_options) : "";
581
552
  std::string m2 = std::string(mq2->is_restricted() ? "only" : mq1->is_negated() ? "not" : "");
582
- std::string t2 = mq2->media_type() ? mq2->media_type()->to_string(ctx.c_options) : "";
553
+ std::string t2 = &mq2->media_type() ? mq2->media_type()->to_string(ctx.c_options) : "";
583
554
 
584
555
 
585
556
  if (t1.empty()) t1 = t2;
@@ -606,18 +577,19 @@ namespace Sass {
606
577
  mod = m1.empty() ? m2 : m1;
607
578
  }
608
579
 
609
- Media_Query* mm = SASS_MEMORY_NEW(ctx.mem, Media_Query,
580
+ Media_Query_Ptr mm = SASS_MEMORY_NEW(Media_Query,
610
581
 
611
582
  mq1->pstate(), 0,
612
583
  mq1->length() + mq2->length(), mod == "not", mod == "only"
613
584
  );
614
585
 
615
586
  if (!type.empty()) {
616
- mm->media_type(SASS_MEMORY_NEW(ctx.mem, String_Quoted, mq1->pstate(), type));
587
+ mm->media_type(SASS_MEMORY_NEW(String_Quoted, mq1->pstate(), type));
617
588
  }
618
589
 
619
- *mm += mq2;
620
- *mm += mq1;
590
+ mm->concat(mq2);
591
+ mm->concat(mq1);
592
+
621
593
  return mm;
622
594
  }
623
595
  }