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
@@ -13,7 +13,7 @@ namespace Sass {
13
13
  // import all the class-specific methods and override as desired
14
14
  using Operation_CRTP<void, Inspect>::operator();
15
15
 
16
- void fallback_impl(AST_Node* n);
16
+ void fallback_impl(AST_Node_Ptr n);
17
17
 
18
18
  public:
19
19
 
@@ -21,79 +21,79 @@ namespace Sass {
21
21
  virtual ~Inspect();
22
22
 
23
23
  // statements
24
- virtual void operator()(Block*);
25
- virtual void operator()(Ruleset*);
26
- virtual void operator()(Bubble*);
27
- virtual void operator()(Supports_Block*);
28
- virtual void operator()(Media_Block*);
29
- virtual void operator()(At_Root_Block*);
30
- virtual void operator()(Directive*);
31
- virtual void operator()(Keyframe_Rule*);
32
- virtual void operator()(Declaration*);
33
- virtual void operator()(Assignment*);
34
- virtual void operator()(Import*);
35
- virtual void operator()(Import_Stub*);
36
- virtual void operator()(Warning*);
37
- virtual void operator()(Error*);
38
- virtual void operator()(Debug*);
39
- virtual void operator()(Comment*);
40
- virtual void operator()(If*);
41
- virtual void operator()(For*);
42
- virtual void operator()(Each*);
43
- virtual void operator()(While*);
44
- virtual void operator()(Return*);
45
- virtual void operator()(Extension*);
46
- virtual void operator()(Definition*);
47
- virtual void operator()(Mixin_Call*);
48
- virtual void operator()(Content*);
24
+ virtual void operator()(Block_Ptr);
25
+ virtual void operator()(Ruleset_Ptr);
26
+ virtual void operator()(Bubble_Ptr);
27
+ virtual void operator()(Supports_Block_Ptr);
28
+ virtual void operator()(Media_Block_Ptr);
29
+ virtual void operator()(At_Root_Block_Ptr);
30
+ virtual void operator()(Directive_Ptr);
31
+ virtual void operator()(Keyframe_Rule_Ptr);
32
+ virtual void operator()(Declaration_Ptr);
33
+ virtual void operator()(Assignment_Ptr);
34
+ virtual void operator()(Import_Ptr);
35
+ virtual void operator()(Import_Stub_Ptr);
36
+ virtual void operator()(Warning_Ptr);
37
+ virtual void operator()(Error_Ptr);
38
+ virtual void operator()(Debug_Ptr);
39
+ virtual void operator()(Comment_Ptr);
40
+ virtual void operator()(If_Ptr);
41
+ virtual void operator()(For_Ptr);
42
+ virtual void operator()(Each_Ptr);
43
+ virtual void operator()(While_Ptr);
44
+ virtual void operator()(Return_Ptr);
45
+ virtual void operator()(Extension_Ptr);
46
+ virtual void operator()(Definition_Ptr);
47
+ virtual void operator()(Mixin_Call_Ptr);
48
+ virtual void operator()(Content_Ptr);
49
49
  // expressions
50
- virtual void operator()(Map*);
51
- virtual void operator()(List*);
52
- virtual void operator()(Binary_Expression*);
53
- virtual void operator()(Unary_Expression*);
54
- virtual void operator()(Function_Call*);
55
- virtual void operator()(Function_Call_Schema*);
56
- // virtual void operator()(Custom_Warning*);
57
- // virtual void operator()(Custom_Error*);
58
- virtual void operator()(Variable*);
59
- virtual void operator()(Textual*);
60
- virtual void operator()(Number*);
61
- virtual void operator()(Color*);
62
- virtual void operator()(Boolean*);
63
- virtual void operator()(String_Schema*);
64
- virtual void operator()(String_Constant*);
65
- virtual void operator()(String_Quoted*);
66
- virtual void operator()(Custom_Error*);
67
- virtual void operator()(Custom_Warning*);
68
- virtual void operator()(Supports_Operator*);
69
- virtual void operator()(Supports_Negation*);
70
- virtual void operator()(Supports_Declaration*);
71
- virtual void operator()(Supports_Interpolation*);
72
- virtual void operator()(Media_Query*);
73
- virtual void operator()(Media_Query_Expression*);
74
- virtual void operator()(At_Root_Query*);
75
- virtual void operator()(Null*);
76
- virtual void operator()(Parent_Selector* p);
50
+ virtual void operator()(Map_Ptr);
51
+ virtual void operator()(List_Ptr);
52
+ virtual void operator()(Binary_Expression_Ptr);
53
+ virtual void operator()(Unary_Expression_Ptr);
54
+ virtual void operator()(Function_Call_Ptr);
55
+ virtual void operator()(Function_Call_Schema_Ptr);
56
+ // virtual void operator()(Custom_Warning_Ptr);
57
+ // virtual void operator()(Custom_Error_Ptr);
58
+ virtual void operator()(Variable_Ptr);
59
+ virtual void operator()(Textual_Ptr);
60
+ virtual void operator()(Number_Ptr);
61
+ virtual void operator()(Color_Ptr);
62
+ virtual void operator()(Boolean_Ptr);
63
+ virtual void operator()(String_Schema_Ptr);
64
+ virtual void operator()(String_Constant_Ptr);
65
+ virtual void operator()(String_Quoted_Ptr);
66
+ virtual void operator()(Custom_Error_Ptr);
67
+ virtual void operator()(Custom_Warning_Ptr);
68
+ virtual void operator()(Supports_Operator_Ptr);
69
+ virtual void operator()(Supports_Negation_Ptr);
70
+ virtual void operator()(Supports_Declaration_Ptr);
71
+ virtual void operator()(Supports_Interpolation_Ptr);
72
+ virtual void operator()(Media_Query_Ptr);
73
+ virtual void operator()(Media_Query_Expression_Ptr);
74
+ virtual void operator()(At_Root_Query_Ptr);
75
+ virtual void operator()(Null_Ptr);
76
+ virtual void operator()(Parent_Selector_Ptr p);
77
77
  // parameters and arguments
78
- virtual void operator()(Parameter*);
79
- virtual void operator()(Parameters*);
80
- virtual void operator()(Argument*);
81
- virtual void operator()(Arguments*);
78
+ virtual void operator()(Parameter_Ptr);
79
+ virtual void operator()(Parameters_Ptr);
80
+ virtual void operator()(Argument_Ptr);
81
+ virtual void operator()(Arguments_Ptr);
82
82
  // selectors
83
- virtual void operator()(Selector_Schema*);
84
- virtual void operator()(Placeholder_Selector*);
85
- virtual void operator()(Element_Selector*);
86
- virtual void operator()(Class_Selector*);
87
- virtual void operator()(Id_Selector*);
88
- virtual void operator()(Attribute_Selector*);
89
- virtual void operator()(Pseudo_Selector*);
90
- virtual void operator()(Wrapped_Selector*);
91
- virtual void operator()(SimpleSequence_Selector*);
92
- virtual void operator()(Sequence_Selector*);
93
- virtual void operator()(CommaSequence_Selector*);
83
+ virtual void operator()(Selector_Schema_Ptr);
84
+ virtual void operator()(Placeholder_Selector_Ptr);
85
+ virtual void operator()(Element_Selector_Ptr);
86
+ virtual void operator()(Class_Selector_Ptr);
87
+ virtual void operator()(Id_Selector_Ptr);
88
+ virtual void operator()(Attribute_Selector_Ptr);
89
+ virtual void operator()(Pseudo_Selector_Ptr);
90
+ virtual void operator()(Wrapped_Selector_Ptr);
91
+ virtual void operator()(Compound_Selector_Ptr);
92
+ virtual void operator()(Complex_Selector_Ptr);
93
+ virtual void operator()(Selector_List_Ptr);
94
94
 
95
95
  // template <typename U>
96
- // void fallback(U x) { fallback_impl(reinterpret_cast<AST_Node*>(x)); }
96
+ // void fallback(U x) { fallback_impl(reinterpret_cast<AST_Node_Ptr>(x)); }
97
97
  };
98
98
 
99
99
  }
