xo-interpreter2 stack: refactor: do report_memory_use() modular

This commit is contained in:
Roland Conybeare 2026-03-15 12:10:21 -05:00
commit c421eb979e
9 changed files with 182 additions and 43 deletions

View file

@ -0,0 +1,27 @@
/** @file VsmPrimitives.hpp
*
* @author Roland Conybeare, Mar 2026
**/
#pragma once
#include <xo/procedure2/Primitive_gco_0.hpp>
namespace xo {
namespace scm {
/** @brief primitives centered on interpreter2/ data
*
**/
class VsmPrimitives {
public:
using AAllocator = xo::mm::AAllocator;
public:
/** create primitive: report memory use to console **/
static DPrimitive_gco_0 * make_report_memory_use_pm(obj<AAllocator> mm);
};
} /*namespace scm*/
} /*namespace xo*/
/* end VsmPrimitives.hpp */

View file

@ -0,0 +1,20 @@
/** @file interpreter2_register_primitives.hpp
*
* @author Roland Conybeare, Mar 2026
**/
#pragma once
#include "PrimitiveRegistry.hpp"
#include <xo/alloc2/Collector.hpp>
namespace xo {
namespace scm {
/** Register primitive-factories **/
bool interpreter2_register_primitives(obj<xo::mm::AAllocator> gc,
InstallSink sink,
InstallFlags flags);
}
}
/* end interpreter2_register_primitives.hpp */

View file

