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.
- checksums.yaml +4 -4
- data/.travis.yml +2 -2
- data/README.md +3 -2
- data/ext/libsass/Makefile.conf +2 -1
- data/ext/libsass/appveyor.yml +10 -5
- data/ext/libsass/docs/dev-ast-memory.md +223 -0
- data/ext/libsass/include/sass/base.h +2 -0
- data/ext/libsass/script/bootstrap +7 -4
- data/ext/libsass/script/ci-build-libsass +3 -3
- data/ext/libsass/script/ci-install-compiler +2 -0
- data/ext/libsass/script/ci-report-coverage +2 -1
- data/ext/libsass/script/test-leaks.pl +103 -0
- data/ext/libsass/src/ast.cpp +621 -495
- data/ext/libsass/src/ast.hpp +801 -367
- data/ext/libsass/src/ast_def_macros.hpp +5 -5
- data/ext/libsass/src/ast_fwd_decl.hpp +312 -14
- data/ext/libsass/src/bind.cpp +54 -51
- data/ext/libsass/src/bind.hpp +3 -7
- data/ext/libsass/src/check_nesting.cpp +117 -120
- data/ext/libsass/src/check_nesting.hpp +38 -34
- data/ext/libsass/src/color_maps.cpp +3 -3
- data/ext/libsass/src/color_maps.hpp +3 -3
- data/ext/libsass/src/context.cpp +33 -34
- data/ext/libsass/src/context.hpp +12 -14
- data/ext/libsass/src/cssize.cpp +200 -228
- data/ext/libsass/src/cssize.hpp +49 -49
- data/ext/libsass/src/debugger.hpp +260 -241
- data/ext/libsass/src/emitter.cpp +6 -6
- data/ext/libsass/src/emitter.hpp +7 -7
- data/ext/libsass/src/environment.cpp +2 -2
- data/ext/libsass/src/environment.hpp +0 -2
- data/ext/libsass/src/error_handling.cpp +5 -5
- data/ext/libsass/src/error_handling.hpp +12 -12
- data/ext/libsass/src/eval.cpp +412 -401
- data/ext/libsass/src/eval.hpp +61 -62
- data/ext/libsass/src/expand.cpp +223 -204
- data/ext/libsass/src/expand.hpp +42 -42
- data/ext/libsass/src/extend.cpp +198 -201
- data/ext/libsass/src/extend.hpp +12 -14
- data/ext/libsass/src/file.hpp +4 -5
- data/ext/libsass/src/functions.cpp +413 -418
- data/ext/libsass/src/functions.hpp +7 -10
- data/ext/libsass/src/inspect.cpp +115 -109
- data/ext/libsass/src/inspect.hpp +69 -69
- data/ext/libsass/src/listize.cpp +31 -33
- data/ext/libsass/src/listize.hpp +8 -10
- data/ext/libsass/src/memory/SharedPtr.cpp +116 -0
- data/ext/libsass/src/memory/SharedPtr.hpp +202 -0
- data/ext/libsass/src/node.cpp +45 -43
- data/ext/libsass/src/node.hpp +15 -15
- data/ext/libsass/src/operation.hpp +136 -136
- data/ext/libsass/src/output.cpp +48 -49
- data/ext/libsass/src/output.hpp +14 -14
- data/ext/libsass/src/parser.cpp +530 -554
- data/ext/libsass/src/parser.hpp +91 -96
- data/ext/libsass/src/prelexer.cpp +13 -10
- data/ext/libsass/src/remove_placeholders.cpp +25 -21
- data/ext/libsass/src/remove_placeholders.hpp +7 -7
- data/ext/libsass/src/sass2scss.cpp +2 -1
- data/ext/libsass/src/sass_context.cpp +125 -107
- data/ext/libsass/src/sass_context.hpp +1 -1
- data/ext/libsass/src/sass_util.hpp +5 -5
- data/ext/libsass/src/sass_values.cpp +27 -27
- data/ext/libsass/src/source_map.cpp +2 -2
- data/ext/libsass/src/source_map.hpp +2 -2
- data/ext/libsass/src/subset_map.cpp +57 -0
- data/ext/libsass/src/subset_map.hpp +8 -76
- data/ext/libsass/src/to_c.cpp +13 -13
- data/ext/libsass/src/to_c.hpp +14 -14
- data/ext/libsass/src/to_value.cpp +20 -20
- data/ext/libsass/src/to_value.hpp +20 -21
- data/ext/libsass/src/util.cpp +55 -88
- data/ext/libsass/src/util.hpp +9 -13
- data/ext/libsass/src/values.cpp +27 -26
- data/ext/libsass/src/values.hpp +2 -2
- data/ext/libsass/test/test_subset_map.cpp +69 -69
- data/ext/libsass/win/libsass.targets +3 -2
- data/ext/libsass/win/libsass.vcxproj.filters +9 -6
- data/lib/sassc/version.rb +1 -1
- data/sassc.gemspec +0 -1
- data/test/native_test.rb +1 -1
- metadata +7 -5
- data/ext/libsass/src/ast_factory.hpp +0 -92
- data/ext/libsass/src/memory_manager.cpp +0 -77
- data/ext/libsass/src/memory_manager.hpp +0 -48
data/ext/libsass/src/inspect.hpp
CHANGED
@@ -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(
|
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()(
|
25
|
-
virtual void operator()(
|
26
|
-
virtual void operator()(
|
27
|
-
virtual void operator()(
|
28
|
-
virtual void operator()(
|
29
|
-
virtual void operator()(
|
30
|
-
virtual void operator()(
|
31
|
-
virtual void operator()(
|
32
|
-
virtual void operator()(
|
33
|
-
virtual void operator()(
|
34
|
-
virtual void operator()(
|
35
|
-
virtual void operator()(
|
36
|
-
virtual void operator()(
|
37
|
-
virtual void operator()(
|
38
|
-
virtual void operator()(
|
39
|
-
virtual void operator()(
|
40
|
-
virtual void operator()(
|
41
|
-
virtual void operator()(
|
42
|
-
virtual void operator()(
|
43
|
-
virtual void operator()(
|
44
|
-
virtual void operator()(
|
45
|
-
virtual void operator()(
|
46
|
-
virtual void operator()(
|
47
|
-
virtual void operator()(
|
48
|
-
virtual void operator()(
|
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()(
|
51
|
-
virtual void operator()(
|
52
|
-
virtual void operator()(
|
53
|
-
virtual void operator()(
|
54
|
-
virtual void operator()(
|
55
|
-
virtual void operator()(
|
56
|
-
// virtual void operator()(
|
57
|
-
// virtual void operator()(
|
58
|
-
virtual void operator()(
|
59
|
-
virtual void operator()(
|
60
|
-
virtual void operator()(
|
61
|
-
virtual void operator()(
|
62
|
-
virtual void operator()(
|
63
|
-
virtual void operator()(
|
64
|
-
virtual void operator()(
|
65
|
-
virtual void operator()(
|
66
|
-
virtual void operator()(
|
67
|
-
virtual void operator()(
|
68
|
-
virtual void operator()(
|
69
|
-
virtual void operator()(
|
70
|
-
virtual void operator()(
|
71
|
-
virtual void operator()(
|
72
|
-
virtual void operator()(
|
73
|
-
virtual void operator()(
|
74
|
-
virtual void operator()(
|
75
|
-
virtual void operator()(
|
76
|
-
virtual void operator()(
|
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()(
|
79
|
-
virtual void operator()(
|
80
|
-
virtual void operator()(
|
81
|
-
virtual void operator()(
|
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()(
|
84
|
-
virtual void operator()(
|
85
|
-
virtual void operator()(
|
86
|
-
virtual void operator()(
|
87
|
-
virtual void operator()(
|
88
|
-
virtual void operator()(
|
89
|
-
virtual void operator()(
|
90
|
-
virtual void operator()(
|
91
|
-
virtual void operator()(
|
92
|
-
virtual void operator()(
|
93
|
-
virtual void operator()(
|
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<
|
96
|
+
// void fallback(U x) { fallback_impl(reinterpret_cast<AST_Node_Ptr>(x)); }
|
97
97
|
};
|
98
98
|
|
99
99
|
}
|
data/ext/libsass/src/listize.cpp
CHANGED
@@ -10,78 +10,76 @@
|
|
10
10
|
|
11
11
|
namespace Sass {
|
12
12
|
|
13
|
-
Listize::Listize(
|
14
|
-
: mem(mem)
|
13
|
+
Listize::Listize()
|
15
14
|
{ }
|
16
15
|
|
17
|
-
|
16
|
+
Expression_Ptr Listize::operator()(Selector_List_Ptr sel)
|
18
17
|
{
|
19
|
-
|
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 (!(
|
23
|
-
|
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(
|
24
|
+
if (l->length()) return l.detach();
|
25
|
+
return SASS_MEMORY_NEW(Null, l->pstate());
|
27
26
|
}
|
28
27
|
|
29
|
-
|
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
|
-
|
32
|
+
Expression_Ptr e = (*sel)[i]->perform(this);
|
34
33
|
if (e) str += e->to_string();
|
35
34
|
}
|
36
|
-
return SASS_MEMORY_NEW(
|
35
|
+
return SASS_MEMORY_NEW(String_Quoted, sel->pstate(), str);
|
37
36
|
}
|
38
37
|
|
39
|
-
|
38
|
+
Expression_Ptr Listize::operator()(Complex_Selector_Ptr sel)
|
40
39
|
{
|
41
|
-
|
40
|
+
List_Obj l = SASS_MEMORY_NEW(List, sel->pstate(), 2);
|
42
41
|
l->from_selector(true);
|
43
|
-
|
42
|
+
Compound_Selector_Obj head = sel->head();
|
44
43
|
if (head && !head->is_empty_reference())
|
45
44
|
{
|
46
|
-
|
47
|
-
if (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
|
55
|
-
|
53
|
+
case Complex_Selector::PARENT_OF:
|
54
|
+
l->append(SASS_MEMORY_NEW(String_Quoted, sel->pstate(), ">"));
|
56
55
|
break;
|
57
|
-
case
|
58
|
-
|
56
|
+
case Complex_Selector::ADJACENT_TO:
|
57
|
+
l->append(SASS_MEMORY_NEW(String_Quoted, sel->pstate(), "+"));
|
59
58
|
break;
|
60
|
-
case
|
61
|
-
|
59
|
+
case Complex_Selector::REFERENCE:
|
60
|
+
l->append(SASS_MEMORY_NEW(String_Quoted, sel->pstate(), "/" + reference + "/"));
|
62
61
|
break;
|
63
|
-
case
|
64
|
-
|
62
|
+
case Complex_Selector::PRECEDES:
|
63
|
+
l->append(SASS_MEMORY_NEW(String_Quoted, sel->pstate(), "~"));
|
65
64
|
break;
|
66
|
-
case
|
65
|
+
case Complex_Selector::ANCESTOR_OF:
|
67
66
|
break;
|
68
67
|
}
|
69
68
|
|
70
|
-
|
69
|
+
Complex_Selector_Obj tail = sel->tail();
|
71
70
|
if (tail)
|
72
71
|
{
|
73
|
-
|
74
|
-
if (
|
75
|
-
{
|
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
|
-
|
80
|
+
Expression_Ptr Listize::fallback_impl(AST_Node_Ptr n)
|
83
81
|
{
|
84
|
-
return dynamic_cast<
|
82
|
+
return dynamic_cast<Expression_Ptr>(n);
|
85
83
|
}
|
86
84
|
|
87
85
|
}
|
data/ext/libsass/src/listize.hpp
CHANGED
@@ -11,25 +11,23 @@
|
|
11
11
|
|
12
12
|
namespace Sass {
|
13
13
|
|
14
|
-
typedef Environment<
|
14
|
+
typedef Environment<AST_Node_Obj> Env;
|
15
15
|
struct Backtrace;
|
16
16
|
|
17
|
-
class Listize : public Operation_CRTP<
|
17
|
+
class Listize : public Operation_CRTP<Expression_Ptr, Listize> {
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
Expression* fallback_impl(AST_Node* n);
|
19
|
+
Expression_Ptr fallback_impl(AST_Node_Ptr n);
|
22
20
|
|
23
21
|
public:
|
24
|
-
Listize(
|
22
|
+
Listize();
|
25
23
|
~Listize() { }
|
26
24
|
|
27
|
-
|
28
|
-
|
29
|
-
|
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
|
-
|
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
|