@@ -10,78 +10,76 @@
10
10
 
11
11
  namespace Sass {
12
12
 
13
- Listize::Listize(Memory_Manager& mem)
14
- : mem(mem)
13
+ Listize::Listize()
15
14
  { }
16
15
 
17
- Expression* Listize::operator()(CommaSequence_Selector* sel)
16
+ Expression_Ptr Listize::operator()(Selector_List_Ptr sel)
18
17
  {
19
- List* l = SASS_MEMORY_NEW(mem, List, sel->pstate(), sel->length(), SASS_COMMA);
18
+ List_Obj l = SASS_MEMORY_NEW(List, sel->pstate(), sel->length(), SASS_COMMA);
20
19
  l->from_selector(true);
21
20
  for (size_t i = 0, L = sel->length(); i < L; ++i) {
22
- if (!(*sel)[i]) continue;
23
- *l << (*sel)[i]->perform(this);
21
+ if (!sel->at(i)) continue;
22
+ l->append(sel->at(i)->perform(this));
24
23
  }
25
- if (l->length()) return l;
26
- return SASS_MEMORY_NEW(mem, Null, l->pstate());
24
+ if (l->length()) return l.detach();
25
+ return SASS_MEMORY_NEW(Null, l->pstate());
27
26
  }
28
27
 
29
- Expression* Listize::operator()(SimpleSequence_Selector* sel)
28
+ Expression_Ptr Listize::operator()(Compound_Selector_Ptr sel)
30
29
  {
31
30
  std::string str;
32
31
  for (size_t i = 0, L = sel->length(); i < L; ++i) {
33
- Expression* e = (*sel)[i]->perform(this);
32
+ Expression_Ptr e = (*sel)[i]->perform(this);
34
33
  if (e) str += e->to_string();
35
34
  }
36
- return SASS_MEMORY_NEW(mem, String_Quoted, sel->pstate(), str);
35
+ return SASS_MEMORY_NEW(String_Quoted, sel->pstate(), str);
37
36
  }
38
37
 
39
- Expression* Listize::operator()(Sequence_Selector* sel)
38
+ Expression_Ptr Listize::operator()(Complex_Selector_Ptr sel)
40
39
  {
41
- List* l = SASS_MEMORY_NEW(mem, List, sel->pstate(), 2);
40
+ List_Obj l = SASS_MEMORY_NEW(List, sel->pstate(), 2);
42
41
  l->from_selector(true);
43
- SimpleSequence_Selector* head = sel->head();
42
+ Compound_Selector_Obj head = sel->head();
44
43
  if (head && !head->is_empty_reference())
45
44
  {
46
- Expression* hh = head->perform(this);
47
- if (hh) *l << hh;
45
+ Expression_Ptr hh = head->perform(this);
46
+ if (hh) l->append(hh);
48
47
  }
49
48
 
50
49
  std::string reference = ! sel->reference() ? ""
51
50
  : sel->reference()->to_string();
52
51
  switch(sel->combinator())
53
52
  {
54
- case Sequence_Selector::PARENT_OF:
55
- *l << SASS_MEMORY_NEW(mem, String_Quoted, sel->pstate(), ">");
53
+ case Complex_Selector::PARENT_OF:
54
+ l->append(SASS_MEMORY_NEW(String_Quoted, sel->pstate(), ">"));
56
55
  break;
57
- case Sequence_Selector::ADJACENT_TO:
58
- *l << SASS_MEMORY_NEW(mem, String_Quoted, sel->pstate(), "+");
56
+ case Complex_Selector::ADJACENT_TO:
57
+ l->append(SASS_MEMORY_NEW(String_Quoted, sel->pstate(), "+"));
59
58
  break;
60
- case Sequence_Selector::REFERENCE:
61
- *l << SASS_MEMORY_NEW(mem, String_Quoted, sel->pstate(), "/" + reference + "/");
59
+ case Complex_Selector::REFERENCE:
60
+ l->append(SASS_MEMORY_NEW(String_Quoted, sel->pstate(), "/" + reference + "/"));
62
61
  break;
63
- case Sequence_Selector::PRECEDES:
64
- *l << SASS_MEMORY_NEW(mem, String_Quoted, sel->pstate(), "~");
62
+ case Complex_Selector::PRECEDES:
63
+ l->append(SASS_MEMORY_NEW(String_Quoted, sel->pstate(), "~"));
65
64
  break;
66
- case Sequence_Selector::ANCESTOR_OF:
65
+ case Complex_Selector::ANCESTOR_OF:
67
66
  break;
68
67
  }
69
68
 
70
- Sequence_Selector* tail = sel->tail();
69
+ Complex_Selector_Obj tail = sel->tail();
71
70
  if (tail)
72
71
  {
73
- Expression* tt = tail->perform(this);
74
- if (tt && tt->concrete_type() == Expression::LIST)
75
- { *l += static_cast<List*>(tt); }
76
- else if (tt) *l << static_cast<List*>(tt);
72
+ Expression_Obj tt = tail->perform(this);
73
+ if (List_Ptr ls = SASS_MEMORY_CAST(List, tt))
74
+ { l->concat(ls); }
77
75
  }
78
76
  if (l->length() == 0) return 0;
79
- return l;
77
+ return l.detach();
80
78
  }
81
79
 
82
- Expression* Listize::fallback_impl(AST_Node* n)
80
+ Expression_Ptr Listize::fallback_impl(AST_Node_Ptr n)
83
81
  {
84
- return dynamic_cast<Expression*>(n);
82
+ return dynamic_cast<Expression_Ptr>(n);
85
83
  }
86
84
 
87
85
  }
