xo-gc: + ACollector.assign_member()

This commit is contained in:
Roland Conybeare 2026-03-24 22:11:25 -04:00
commit f7e8fd5f65
2 changed files with 35 additions and 13 deletions

View file

@ -3,7 +3,7 @@
* @author Roland Conybeare, Jan 2026
**/
#include "DGlobalSymtab.hpp"
#include "GlobalSymtab.hpp"
#include "Typename.hpp"
#include "Binding.hpp"
#include "DUniqueString.hpp"
@ -29,11 +29,11 @@ namespace xo {
{
}
dp<DGlobalSymtab>
DGlobalSymtab::make(obj<AAllocator> mm,
obj<AAllocator> aux_mm,
const ArenaHashMapConfig & var_cfg,
const ArenaHashMapConfig & type_cfg)
DGlobalSymtab *
DGlobalSymtab::_make(obj<AAllocator> mm,
obj<AAllocator> aux_mm,
const ArenaHashMapConfig & var_cfg,
const ArenaHashMapConfig & type_cfg)
{
/* note: using aux_mm for DArenaHashMap superstructure.
* {variable, type} storage allocated from mm.
@ -51,14 +51,26 @@ namespace xo {
DArray * types = DArray::empty(mm, type_map->capacity());
auto symtab = dp<DGlobalSymtab>::make(mm,
std::move(var_map), vars,
std::move(type_map), types);
void * mem = mm.alloc_for<DGlobalSymtab>();
auto symtab = new (mem) DGlobalSymtab(std::move(var_map),
vars,
std::move(type_map),
types);
assert(symtab);
return symtab;
}
obj<AGCObject,DGlobalSymtab>
DGlobalSymtab::make(obj<AAllocator> mm,
obj<AAllocator> aux_mm,
const ArenaHashMapConfig & var_cfg,
const ArenaHashMapConfig & type_cfg)
{
return obj<AGCObject,DGlobalSymtab>(_make(mm, aux_mm, var_cfg, type_cfg));
}
void
DGlobalSymtab::visit_pools(const MemorySizeVisitor & visitor) const
{
@ -275,6 +287,9 @@ namespace xo {
{
// map_ doesn't contain any gc-owned data, can skip
static_assert(var_map_.is_gc_eligible() == false);
static_assert(type_map_.is_gc_eligible() == false);
gc.forward_inplace(&vars_);
gc.forward_inplace(&types_);