@@ -26,7 +26,8 @@ namespace PureScript {
26 case Type::String: new (&s) shared<string> (src.s); break; \
26 case Type::String: new (&s) shared<string> (src.s); break; \
27 case Type::Map: new (&m) shared<map> (src.m); break; \
27 case Type::Map: new (&m) shared<map> (src.m); break; \
28 case Type::Vector: new (&v) shared<vector> (src.v); break; \
28 case Type::Vector: new (&v) shared<vector> (src.v); break; \
29− case Type::Function: new (&f) shared<fn> (src.f); break; \
29+ case Type::Function: f = src.f; break; \
30+ case Type::Closure: new (&l) shared<closure> (src.l); break; \
30 case Type::EffFunction: new (&e) shared<eff_fn> (src.e); break; \
31 case Type::EffFunction: new (&e) shared<eff_fn> (src.e); break; \
31 case Type::Thunk: t = src.t; break; \
32 case Type::Thunk: t = src.t; break; \
32 case Type::Pointer: new (&p) shared<void> (src.p); break; \
33 case Type::Pointer: new (&p) shared<void> (src.p); break; \
@@ -44,7 +45,8 @@ namespace PureScript {
44 case Type::String: new (&s) shared<string> (std::move(src.s)); break; \
45 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::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::Vector: new (&v) shared<vector> (std::move(src.v)); break; \
48+ case Type::Function: f = src.f; break; \
47− case Type::Function: new (&f) shared<fn> (std::move(src.f)); break; \
49+ case Type::Closure: new (&l) shared<closure> (std::move(src.l)); break; \
48 case Type::EffFunction: new (&e) shared<eff_fn> (std::move(src.e)); break; \
50 case Type::EffFunction: new (&e) shared<eff_fn> (std::move(src.e)); break; \
49 case Type::Thunk: t = src.t; break; \
51 case Type::Thunk: t = src.t; break; \
50 case Type::Pointer: new (&p) shared<void> (std::move(src.p)); break; \
52 case Type::Pointer: new (&p) shared<void> (std::move(src.p)); break; \
@@ -86,7 +88,8 @@ any::~any() {
86 case Type::String: s.~shared<string>(); break;
88 case Type::String: s.~shared<string>(); break;
87 case Type::Map: m.~shared<map>(); break;
89 case Type::Map: m.~shared<map>(); break;
88 case Type::Vector: v.~shared<vector>(); break;
90 case Type::Vector: v.~shared<vector>(); break;
89− case Type::Function: f.~shared<fn>(); break;
91+ case Type::Function: ; break;
92+ case Type::Closure: l.~shared<closure>(); break;
90 case Type::EffFunction: e.~shared<eff_fn>(); break;
93 case Type::EffFunction: e.~shared<eff_fn>(); break;
91 case Type::Thunk: ; break;
94 case Type::Thunk: ; break;
92 case Type::Pointer: p.~shared<void>(); break;
95 case Type::Pointer: p.~shared<void>(); break;
@@ -163,6 +166,9 @@ any::~any() {
163 if (type == Type::Function) {
166 if (type == Type::Function) {
164 return (*f)(arg);
167 return (*f)(arg);
169+ if (type == Type::Closure) {
166 const any* valuePtr = this;
172 const any* valuePtr = this;
168 assert(valuePtr->type == Type::Thunk);
174 assert(valuePtr->type == Type::Thunk);
@@ -170,6 +176,9 @@ any::~any() {
170 if (value.type == Type::Function) {
176 if (value.type == Type::Function) {
171 return (*value.f)(arg);
177 return (*value.f)(arg);
179+ if (value.type == Type::Closure) {
180+ return (*value.l)(arg);
173 valuePtr = &value;
182 valuePtr = &value;
174 } while (valuePtr->type != Type::Unknown);
183 } while (valuePtr->type != Type::Unknown);
175 assert(false && "Unknown value type");
184 assert(false && "Unknown value type");