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