From 5ca7630c8cdc660b1f796fe55102e354c1f6a26a Mon Sep 17 00:00:00 2001 From: Konstantin Nazarov Date: Sat, 20 Jul 2024 22:56:45 +0100 Subject: [PATCH] Make a simple gc root actually work --- src/arena.hpp | 21 ++++++++++----------- src/vli.cpp | 6 ++++++ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/arena.hpp b/src/arena.hpp index c8b9ed4..6e9f66d 100644 --- a/src/arena.hpp +++ b/src/arena.hpp @@ -11,6 +11,7 @@ class GcRootList; class GcRootBase { public: + GcRootBase() : _ptr(0), _node(0){}; GcRootBase(PodObject* ptr, GcRootList* node); ~GcRootBase(); @@ -55,8 +56,8 @@ class GcRootList { void remove() { _prev = 0; _next = 0; - _prev->_next = _next; - _next->_prev = _prev; + if (_prev) _prev->_next = _next; + if (_next) _next->_prev = _prev; } void update(GcRootBase* root) { _root = root; } @@ -114,26 +115,22 @@ class Arena { }; template -class StaticArenaHeap { +class StaticArenaHeap : public ArenaHeap { public: - StaticArenaHeap() : _heap(_buf, heapsize) {} - - ArenaHeap* get() { return &_heap; } + StaticArenaHeap() : ArenaHeap(_buf, heapsize) {} private: static const uint64_t heapsize = size - sizeof(ArenaHeap); - ArenaHeap _heap; uint8_t _buf[heapsize]{0}; }; template -class StaticArena { +class StaticArena : public Arena { public: - StaticArena() : _arena(_heaps[0].get(), _heaps[1].get()) {} + StaticArena() : Arena(&_heaps[0], &_heaps[1]) {} private: StaticArenaHeap<(size - sizeof(Arena)) / 2> _heaps[2]; - Arena _arena; }; template @@ -141,11 +138,13 @@ template Result> GcRoot::create(T* ptr, Arena& arena) { auto lst = TRY(arena.alloc()); arena.add_root(lst); - return GcRoot(ptr, lst); + return std::move(GcRoot(ptr, lst)); } template requires std::derived_from GcRoot::GcRoot(GcRoot&& rhs) { rhs._node->update(this); + _ptr = rhs._ptr; + _node = rhs._node; } diff --git a/src/vli.cpp b/src/vli.cpp index 3d702e2..a223145 100644 --- a/src/vli.cpp +++ b/src/vli.cpp @@ -1,10 +1,12 @@ #include +#include "arena.hpp" #include "common.hpp" StaticArena<64 * 1024 * 1024> arena; int main() { + /* Value val; std::cout << sizeof(val) << "\n"; std::cout << int(val->tag()) << "\n"; @@ -14,6 +16,10 @@ int main() { std::cout << sizeof(val) << "\n"; std::cout << int(val->tag()) << "\n"; std::cout << int(((Int64&)*val).value()) << "\n"; + */ + + auto lst = DIEIF(arena.alloc()); + auto root = DIEIF(MkGcRoot(lst, arena)); return 0; }