git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
C++: fix some BDW GC issues
cab7795Andy Arvanitis
pcc/runtime/purescript.hh+5−4
@@ -117,7 +117,7 @@ class any {
117 using data = std::array<const any, N>;
117 using data = std::array<const any, N>;
118
118
119 using array = std::deque<any WITH_ALLOCATOR(any)>;
119 using array = std::deque<any WITH_ALLOCATOR(any)>;
120− using record = std::unordered_map<std::string, any WITH_ALLOCATOR(any)>;
120+ using record = std::unordered_map<std::string, any WITH_ALLOCATOR_PAIR(std::string, any)>;
121
121
122 using fn = auto (*)(const any&) -> any;
122 using fn = auto (*)(const any&) -> any;
123 using eff_fn = auto (*)() -> any;
123 using eff_fn = auto (*)() -> any;
@@ -188,9 +188,9 @@ class any {
188 template <typename T, typename = typename std::enable_if<std::is_same<bool,T>::value>::type>
188 template <typename T, typename = typename std::enable_if<std::is_same<bool,T>::value>::type>
189 any(const T val) noexcept : tag(Tag::Boolean), b(val) {}
189 any(const T val) noexcept : tag(Tag::Boolean), b(val) {}
190
190
191− any(const char * val) : tag(Tag::String), s(make_managed<string>(val)) {}
191+ any(const char * val) : tag(Tag::String), s(make_managed_and_finalized<string>(val)) {}
192− any(const string& val) : tag(Tag::String), s(make_managed<string>(val)) {}
192+ any(const string& val) : tag(Tag::String), s(make_managed_and_finalized<string>(val)) {}
193− any(string&& val) noexcept : tag(Tag::String), s(make_managed<string>(std::move(val))) {}
193+ any(string&& val) noexcept : tag(Tag::String), s(make_managed_and_finalized<string>(std::move(val))) {}
194
194
195 any(const managed<string>& val) noexcept : tag(Tag::String), s(val) {}
195 any(const managed<string>& val) noexcept : tag(Tag::String), s(val) {}
196 any(managed<string>&& val) noexcept : tag(Tag::String), s(std::move(val)) {}
196 any(managed<string>&& val) noexcept : tag(Tag::String), s(std::move(val)) {}
@@ -576,6 +576,7 @@ namespace data {
576} // namespace PureScript
576} // namespace PureScript
577
577
578#undef WITH_ALLOCATOR
578#undef WITH_ALLOCATOR
579+#undef WITH_ALLOCATOR_PAIR
579#undef IS_POINTER_TYPE
580#undef IS_POINTER_TYPE
580#undef DEFINE_OPERATOR
581#undef DEFINE_OPERATOR
581#undef DEFINE_COMPARISON_OPERATOR
582#undef DEFINE_COMPARISON_OPERATOR
pcc/runtime/purescript_memory.hh+3−1
@@ -20,15 +20,17 @@
20 #include <gc/gc_cpp.h>
20 #include <gc/gc_cpp.h>
21 #include <gc/gc_allocator.h>
21 #include <gc/gc_allocator.h>
22 #define WITH_ALLOCATOR(T) , gc_allocator<T>
22 #define WITH_ALLOCATOR(T) , gc_allocator<T>
23+ #define WITH_ALLOCATOR_PAIR(T, U) , std::hash<T>, std::equal_to<T>, gc_allocator<std::pair<const T, U>>
23 #define MANAGED_TYPE(T) T*
24 #define MANAGED_TYPE(T) T*
24 #define MAKE_MANAGED(T) new (GC) T
25 #define MAKE_MANAGED(T) new (GC) T
25− #define MAKE_MANAGED_FINALIZED(T) new (GC, [](void* p, void*){ static_cast<T*>(p)->~T(); }) T
26+ #define MAKE_MANAGED_FINALIZED(T) new (PointerFreeGC, [](void* p, void*){ static_cast<T*>(p)->~T(); }) T
26 #define IS_POINTER_TYPE(T) std::is_pointer<T>
27 #define IS_POINTER_TYPE(T) std::is_pointer<T>
27 #define POINTER_FROM_MEMBER(P) P
28 #define POINTER_FROM_MEMBER(P) P
28 #define INITIALIZE_GC() GC_INIT()
29 #define INITIALIZE_GC() GC_INIT()
29#else
30#else
30 #include <memory>
31 #include <memory>
31 #define WITH_ALLOCATOR(_)
32 #define WITH_ALLOCATOR(_)
33+ #define WITH_ALLOCATOR_PAIR(...)
32 #define MANAGED_TYPE(T) std::shared_ptr<T>
34 #define MANAGED_TYPE(T) std::shared_ptr<T>
33 #define MAKE_MANAGED(T) std::make_shared<T>
35 #define MAKE_MANAGED(T) std::make_shared<T>
34 #define MAKE_MANAGED_FINALIZED(T) MAKE_MANAGED(T)
36 #define MAKE_MANAGED_FINALIZED(T) MAKE_MANAGED(T)