From 1f596e6172a3293b7e1bcce08bb4b39dfe74dfda Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Sun, 15 Mar 2026 12:10:21 -0500 Subject: [PATCH] xo-interpreter2 stack: refactor: do report_memory_use() modular --- include/xo/interpreter2/VsmPrimitives.hpp | 27 +++++++ .../interpreter2_register_primitives.hpp | 20 +++++ src/interpreter2/CMakeLists.txt | 2 + src/interpreter2/VirtualSchematikaMachine.cpp | 41 ---------- src/interpreter2/VsmPrimitives.cpp | 52 +++++++++++++ src/interpreter2/init_interpreter2.cpp | 4 + .../interpreter2_register_primitives.cpp | 75 +++++++++++++++++++ 7 files changed, 180 insertions(+), 41 deletions(-) create mode 100644 include/xo/interpreter2/VsmPrimitives.hpp create mode 100644 include/xo/interpreter2/interpreter2_register_primitives.hpp create mode 100644 src/interpreter2/VsmPrimitives.cpp create mode 100644 src/interpreter2/interpreter2_register_primitives.cpp diff --git a/include/xo/interpreter2/VsmPrimitives.hpp b/include/xo/interpreter2/VsmPrimitives.hpp new file mode 100644 index 00000000..59f52fc3 --- /dev/null +++ b/include/xo/interpreter2/VsmPrimitives.hpp @@ -0,0 +1,27 @@ +/** @file VsmPrimitives.hpp + * + * @author Roland Conybeare, Mar 2026 + **/ + +#pragma once + +#include + +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 mm); + }; + + } /*namespace scm*/ +} /*namespace xo*/ + +/* end VsmPrimitives.hpp */ diff --git a/include/xo/interpreter2/interpreter2_register_primitives.hpp b/include/xo/interpreter2/interpreter2_register_primitives.hpp new file mode 100644 index 00000000..1946969a --- /dev/null +++ b/include/xo/interpreter2/interpreter2_register_primitives.hpp @@ -0,0 +1,20 @@ +/** @file interpreter2_register_primitives.hpp + * + * @author Roland Conybeare, Mar 2026 + **/ + +#pragma once + +#include "PrimitiveRegistry.hpp" +#include + +namespace xo { + namespace scm { + /** Register primitive-factories **/ + bool interpreter2_register_primitives(obj gc, + InstallSink sink, + InstallFlags flags); + } +} + +/* end interpreter2_register_primitives.hpp */ diff --git a/src/interpreter2/CMakeLists.txt b/src/interpreter2/CMakeLists.txt index 27927606..60974aeb 100644 --- a/src/interpreter2/CMakeLists.txt +++ b/src/interpreter2/CMakeLists.txt @@ -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 diff --git a/src/interpreter2/VirtualSchematikaMachine.cpp b/src/interpreter2/VirtualSchematikaMachine.cpp index a021a865..9473d15e 100644 --- a/src/interpreter2/VirtualSchematikaMachine.cpp +++ b/src/interpreter2/VirtualSchematikaMachine.cpp @@ -876,32 +876,6 @@ namespace xo { } } - // ----- primitive: report_memory_use() ----- - - obj - xfer_report_memory_use(obj 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(rcx.allocator(), true); - } - - static DPrimitive_gco_0 s_report_memory_use_pm("_report_memory_use", - &xfer_report_memory_use); - // ----- primitive: cwd() ----- obj @@ -916,9 +890,6 @@ namespace xo { static DPrimitive_gco_0 s_cwd_pm("_cwd", &xfer_cwd); - // ----- primitive: cons() ----- - - // ----- primitive: fn_n_args() ----- obj @@ -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(), - obj(&s_report_memory_use_pm)); - } - /* cwd */ { const DUniqueString * name diff --git a/src/interpreter2/VsmPrimitives.cpp b/src/interpreter2/VsmPrimitives.cpp new file mode 100644 index 00000000..a3eb79e0 --- /dev/null +++ b/src/interpreter2/VsmPrimitives.cpp @@ -0,0 +1,52 @@ +/** @file VsmPrimitives.cpp + * + * @author Roland Conybeare, Mar 2026 + **/ + +#include "VsmPrimitives.hpp" +#include +#include + +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 + xfer_report_memory_use(obj 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(rcx.allocator(), true); + } + + DPrimitive_gco_0 * + VsmPrimitives::make_report_memory_use_pm(obj mm) + { + return DPrimitive_gco_0::_make(mm, + "report_memory_use", + &xfer_report_memory_use); + } + + + } /*namespace scm*/ +} /*namespace xo*/ + +/* end VsmPrimitives.cpp */ diff --git a/src/interpreter2/init_interpreter2.cpp b/src/interpreter2/init_interpreter2.cpp index 6302be0c..fddbf21a 100644 --- a/src/interpreter2/init_interpreter2.cpp +++ b/src/interpreter2/init_interpreter2.cpp @@ -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 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 diff --git a/src/interpreter2/interpreter2_register_primitives.cpp b/src/interpreter2/interpreter2_register_primitives.cpp new file mode 100644 index 00000000..17512f4b --- /dev/null +++ b/src/interpreter2/interpreter2_register_primitives.cpp @@ -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 + 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(pm), + flags); + } else { + log && log("skip primitive", xtag("name", pm->name())); + + return true; + } + } + + template + bool install_aux(InstallSink sink, + obj 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 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 **/