sassc 1.11.1 → 1.11.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|