From b69ec48d00e82decc5f749291e7890efc85f08a6 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 12 Mar 2026 20:26:08 -0500 Subject: [PATCH] xo-interpreter2 stack: refactor + bugfix operator expr --- include/xo/numeric/NumericPrimitives.hpp | 20 +++-- .../numeric/numeric_register_primitives.hpp | 20 +++++ src/numeric/CMakeLists.txt | 1 + src/numeric/NumericPrimitives.cpp | 67 +++++++++------ src/numeric/init_numeric.cpp | 6 ++ src/numeric/numeric_register_primitives.cpp | 81 +++++++++++++++++++ 6 files changed, 164 insertions(+), 31 deletions(-) create mode 100644 include/xo/numeric/numeric_register_primitives.hpp create mode 100644 src/numeric/numeric_register_primitives.cpp diff --git a/include/xo/numeric/NumericPrimitives.hpp b/include/xo/numeric/NumericPrimitives.hpp index b67ec911..feacb480 100644 --- a/include/xo/numeric/NumericPrimitives.hpp +++ b/include/xo/numeric/NumericPrimitives.hpp @@ -14,21 +14,25 @@ namespace xo { **/ class NumericPrimitives { public: - /** polymorphic (in both arguments) multiply **/ - static DPrimitive_gco_2_gco_gco s_mul_gco_gco_pm; + using AAllocator = xo::mm::AAllocator; + + public: + /** polymorphic (in both arguments1) multiply **/ + static DPrimitive_gco_2_gco_gco * make_multiply_pm(obj mm); + /** polymorphic (in both arguments) divide **/ - static DPrimitive_gco_2_gco_gco s_div_gco_gco_pm; + static DPrimitive_gco_2_gco_gco * make_divide_pm(obj mm); /** polymorphic (in both arguments) add **/ - static DPrimitive_gco_2_gco_gco s_add_gco_gco_pm; + static DPrimitive_gco_2_gco_gco * make_add_pm(obj mm); /** polymorphic (in both arguments) subtract **/ - static DPrimitive_gco_2_gco_gco s_sub_gco_gco_pm; + static DPrimitive_gco_2_gco_gco * make_subtract_pm(obj mm); /** polymorphic (in both arguments) compare (==) **/ - static DPrimitive_gco_2_gco_gco s_cmpeq_gco_gco_pm; + static DPrimitive_gco_2_gco_gco * make_cmpeq_pm(obj mm); /** polymorphic (in both arguments) compare (!=) **/ - static DPrimitive_gco_2_gco_gco s_cmpne_gco_gco_pm; + static DPrimitive_gco_2_gco_gco * make_cmpne_pm(obj mm); /** polymorphic (in both arguments) compare (<) **/ - static DPrimitive_gco_2_gco_gco s_cmplt_gco_gco_pm; + static DPrimitive_gco_2_gco_gco * make_cmplt_pm(obj mm); }; } } diff --git a/include/xo/numeric/numeric_register_primitives.hpp b/include/xo/numeric/numeric_register_primitives.hpp new file mode 100644 index 00000000..455d8b44 --- /dev/null +++ b/include/xo/numeric/numeric_register_primitives.hpp @@ -0,0 +1,20 @@ +/** @file numeric_register_primitives.hpp + * + * @author Roland Conybeare, Mar 2026 + **/ + +#pragma once + +#include "PrimitiveRegistry.hpp" +#include + +namespace xo { + namespace scm { + /** Register gc-aware (AGCObject,DRepr) combinations with garbage collector @p gc **/ + bool numeric_register_primitives(obj gc, + InstallSink sink, + InstallFlags flags); + } +} + +/* end numeric_register_primitives.hpp */ diff --git a/src/numeric/CMakeLists.txt b/src/numeric/CMakeLists.txt index 4d2b4345..ca7dd6d5 100644 --- a/src/numeric/CMakeLists.txt +++ b/src/numeric/CMakeLists.txt @@ -4,6 +4,7 @@ set(SELF_LIB xo_numeric) set(SELF_SRCS init_numeric.cpp numeric_register_facets.cpp + numeric_register_primitives.cpp NumericPrimitives.cpp NumericDispatch.cpp INumeric_Any.cpp diff --git a/src/numeric/NumericPrimitives.cpp b/src/numeric/NumericPrimitives.cpp index f9cdf4d2..fabc3648 100644 --- a/src/numeric/NumericPrimitives.cpp +++ b/src/numeric/NumericPrimitives.cpp @@ -7,38 +7,59 @@ #include "NumericDispatch.hpp" namespace xo { - using xo::mm::AGCObject; + using xo::mm::AAllocator; + //using xo::mm::AGCObject; namespace scm { - DPrimitive_gco_2_gco_gco - NumericPrimitives::s_mul_gco_gco_pm("_mul", - &NumericDispatch::multiply); + DPrimitive_gco_2_gco_gco * + NumericPrimitives::make_multiply_pm(obj mm) + { + return DPrimitive_gco_2_gco_gco::_make(mm, "_mul", + &NumericDispatch::multiply); + } - DPrimitive_gco_2_gco_gco - NumericPrimitives::s_div_gco_gco_pm("_div", - &NumericDispatch::divide); + DPrimitive_gco_2_gco_gco * + NumericPrimitives::make_divide_pm(obj mm) + { + return DPrimitive_gco_2_gco_gco::_make(mm, "_div", + &NumericDispatch::divide); + } - DPrimitive_gco_2_gco_gco - NumericPrimitives::s_add_gco_gco_pm("_add", - &NumericDispatch::add); + DPrimitive_gco_2_gco_gco * + NumericPrimitives::make_add_pm(obj mm) + { + return DPrimitive_gco_2_gco_gco::_make(mm, "_add", + &NumericDispatch::add); + } - DPrimitive_gco_2_gco_gco - NumericPrimitives::s_sub_gco_gco_pm("_sub", - &NumericDispatch::subtract); + DPrimitive_gco_2_gco_gco * + NumericPrimitives::make_subtract_pm(obj mm) + { + return DPrimitive_gco_2_gco_gco::_make(mm, "_sub", + &NumericDispatch::subtract); + } - DPrimitive_gco_2_gco_gco - NumericPrimitives::s_cmpeq_gco_gco_pm("_cmpeq", - &NumericDispatch::cmp_equal); + DPrimitive_gco_2_gco_gco * + NumericPrimitives::make_cmpeq_pm(obj mm) + { + return DPrimitive_gco_2_gco_gco::_make(mm, "_cmpeq", + &NumericDispatch::cmp_equal); + } - DPrimitive_gco_2_gco_gco - NumericPrimitives::s_cmpne_gco_gco_pm("_cmpne", - &NumericDispatch::cmp_notequal); - - DPrimitive_gco_2_gco_gco - NumericPrimitives::s_cmplt_gco_gco_pm("_cmplt", - &NumericDispatch::cmp_less); + DPrimitive_gco_2_gco_gco * + NumericPrimitives::make_cmpne_pm(obj mm) + { + return DPrimitive_gco_2_gco_gco::_make(mm, "_cmpne", + &NumericDispatch::cmp_notequal); + } + DPrimitive_gco_2_gco_gco * + NumericPrimitives::make_cmplt_pm(obj mm) + { + return DPrimitive_gco_2_gco_gco::_make(mm, "_cmplt", + &NumericDispatch::cmp_less); + } } /*namespace scm*/ } /*namespace xo*/ diff --git a/src/numeric/init_numeric.cpp b/src/numeric/init_numeric.cpp index 1b205585..faa678a0 100644 --- a/src/numeric/init_numeric.cpp +++ b/src/numeric/init_numeric.cpp @@ -7,14 +7,20 @@ #include #include "Subsystem.hpp" #include "numeric_register_facets.hpp" +#include "numeric_register_primitives.hpp" namespace xo { using xo::scm::numeric_register_facets; + using xo::scm::numeric_register_primitives; + using xo::scm::PrimitiveRegistry; void InitSubsys::init() { numeric_register_facets(); + + PrimitiveRegistry::instance().register_primitives(&numeric_register_primitives); + } InitEvidence diff --git a/src/numeric/numeric_register_primitives.cpp b/src/numeric/numeric_register_primitives.cpp new file mode 100644 index 00000000..e407eca8 --- /dev/null +++ b/src/numeric/numeric_register_primitives.cpp @@ -0,0 +1,81 @@ +/** @file numeric_register_primitives.cpp + * + * @author Roland Conybeare, Mar 2026 + **/ + +#include "numeric_register_primitives.hpp" +#include "NumericPrimitives.hpp" +#include "NumericDispatch.hpp" +#include +#include + +namespace xo { + using xo::mm::AAllocator; + using xo::scope; + + namespace scm { + namespace { + bool install_aux(InstallSink sink, + DPrimitive_gco_2_gco_gco * pm, + InstallFlags flags) + { + if (flags != InstallFlags::f_none) { + return sink(pm->name(), + pm->fn_td(), + obj(pm), + flags); + } else { + return true; + } + } + + bool install_aux(InstallSink sink, + obj mm, + std::string_view name, + obj (*impl)(obj rcx, + obj x, + obj y), + InstallFlags flags) + { + if (flags != InstallFlags::f_none) { + auto pm + = DPrimitive_gco_2_gco_gco::_make(mm, name, impl); + + return install_aux(sink, pm, flags); + } else { + return true; + } + } + } + + bool + numeric_register_primitives(obj mm, InstallSink sink, InstallFlags flags) + { + scope log(XO_DEBUG(true)); + + bool ok = true; + + ok = ok & install_aux(sink, + NumericPrimitives::make_multiply_pm(mm), + flags & InstallFlags::f_essential); + ok = ok & install_aux(sink, + NumericPrimitives::make_divide_pm(mm), + flags & InstallFlags::f_essential); + ok = ok & install_aux(sink, mm, "_add", &NumericDispatch::add, + flags & InstallFlags::f_essential); + ok = ok & install_aux(sink, mm, "_sub", &NumericDispatch::subtract, + flags & InstallFlags::f_essential); + + ok = ok & install_aux(sink, mm, "_cmpeq", &NumericDispatch::cmp_equal, + flags & InstallFlags::f_essential); + ok = ok & install_aux(sink, mm, "_cmpne", &NumericDispatch::cmp_notequal, + flags & InstallFlags::f_essential); + ok = ok & install_aux(sink, mm, "_cmplt", &NumericDispatch::cmp_less, + flags & InstallFlags::f_essential); + + return ok; + } + } +} /*namespace xo*/ + +/* end numeric_register_primitives.cpp */