xo-interpreter2 stack: work on runtime error representation [WIP]

This commit is contained in:
Roland Conybeare 2026-02-12 18:46:43 -05:00
commit 497dc8a626
5 changed files with 86 additions and 13 deletions

View file

@ -6,6 +6,8 @@
#include "Closure.hpp"
#include "LambdaExpr.hpp"
#include "LocalEnv.hpp"
#include "VsmRcx.hpp"
#include <xo/indentlog/scope.hpp>
#include <cstddef>
namespace xo {
@ -33,7 +35,30 @@ namespace xo {
DClosure::apply_nocheck(obj<ARuntimeContext> rcx,
const DArray * args)
{
(void)rcx;
scope log(XO_DEBUG(true));
auto vsm_rcx
= obj<ARuntimeContext,DVsmRcx>::from(rcx);
log && log(xtag("vsm_rcx.data", (void*)vsm_rcx.data()));
// let's try a not-implemented error
// don't want to clutter Procedure facet, since it's
// lower-level than xo-interpreter2
#ifdef NOT_YET
// TODO: verify arguments against type signature.
// unless we have evidence that program is type correct
int32_t n_args = this->n_args();
if (n_args != args->size()) {
//
}
#endif
(void)args;
assert(false);

View file

@ -15,6 +15,7 @@
//#include <xo/procedure2/SimpleRcx.hpp>
#include <xo/gc/DX1Collector.hpp>
#include <xo/gc/detail/IAllocator_DX1Collector.hpp>
#include <xo/alloc2/Arena.hpp>
#include <xo/printable2/Printable.hpp>
#include <xo/facet/FacetRegistry.hpp>
#include <cassert>
@ -27,12 +28,25 @@ namespace xo {
//using xo::mm::MemorySizeInfo; // not used yet
using xo::mm::AAllocator;
using xo::mm::DX1Collector;
using xo::mm::DArena;
using xo::facet::FacetRegistry;
using std::cout;
namespace scm {
// NOTE: using heap here for {DX1Collector, DVsmRcx} instances
bool
VsmResult::is_eval_error() const
{
if (std::holds_alternative<obj<AGCObject>>(result_)) {
auto err = obj<AGCObject,DRuntimeError>::from(*(this->value()));
return err;
} else {
return false;
}
}
// NOTE: using heap here for {DX1Collector, DArena, DVsmRcx} instances
// (though DX1Collector allocations will be from explictly mmap'd memory)
//
VirtualSchematikaMachine::VirtualSchematikaMachine(const VsmConfig & config)
@ -41,6 +55,14 @@ namespace xo {
rcx_(box<ARuntimeContext,DVsmRcx>(new DVsmRcx(this))),
reader_{config.rdr_config_, mm_.to_op()}
{
{
DArena * arena = new DArena();
assert(arena);
*arena = DArena::map(config_.error_config_);
error_mm_.adopt(obj<AAllocator,DArena>(arena));
}
// TODO: allocate global_env
}
@ -50,6 +72,12 @@ namespace xo {
return mm_.to_op();
}
obj<AAllocator>
VirtualSchematikaMachine::error_allocator() const noexcept
{
return error_mm_.to_op();
}
void
VirtualSchematikaMachine::visit_pools(const MemorySizeVisitor & visitor) const
{
@ -113,7 +141,7 @@ namespace xo {
{
this->pc_ = VsmInstr::c_eval;
this->expr_ = expr;
this->value_ = obj<AGCObject>();
this->value_ = VsmResult(obj<AGCObject>());
this->cont_ = VsmInstr::c_halt;
this->run();
@ -200,7 +228,7 @@ namespace xo {
auto expr
= obj<AExpression,DConstant>::from(expr_);
this->value_ = expr.data()->value();
this->value_ = VsmResult(expr.data()->value());
this->pc_ = this->cont_;
}
@ -250,7 +278,7 @@ namespace xo {
local_env_);
this->value_
= obj<AGCObject>(obj<AGCObject,DClosure>(closure));
= VsmResult(obj<AGCObject>(obj<AGCObject,DClosure>(closure)));
this->pc_ = this->cont_;
}
@ -341,7 +369,7 @@ namespace xo {
// TODO: check argument types
this->value_ = fn_.apply_nocheck(rcx_.to_op(), args_);
this->value_ = VsmResult(fn_.apply_nocheck(rcx_.to_op(), args_));
this->pc_ = cont_;
return;