@@ -11,25 +11,23 @@
11
11
 
12
12
  namespace Sass {
13
13
 
14
- typedef Environment<AST_Node*> Env;
14
+ typedef Environment<AST_Node_Obj> Env;
15
15
  struct Backtrace;
16
16
 
17
- class Listize : public Operation_CRTP<Expression*, Listize> {
17
+ class Listize : public Operation_CRTP<Expression_Ptr, Listize> {
18
18
 
19
- Memory_Manager& mem;
20
-
21
- Expression* fallback_impl(AST_Node* n);
19
+ Expression_Ptr fallback_impl(AST_Node_Ptr n);
22
20
 
23
21
  public:
24
- Listize(Memory_Manager&);
22
+ Listize();
25
23
  ~Listize() { }
26
24
 
27
- Expression* operator()(CommaSequence_Selector*);
28
- Expression* operator()(Sequence_Selector*);
29
- Expression* operator()(SimpleSequence_Selector*);
25
+ Expression_Ptr operator()(Selector_List_Ptr);
26
+ Expression_Ptr operator()(Complex_Selector_Ptr);
27
+ Expression_Ptr operator()(Compound_Selector_Ptr);
30
28
 
31
29
  template <typename U>
32
- Expression* fallback(U x) { return fallback_impl(x); }
30
+ Expression_Ptr fallback(U x) { return fallback_impl(x); }
33
31
  };
34
32
 
35
33
  }
@@ -0,0 +1,116 @@
1
+ #include "../sass.hpp"
2
+ #include <iostream>
3
+ #include <typeinfo>
4
+
5
+ #include "SharedPtr.hpp"
6
+ #include "../ast_fwd_decl.hpp"
7
+
8
+ #ifdef DEBUG_SHARED_PTR
9
+ #include "../debugger.hpp"
10
+ #endif
11
+
12
+ namespace Sass {
13
+
14
+ #ifdef DEBUG_SHARED_PTR
15
+ void SharedObj::dumpMemLeaks() {
16
+ if (!all.empty()) {
17
+ std::cerr << "###################################\n";
18
+ std::cerr << "# REPORTING MISSING DEALLOCATIONS #\n";
19
+ std::cerr << "###################################\n";
20
+ for (auto var : all) {
21
+ if (AST_Node_Ptr ast = SASS_MEMORY_CAST_PTR(AST_Node, var)) {
22
+ debug_ast(ast);
23
+ } else {
24
+ std::cerr << "LEAKED " << var << "\n";
25
+ }
26
+ }
27
+ }
28
+ }
29
+ std::vector<SharedObj*> SharedObj::all;
30
+ #endif
31
+
32
+ bool SharedObj::taint = false;
33
+
34
+ SharedObj::SharedObj()
35
+ : detached(false)
36
+ #ifdef DEBUG_SHARED_PTR
37
+ , dbg(false)
38
+ #endif
39
+ {
40
+ refcounter = 0;
41
+ #ifdef DEBUG_SHARED_PTR
42
+ if (taint) all.push_back(this);
43
+ #endif
44
+ };
45
+
46
+ SharedObj::~SharedObj() {
47
+ #ifdef DEBUG_SHARED_PTR
48
+ if (dbg) std::cerr << "Destruct " << this << "\n";
49
+ if(!all.empty()) { // check needed for MSVC (no clue why?)
50
+ all.erase(std::remove(all.begin(), all.end(), this), all.end());
51
+ }
52
+ #endif
53
+ };
54
+
55
+
56
+
57
+ void SharedPtr::decRefCount() {
58
+ if (node) {
59
+ -- node->refcounter;
60
+ #ifdef DEBUG_SHARED_PTR
61
+ if (node->dbg) std::cerr << "- " << node << " X " << node->refcounter << " (" << this << ") " << "\n";
62
+ #endif
63
+ if (node->refcounter == 0) {
64
+ #ifdef DEBUG_SHARED_PTR
65
+ AST_Node_Ptr ptr = SASS_MEMORY_CAST_PTR(AST_Node, node);
66
+ if (node->dbg) std::cerr << "DELETE NODE " << node << "\n";
67
+ #endif
68
+ if (!node->detached) {
69
+ delete(node);
70
+ }
71
+ }
72
+ }
73
+ }
74
+
75
+ void SharedPtr::incRefCount() {
76
+ if (node) {
77
+ ++ node->refcounter;
78
+ node->detached = false;
79
+ #ifdef DEBUG_SHARED_PTR
80
+ if (node->dbg) {
81
+ std::cerr << "+ " << node << " X " << node->refcounter << " (" << this << ") " << "\n";
82
+ }
83
+ #endif
84
+ }
85
+ }
86
+
87
+ SharedPtr::~SharedPtr() {
88
+ decRefCount();
89
+ }
90
+
91
+
92
+ // the create constructor
93
+ SharedPtr::SharedPtr(SharedObj* ptr)
94
+ : node(ptr) {
95
+ incRefCount();
96
+ }
97
+ // copy assignment operator
98
+ SharedPtr& SharedPtr::operator=(const SharedPtr& rhs) {
99
+ void* cur_ptr = (void*) node;
100
+ void* rhs_ptr = (void*) rhs.node;
101
+ if (cur_ptr == rhs_ptr) {
102
+ return *this;
103
+ }
104
+ decRefCount();
105
+ node = rhs.node;
106
+ incRefCount();
107
+ return *this;
108
+ }
109
+
110
+ // the copy constructor
111
+ SharedPtr::SharedPtr(const SharedPtr& obj)
112
+ : node(obj.node) {
113
+ incRefCount();
114
+ }
115
+
116
+ }
@@ -0,0 +1,202 @@
1
+ #ifndef SASS_MEMORY_SHARED_PTR_H
2
+ #define SASS_MEMORY_SHARED_PTR_H
3
+
4
+ #include "sass/base.h"
5
+
6
+ #include <vector>
7
+
8
+ namespace Sass {
9
+
10
+ class SharedPtr;
11
+
12
+ ///////////////////////////////////////////////////////////////////////////////
13
+ // Use macros for the allocation task, since overloading operator `new`
14
+ // has been proven to be flaky under certain compilers (see comment below).
15
+ ///////////////////////////////////////////////////////////////////////////////
16
+
17
+ #ifdef DEBUG_SHARED_PTR
18
+
19
+ #define SASS_MEMORY_NEW(Class, ...) \
20
+ static_cast<Class##_Ptr>((new Class(__VA_ARGS__))->trace(__FILE__, __LINE__)) \
21
+
22
+ #define SASS_MEMORY_COPY(obj) \
23
+ ((obj)->copy(__FILE__, __LINE__)) \
24
+
25
+ #define SASS_MEMORY_CLONE(obj) \
26
+ ((obj)->clone(__FILE__, __LINE__)) \
27
+
28
+ #else
29
+
30
+ #define SASS_MEMORY_NEW(Class, ...) \
31
+ new Class(__VA_ARGS__) \
32
+
33
+ #define SASS_MEMORY_COPY(obj) \
34
+ ((obj)->copy()) \
35
+
36
+ #define SASS_MEMORY_CLONE(obj) \
37
+ ((obj)->clone()) \
38
+
39
+ #endif
40
+
41
+ #define SASS_MEMORY_CAST(Class, obj) \
42
+ (dynamic_cast<Class##_Ptr>(&obj)) \
43
+
44
+ #define SASS_MEMORY_CAST_PTR(Class, ptr) \
45
+ (dynamic_cast<Class##_Ptr>(ptr)) \
46
+
47
+ class SharedObj {
48
+ protected:
49
+ friend class SharedPtr;
50
+ friend class Memory_Manager;
51
+ #ifdef DEBUG_SHARED_PTR
52
+ static std::vector<SharedObj*> all;
53
+ std::string file;
54
+ size_t line;
55
+ #endif
56
+ static bool taint;
57
+ long refcounter;
58
+ // long refcount;
59
+ bool detached;
60
+ #ifdef DEBUG_SHARED_PTR
61
+ bool dbg;
62
+ #endif
63
+ public:
64
+ #ifdef DEBUG_SHARED_PTR
65
+ static void dumpMemLeaks();
66
+ SharedObj* trace(std::string file, size_t line) {
67
+ this->file = file;
68
+ this->line = line;
69
+ return this;
70
+ }
71
+ #endif
72
+ SharedObj();
73
+ #ifdef DEBUG_SHARED_PTR
74
+ std::string getDbgFile() {
75
+ return file;
76
+ }
77
+ size_t getDbgLine() {
78
+ return line;
79
+ }
80
+ void setDbg(bool dbg) {
81
+ this->dbg = dbg;
82
+ }
83
+ #endif
84
+ static void setTaint(bool val) {
85
+ taint = val;
86
+ }
87
+ virtual ~SharedObj();
88
+ long getRefCount() {
89
+ return refcounter;
90
+ }
91
+ };
92
+
93
+
94
+ class SharedPtr {
95
+ private:
96
+ SharedObj* node;
97
+ private:
98
+ void decRefCount();
99
+ void incRefCount();
100
+ public:
101
+ // the empty constructor
102
+ SharedPtr()
103
+ : node(NULL) {};
104
+ // the create constructor
105
+ SharedPtr(SharedObj* ptr);
106
+ // copy assignment operator
107
+ SharedPtr& operator=(const SharedPtr& rhs);
108
+ // move assignment operator
109
+ /* SharedPtr& operator=(SharedPtr&& rhs); */
110
+ // the copy constructor
111
+ SharedPtr(const SharedPtr& obj);
112
+ // the move constructor
113
+ /* SharedPtr(SharedPtr&& obj); */
114
+ // destructor
115
+ ~SharedPtr();
116
+ public:
117
+ SharedObj* obj () {
118
+ return node;
119
+ };
120
+ SharedObj* obj () const {
121
+ return node;
122
+ };
123
+ SharedObj* operator-> () {
124
+ return node;
125
+ };
126
+ bool isNull () {
127
+ return node == NULL;
128
+ };
129
+ bool isNull () const {
130
+ return node == NULL;
131
+ };
132
+ SharedObj* detach() {
133
+ node->detached = true;
134
+ return node;
135
+ };
136
+ SharedObj* detach() const {
137
+ if (node) {
138
+ node->detached = true;
139
+ }
140
+ return node;
141
+ };
142
+ operator bool() {
143
+ return node != NULL;
144
+ };
145
+ operator bool() const {
146
+ return node != NULL;
147
+ };
148
+
149
+ };
150
+
151
+ template < typename T >
152
+ class SharedImpl : private SharedPtr {
153
+ public:
154
+ SharedImpl()
155
+ : SharedPtr(NULL) {};
156
+ SharedImpl(T* node)
157
+ : SharedPtr(node) {};
158
+ SharedImpl(T&& node)
159
+ : SharedPtr(node) {};
160
+ SharedImpl(const T& node)
161
+ : SharedPtr(node) {};
162
+ ~SharedImpl() {};
163
+ public:
164
+ T* operator& () {
165
+ return static_cast<T*>(this->obj());
166
+ };
167
+ T* operator& () const {
168
+ return static_cast<T*>(this->obj());
169
+ };
170
+ T& operator* () {
171
+ return *static_cast<T*>(this->obj());
172
+ };
173
+ T& operator* () const {
174
+ return *static_cast<T*>(this->obj());
175
+ };
176
+ T* operator-> () {
177
+ return static_cast<T*>(this->obj());
178
+ };
179
+ T* operator-> () const {
180
+ return static_cast<T*>(this->obj());
181
+ };
182
+ T* ptr () {
183
+ return static_cast<T*>(this->obj());
184
+ };
185
+ T* detach() {
186
+ if (this->obj() == NULL) return NULL;
187
+ return static_cast<T*>(SharedPtr::detach());
188
+ }
189
+ bool isNull() {
190
+ return this->obj() == NULL;
191
+ }
192
+ operator bool() {
193
+ return this->obj() != NULL;
194
+ };
195
+ operator bool() const {
196
+ return this->obj() != NULL;
197
+ };
198
+ };
199
+
200
+ }
201
+
202
+ #endif