xo-interpreter2 stack: define-expr's work at top-level

This commit is contained in:
Roland Conybeare 2026-02-17 14:42:17 -05:00
commit 121fb2dfad
6 changed files with 30 additions and 9 deletions

View file

@ -71,6 +71,7 @@ namespace xo {
bool debug_flag() const noexcept { return debug_flag_; } bool debug_flag() const noexcept { return debug_flag_; }
ParserStack * stack() const noexcept { return stack_; } ParserStack * stack() const noexcept { return stack_; }
obj<AAllocator> expr_alloc() const noexcept { return expr_alloc_; } obj<AAllocator> expr_alloc() const noexcept { return expr_alloc_; }
DGlobalSymtab * global_symtab() const noexcept { return global_symtab_.data(); }
DLocalSymtab * local_symtab() const noexcept { return local_symtab_; } DLocalSymtab * local_symtab() const noexcept { return local_symtab_; }
const ParserResult & result() const noexcept { return result_; } const ParserResult & result() const noexcept { return result_; }
@ -315,6 +316,17 @@ namespace xo {
**/ **/
obj<AAllocator> aux_alloc_; obj<AAllocator> aux_alloc_;
/** global symbol table.
* Toplevel definitions go here.
*
* Uses mmap -> non-trivial destructor.
*
* TODO: may want to move ownership upstairs.
* if so, along with stringtable_.
* maybe new struct ParserState?
**/
dp<DGlobalSymtab> global_symtab_;
/** symbol table with local bindings. /** symbol table with local bindings.
* non-null during parsing of lambda expressions. * non-null during parsing of lambda expressions.
* Always allocated from @p expr_alloc_. * Always allocated from @p expr_alloc_.
@ -323,15 +335,6 @@ namespace xo {
**/ **/
DLocalSymtab * local_symtab_ = nullptr; DLocalSymtab * local_symtab_ = nullptr;
/** global symbol table.
* Toplevel definitions go here.
*
* Uses mmap -> non-trivial destructor.
*
* TODO: may want to move ownership upstairs
**/
dp<DGlobalSymtab> global_symtab_;
/** current output from parser **/ /** current output from parser **/
ParserResult result_; ParserResult result_;

View file

@ -183,6 +183,8 @@ namespace xo {
/** scm-schematikaparser-access-methods **/ /** scm-schematikaparser-access-methods **/
///@{ ///@{
DGlobalSymtab * global_symtab() const noexcept;
bool debug_flag() const { return debug_flag_; } bool debug_flag() const { return debug_flag_; }
/** true if parser is at top-level, /** true if parser is at top-level,

View file

@ -54,6 +54,9 @@ namespace xo {
/** non-trivial dtor because of @p parser **/ /** non-trivial dtor because of @p parser **/
~SchematikaReader() = default; ~SchematikaReader() = default;
/** top-level symbol table **/
DGlobalSymtab * global_symtab() const noexcept;
/** visit reader-owned memory pools; call visitor(info) for each. /** visit reader-owned memory pools; call visitor(info) for each.
* Specifically exclude expr_alloc, since we don't consider * Specifically exclude expr_alloc, since we don't consider
* that reader-owned * that reader-owned

View file

@ -32,6 +32,12 @@ namespace xo {
{ {
} }
DGlobalSymtab *
SchematikaParser::global_symtab() const noexcept
{
return psm_.global_symtab();
}
bool bool
SchematikaParser::is_at_toplevel() const SchematikaParser::is_at_toplevel() const
{ {

View file

@ -24,6 +24,12 @@ namespace xo {
{ {
} }
DGlobalSymtab *
SchematikaReader::global_symtab() const noexcept
{
return parser_.global_symtab();
}
void void
SchematikaReader::visit_pools(const MemorySizeVisitor & visitor) const SchematikaReader::visit_pools(const MemorySizeVisitor & visitor) const
{ {

View file

@ -117,6 +117,7 @@ namespace xo {
aux_arena_.visit_pools(visitor); aux_arena_.visit_pools(visitor);
FacetRegistry::instance().visit_pools(visitor); FacetRegistry::instance().visit_pools(visitor);
TypeRegistry::instance().visit_pools(visitor);
expr_arena_->visit_pools(visitor); expr_arena_->visit_pools(visitor);
parser_->visit_pools(visitor); parser_->visit_pools(visitor);