/** @file DGlobalSymtab.hpp * * @author Roland Conybeare, Jan 2026 **/ #pragma once #include "Binding.hpp" #include "DVariable.hpp" #include #include namespace xo { namespace scm { class DUniqueString; /** @class DGlobalSymtab * @brief symbol table for toplevel environment * * We're using DArenaHashMap to store pairs. * Both of these are outside GC-space, so we don't need collector * to traverse these. **/ class DGlobalSymtab { public: using key_type = const DUniqueString *; using value_type = Binding; using repr_type = xo::map::DArenaHashMap; using AAllocator = xo::mm::AAllocator; using MemorySizeVisitor = xo::mm::MemorySizeVisitor; public: /** visit symtab-owned memory pools; call visitor(info) for each **/ void visit_pools(const MemorySizeVisitor & visitor) const; public: /** lookup global symbol with name @p sym **/ DVariable * lookup_variable(const DUniqueString * sym) const noexcept; /** establish binding for @p sym, with type described by @p typeref, * replacing existing global (if present) with the same name. * Use memory from @p mm to create variable-expr **/ DVariable * establish_variable(obj mm, const DUniqueString * sym, TypeRef typeref); /** @defgroup xo-expression2-symboltable-facet symboltable facet**/ ///@{ /** true for global symbol table **/ bool is_global_symtab() const noexcept { return true; } /** lookup binding for variable @p sym **/ Binding lookup_binding(const DUniqueString * sym) const noexcept; ///@} private: /** next binding will use this global index. See DGlobalEnv **/ uint32_t next_binding_ix_ = 0; /** map symbols -> bindings **/ repr_type map_; /** array of variables. * When S is a unique-string for a global symbol, then: * 1. map_[S] is unique global index i(S) for S. * 2. vars_[i(S)] is variable-expr var(S) for S * 3. var(S)->name == S **/ DArray * vars_ = nullptr; }; } /*namespace scm*/ } /*namespace xo*/ /* end DGlobalSymtab.hpp */