git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
C++: fix some BDW GC issues
commitcab77958df9835743078a4f8005f47f40b4e17c8 authorAndy Arvanitis <andyarvanitis@gmail.com> dateMon 30 Jan 2017, 16:14 (10 years ago) parent5be20b7
2 files changed+8−5
pcc/runtime/purescript.hh+5−4 pcc/runtime/purescript_memory.hh+3−1
pcc/runtime/purescript.hh+5−4
@@ -117,7 +117,7 @@ class any {
117117 using data = std::array<const any, N>;
118118
119119 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)>;
121121
122122 using fn = auto (*)(const any&) -> any;
123123 using eff_fn = auto (*)() -> any;
@@ -188,9 +188,9 @@ class any {
188188 template <typename T, typename = typename std::enable_if<std::is_same<bool,T>::value>::type>
189189 any(const T val) noexcept : tag(Tag::Boolean), b(val) {}
190190
191− any(const char * val) : tag(Tag::String), s(make_managed<string>(val)) {}
192− any(const string& val) : tag(Tag::String), s(make_managed<string>(val)) {}
193− any(string&& val) noexcept : tag(Tag::String), s(make_managed<string>(std::move(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_and_finalized<string>(val)) {}
193+ any(string&& val) noexcept : tag(Tag::String), s(make_managed_and_finalized<string>(std::move(val))) {}
194194
195195 any(const managed<string>& val) noexcept : tag(Tag::String), s(val) {}
196196 any(managed<string>&& val) noexcept : tag(Tag::String), s(std::move(val)) {}
@@ -576,6 +576,7 @@ namespace data {
576576} // namespace PureScript
577577
578578#undef WITH_ALLOCATOR
579+#undef WITH_ALLOCATOR_PAIR
579580#undef IS_POINTER_TYPE
580581#undef DEFINE_OPERATOR
581582#undef DEFINE_COMPARISON_OPERATOR
pcc/runtime/purescript_memory.hh+3−1
@@ -20,15 +20,17 @@
2020 #include <gc/gc_cpp.h>
2121 #include <gc/gc_allocator.h>
2222 #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>>
2324 #define MANAGED_TYPE(T) T*
2425 #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
2627 #define IS_POINTER_TYPE(T) std::is_pointer<T>
2728 #define POINTER_FROM_MEMBER(P) P
2829 #define INITIALIZE_GC() GC_INIT()
2930#else
3031 #include <memory>
3132 #define WITH_ALLOCATOR(_)
33+ #define WITH_ALLOCATOR_PAIR(...)
3234 #define MANAGED_TYPE(T) std::shared_ptr<T>
3335 #define MAKE_MANAGED(T) std::make_shared<T>
3436 #define MAKE_MANAGED_FINALIZED(T) MAKE_MANAGED(T)