@ -3,10 +3,12 @@
set(SELF_LIB xo_interpreter2)
set(SELF_SRCS
init_interpreter2.cpp
interpreter2_register_primitives.cpp
interpreter2_register_facets.cpp
interpreter2_register_types.cpp
VirtualSchematikaMachine.cpp
VsmPrimitives.cpp
DVsmDefContFrame.cpp
IGCObject_DVsmDefContFrame.cpp

View file

@ -876,32 +876,6 @@ namespace xo {
}
}
// ----- primitive: report_memory_use() -----
obj<AGCObject>
xfer_report_memory_use(obj<ARuntimeContext> rcx)
{
scope log(XO_DEBUG(true));
auto visitor = [&log](const MemorySizeInfo & info) {
log && log(xtag("resource", info.resource_name_),
xtag("used", info.used_),
xtag("alloc", info.allocated_),
xtag("commit", info.committed_),
xtag("resv", info.reserved_));
};
FacetRegistry::instance().visit_pools(visitor);
TypeRegistry::instance().visit_pools(visitor);
NumericDispatch::instance().visit_pools(visitor);
rcx.visit_pools(visitor);
return DBoolean::box<AGCObject>(rcx.allocator(), true);
}
static DPrimitive_gco_0 s_report_memory_use_pm("_report_memory_use",
&xfer_report_memory_use);
// ----- primitive: cwd() -----
obj<AGCObject>
@ -916,9 +890,6 @@ namespace xo {
static DPrimitive_gco_0 s_cwd_pm("_cwd",
&xfer_cwd);
// ----- primitive: cons() -----
// ----- primitive: fn_n_args() -----
obj<AGCObject>
@ -945,18 +916,6 @@ namespace xo {
void
VirtualSchematikaMachine::install_core_primitives()
{
/* report_memory_use */
{
const DUniqueString * name
= reader_.intern_string("report_memory_use");
global_env_->_upsert_value
(mm_.to_op(),
name,
Reflect::require<DPrimitive_gco_0>(),
obj<AGCObject,DPrimitive_gco_0>(&s_report_memory_use_pm));
}
/* cwd */
{
const DUniqueString * name

View file

@ -0,0 +1,52 @@
/** @file VsmPrimitives.cpp
*
* @author Roland Conybeare, Mar 2026
**/
#include "VsmPrimitives.hpp"
#include <xo/numeric/NumericDispatch.hpp>
#include <xo/object2/Boolean.hpp>
namespace xo {
//using xo::scm::NumericDispatch;
using xo::mm::MemorySizeInfo;
using xo::facet::FacetRegistry;
using xo::facet::TypeRegistry;
namespace scm {
// ----- primitive: report_memory_use() -----
obj<AGCObject>
xfer_report_memory_use(obj<ARuntimeContext> rcx)
{
scope log(XO_DEBUG(true));
auto visitor = [&log](const MemorySizeInfo & info) {
log && log(xtag("resource", info.resource_name_),
xtag("used", info.used_),
xtag("alloc", info.allocated_),
xtag("commit", info.committed_),
xtag("resv", info.reserved_));
};
FacetRegistry::instance().visit_pools(visitor);
TypeRegistry::instance().visit_pools(visitor);
NumericDispatch::instance().visit_pools(visitor);
rcx.visit_pools(visitor);
return DBoolean::box<AGCObject>(rcx.allocator(), true);
}
DPrimitive_gco_0 *
VsmPrimitives::make_report_memory_use_pm(obj<AAllocator> mm)
{
return DPrimitive_gco_0::_make(mm,
"report_memory_use",
&xfer_report_memory_use);
}
} /*namespace scm*/
} /*namespace xo*/
/* end VsmPrimitives.cpp */

View file

@ -5,6 +5,7 @@
#include "init_interpreter2.hpp"
#include "interpreter2_register_primitives.hpp"
#include "interpreter2_register_facets.hpp"
#include "interpreter2_register_types.hpp"
@ -12,8 +13,10 @@
#include <xo/alloc2/CollectorTypeRegistry.hpp>
namespace xo {
using xo::scm::interpreter2_register_primitives;
using xo::scm::interpreter2_register_facets;
using xo::scm::interpreter2_register_types;
using xo::scm::PrimitiveRegistry;
using xo::mm::CollectorTypeRegistry;
void
@ -22,6 +25,7 @@ namespace xo {
interpreter2_register_facets();
CollectorTypeRegistry::instance().register_types(&interpreter2_register_types);
PrimitiveRegistry::instance().register_primitives(&interpreter2_register_primitives);
}
InitEvidence

View file

@ -0,0 +1,75 @@
/** @file interpreter2_register_primitives.cpp
*
* @author Roland Conybeare, Mar 2026
**/
#include "interpreter2_register_primitives.hpp"
#include "VsmPrimitives.hpp"
namespace xo {
using xo::mm::AAllocator;
namespace scm {
/** TODO: MOVE THESE install_aux() remplates SOMEWHERE COMMON **/
template <typename PrimitiveRepr>
bool install_aux(InstallSink sink,
PrimitiveRepr * pm,
InstallFlags flags)
{
scope log(XO_DEBUG(true));
if ((flags & InstallFlags::f_generalpurpose) == InstallFlags::f_generalpurpose) {
log && log("create primitive", xtag("name", pm->name()));
return sink(pm->name(),
pm->fn_td(),
obj<AProcedure,PrimitiveRepr>(pm),
flags);
} else {
log && log("skip primitive", xtag("name", pm->name()));
return true;
}
}
template <typename Primitive>
bool install_aux(InstallSink sink,
obj<AAllocator> mm,
std::string_view name,
typename Primitive::FunctionPtrType impl,
InstallFlags flags)
{
if (flags != InstallFlags::f_none) {
auto pm
= Primitive::_make(mm, name, impl);
return install_aux(sink, pm, flags);
} else {
return true;
}
}
bool
interpreter2_register_primitives(obj<xo::mm::AAllocator> mm,
InstallSink sink,
InstallFlags flags)
{
(void)mm;
(void)sink;
(void)flags;
scope log(XO_DEBUG(true));
bool ok = true;
ok = ok & install_aux(sink, VsmPrimitives::make_report_memory_use_pm(mm), flags);
return ok;
}
} /*namespace scm*/
} /*namespace xo*/
/* end interpreter2_register_primitives.cpp **/

View file

@ -27,7 +27,7 @@ namespace xo {
/** create primitive: create cons cell **/
static DPrimitive_gco_2_gco_gco * make_cons_pm(obj<AAllocator> mm);
/** create pirmitive for creating a dictionary instance **/
/** create primitive for creating a dictionary instance **/
static DPrimitive_gco_0 * make_dict_make_pm(obj<AAllocator> mm);
/** create primitive that upserts a key,value pair into a dictionary **/

View file

@ -13,9 +13,9 @@
#include <xo/alloc2/CollectorTypeRegistry.hpp>
namespace xo {
using xo::scm::procedure2_register_primitives;
using xo::scm::procedure2_register_facets;
using xo::scm::procedure2_register_types;
using xo::scm::procedure2_register_primitives;
using xo::scm::PrimitiveRegistry;
using xo::mm::CollectorTypeRegistry;