git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
C++: runtime cleanup
f010163Andy Arvanitis
pcc/include/purescript.cc+56−33
@@ -16,41 +16,64 @@
16
16
17namespace PureScript {
17namespace PureScript {
18
18
19+#define copy_data(src) \
20+ type = src.type; \
21+ switch (type) { \
22+ case Type::Integer: i = src.i; break; \
23+ case Type::Double: d = src.d; break; \
24+ case Type::Character: c = src.c; break; \
25+ case Type::Boolean: b = src.b; break; \
26+ case Type::String: new (&s) shared<string> (src.s); break; \
27+ case Type::Map: new (&m) shared<map> (src.m); break; \
28+ case Type::Vector: new (&v) shared<vector> (src.v); break; \
29+ case Type::Function: new (&f) shared<fn> (src.f); break; \
30+ case Type::EffFunction: new (&e) shared<eff_fn> (src.e); break; \
31+ case Type::Thunk: new (&t) shared<thunk> (src.t); break; \
32+ case Type::Pointer: new (&p) shared<void> (src.p); break; \
33+ \
34+ default: assert(false && "Unsupported type in copy"); \
35+ }
36+
37+#define move_data(src) \
38+ type = src.type; \
39+ switch (type) { \
40+ case Type::Integer: i = src.i; break; \
41+ case Type::Double: d = src.d; break; \
42+ case Type::Character: c = src.c; break; \
43+ case Type::Boolean: b = src.b; break; \
44+ case Type::String: new (&s) shared<string> (std::move(src.s)); break; \
45+ case Type::Map: new (&m) shared<map> (std::move(src.m)); break; \
46+ case Type::Vector: new (&v) shared<vector> (std::move(src.v)); break; \
47+ case Type::Function: new (&f) shared<fn> (std::move(src.f)); break; \
48+ case Type::EffFunction: new (&e) shared<eff_fn> (std::move(src.e)); break; \
49+ case Type::Thunk: new (&t) shared<thunk> (std::move(src.t)); break; \
50+ case Type::Pointer: new (&p) shared<void> (std::move(src.p)); break; \
51+ \
52+ default: assert(false && "Unsupported type in move"); \
53+ }
54+
19−any::any(const any& val) : type(val.type) {
55+any::any(const any& other) {
20− switch (type) {
56+ copy_data(other);
21− case Type::Integer: i = val.i; break;
22− case Type::Double: d = val.d; break;
23− case Type::Character: c = val.c; break;
24− case Type::Boolean: b = val.b; break;
25− case Type::String: new (&s) shared<string> (val.s); break;
26− case Type::Map: new (&m) shared<map> (val.m); break;
27− case Type::Vector: new (&v) shared<vector> (val.v); break;
28− case Type::Function: new (&f) shared<fn> (val.f); break;
29− case Type::EffFunction: new (&e) shared<eff_fn> (val.e); break;
30− case Type::Thunk: new (&t) shared<thunk> (val.t); break;
31− case Type::Pointer: new (&p) shared<void> (val.p); break;
32−
33− default: assert(false && "Unsupported type in copy ctor");
34− }
35}
57}
36
58
37−void any::swap(any&& val) const {
59+any::any(any&& other) {
38− type = val.type;
60+ move_data(other);
39− switch (type) {
61+}
40− case Type::Integer: i = val.i; break;
62+
41− case Type::Double: d = val.d; break;
63+auto any::operator=(const any& rhs) -> any& {
42− case Type::Character: c = val.c; break;
64+ copy_data(rhs);
43− case Type::Boolean: b = val.b; break;
65+ return *this;
44− case Type::String: new (&s) shared<string> (std::move(val.s)); break;
66+}
45− case Type::Map: new (&m) shared<map> (std::move(val.m)); break;
67+
46− case Type::Vector: new (&v) shared<vector> (std::move(val.v)); break;
68+// Takes ownership -- might need to reconsider this
47− case Type::Function: new (&f) shared<fn> (std::move(val.f)); break;
69+auto any::operator=(any& rhs) -> any& {
48− case Type::EffFunction: new (&e) shared<eff_fn> (std::move(val.e)); break;
70+ move_data(rhs);
49− case Type::Thunk: new (&t) shared<thunk> (std::move(val.t)); break;
71+ return *this;
50− case Type::Pointer: new (&p) shared<void> (std::move(val.p)); break;
72+}
51−
73+
52− default: assert(false && "Unsupported type in move ctor");
74+auto any::operator=(any&& rhs) -> any& {
53− }
75+ move_data(rhs);
76+ return *this;
54}
77}
55
78
56any::~any() {
79any::~any() {
pcc/include/purescript.hh+5−11
@@ -46,7 +46,7 @@ const bool undefined = false;
46class any {
46class any {
47
47
48 public:
48 public:
49− enum class Type : std::int8_t {
49+ enum class Type {
50 Unknown,
50 Unknown,
51 Integer,
51 Integer,
52 Double,
52 Double,
@@ -175,17 +175,11 @@ class any {
175 : type(Type::Pointer), p(std::move(val)) {}
175 : type(Type::Pointer), p(std::move(val)) {}
176
176
177 any(const any&);
177 any(const any&);
178+ any(any&&);
178
179
179− void swap(any&&) const;
180+ auto operator=(const any&) -> any&;
180−
181− any(any&& val) {
182− swap(std::move(val));
183− }
184−
185− auto operator=(any val) -> any& {
181+ auto operator=(any&) -> any&;
186− swap(std::move(val));
182+ auto operator=(any&&) -> any&;
187− return *this;
188− }
189
183
190 any() = delete;
184 any() = delete;
191 ~any();
185 ~any();