From d39e13593c724f91cd92119c17195eddd64faee2 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Mon, 26 Jan 2026 12:38:17 -0500 Subject: [PATCH] xo-procedure2 xo-object2: + polymorphic primitive support --- doc/implementation.rst | 25 +++++++ idl/Procedure.json5 | 1 - include/xo/procedure2/DPrimitive.hpp | 18 +++-- include/xo/procedure2/Procedure.hpp | 2 +- include/xo/procedure2/RuntimeContext.hpp | 2 +- include/xo/procedure2/detail/AProcedure.hpp | 4 +- .../xo/procedure2/detail/ARuntimeContext.hpp | 2 +- .../xo/procedure2/detail/IProcedure_Any.hpp | 4 +- .../IProcedure_DPrimitive_gco_2_gco_gco.hpp | 4 +- .../xo/procedure2/detail/IProcedure_Xfer.hpp | 6 +- .../procedure2/detail/IRuntimeContext_Any.hpp | 2 +- .../detail/IRuntimeContext_Xfer.hpp | 2 +- include/xo/procedure2/detail/RProcedure.hpp | 6 +- .../xo/procedure2/detail/RRuntimeContext.hpp | 2 +- include/xo/procedure2/init_primitives.hpp | 7 ++ src/procedure2/IProcedure_Any.cpp | 2 +- .../IProcedure_DPrimitive_gco_2_gco_gco.cpp | 6 +- src/procedure2/init_primitives.cpp | 70 ++++++++++++++++--- 18 files changed, 126 insertions(+), 39 deletions(-) create mode 100644 doc/implementation.rst diff --git a/doc/implementation.rst b/doc/implementation.rst new file mode 100644 index 0000000..418dc75 --- /dev/null +++ b/doc/implementation.rst @@ -0,0 +1,25 @@ +.. _implementation: + +.. toctree:: + :maxdepth: 2 + +Components +========== + +Library dependency tower for *xo-procedure2* + +.. ditaa:: + + +--------------------------------+ + | xo_gc | + +--------------------------------+ + | xo_alloc2 | + +--------------------------------+ + | xo_facet | + +----------------+---------------+ + | xo_reflectutil | xo_indentlog | + +----------------+---------------+ + | xo_cmake | + +--------------------------------+ + +Expect to have xo_facet depending on xo_arena instead of using std::unordered_map diff --git a/idl/Procedure.json5 b/idl/Procedure.json5 index f0eac6b..f26a4e5 100644 --- a/idl/Procedure.json5 +++ b/idl/Procedure.json5 @@ -56,7 +56,6 @@ doc: ["invoke procedure; assume arguments satisfy type system" ], return_type: "obj", args: [ - {type: "obj", name: "rcx"}, {type: "const DArray *", name: "args"}, ] } diff --git a/include/xo/procedure2/DPrimitive.hpp b/include/xo/procedure2/DPrimitive.hpp index 106cbed..cf913a1 100644 --- a/include/xo/procedure2/DPrimitive.hpp +++ b/include/xo/procedure2/DPrimitive.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -62,24 +63,29 @@ namespace xo { bool is_nary() const noexcept { return false; } static constexpr std::int32_t n_args() noexcept { return Traits::n_args; } - obj apply_nocheck(obj rcx, const DArray * args) { - return _apply_nocheck(rcx, args, + obj apply_nocheck(const DArray * args) { + return _apply_nocheck(args, std::make_index_sequence{}); } private: template - obj _apply_nocheck(obj rcx, - const DArray * args, + obj _apply_nocheck(const DArray * args, std::index_sequence) { + using xo::facet::FacetRegistry; + using R = typename Traits::return_type; + assert(args); + assert(args->size() > 0); + + obj rcx + = FacetRegistry::instance().variant(args->at(0)); obj mm = rcx.allocator(); R result - = fn_(rcx, - GCObjectConversion>::from_gco(mm, args->at(Is))... ); + = fn_(GCObjectConversion>::from_gco(mm, args->at(Is))... ); return GCObjectConversion::to_gco(mm, result); } diff --git a/include/xo/procedure2/Procedure.hpp b/include/xo/procedure2/Procedure.hpp index 784608e..8b2cd91 100644 --- a/include/xo/procedure2/Procedure.hpp +++ b/include/xo/procedure2/Procedure.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/Procedure.json5] * 2. jinja2 template for facet .hpp file: diff --git a/include/xo/procedure2/RuntimeContext.hpp b/include/xo/procedure2/RuntimeContext.hpp index 3241451..2e8300e 100644 --- a/include/xo/procedure2/RuntimeContext.hpp +++ b/include/xo/procedure2/RuntimeContext.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/RuntimeContext.json5] * 2. jinja2 template for facet .hpp file: diff --git a/include/xo/procedure2/detail/AProcedure.hpp b/include/xo/procedure2/detail/AProcedure.hpp index 63a4da9..1be5e0d 100644 --- a/include/xo/procedure2/detail/AProcedure.hpp +++ b/include/xo/procedure2/detail/AProcedure.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/Procedure.json5] * 2. jinja2 template for abstract facet .hpp file: @@ -56,7 +56,7 @@ public: // nonconst methods /** invoke procedure; assume arguments satisfy type system **/ - virtual obj apply_nocheck(Opaque data, obj rcx, const DArray * args) = 0; + virtual obj apply_nocheck(Opaque data, const DArray * args) = 0; ///@} }; /*AProcedure*/ diff --git a/include/xo/procedure2/detail/ARuntimeContext.hpp b/include/xo/procedure2/detail/ARuntimeContext.hpp index 4e96bc8..42030d9 100644 --- a/include/xo/procedure2/detail/ARuntimeContext.hpp +++ b/include/xo/procedure2/detail/ARuntimeContext.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/RuntimeContext.json5] * 2. jinja2 template for abstract facet .hpp file: diff --git a/include/xo/procedure2/detail/IProcedure_Any.hpp b/include/xo/procedure2/detail/IProcedure_Any.hpp index 5d711d4..3f66fcd 100644 --- a/include/xo/procedure2/detail/IProcedure_Any.hpp +++ b/include/xo/procedure2/detail/IProcedure_Any.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/Procedure.json5] * 2. jinja2 template for abstract facet .hpp file: @@ -60,7 +60,7 @@ namespace scm { [[noreturn]] std::int32_t n_args(Copaque) const noexcept override { _fatal(); } // nonconst methods - [[noreturn]] obj apply_nocheck(Opaque, obj, const DArray *) override; + [[noreturn]] obj apply_nocheck(Opaque, const DArray *) override; ///@} diff --git a/include/xo/procedure2/detail/IProcedure_DPrimitive_gco_2_gco_gco.hpp b/include/xo/procedure2/detail/IProcedure_DPrimitive_gco_2_gco_gco.hpp index 11f2cd6..4b4351d 100644 --- a/include/xo/procedure2/detail/IProcedure_DPrimitive_gco_2_gco_gco.hpp +++ b/include/xo/procedure2/detail/IProcedure_DPrimitive_gco_2_gco_gco.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/IProcedure_DPrimitive_gco_2_gco_gco.json5] * 2. jinja2 template for abstract facet .hpp file: @@ -57,7 +57,7 @@ namespace xo { // non-const methods /** invoke procedure; assume arguments satisfy type system **/ - static obj apply_nocheck(DPrimitive_gco_2_gco_gco & self, obj rcx, const DArray * args); + static obj apply_nocheck(DPrimitive_gco_2_gco_gco & self, const DArray * args); ///@} }; diff --git a/include/xo/procedure2/detail/IProcedure_Xfer.hpp b/include/xo/procedure2/detail/IProcedure_Xfer.hpp index 4f84652..adf4995 100644 --- a/include/xo/procedure2/detail/IProcedure_Xfer.hpp +++ b/include/xo/procedure2/detail/IProcedure_Xfer.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/Procedure.json5] * 2. jinja2 template for abstract facet .hpp file: @@ -50,8 +50,8 @@ namespace scm { } // non-const methods - obj apply_nocheck(Opaque data, obj rcx, const DArray * args) override { - return I::apply_nocheck(_dcast(data), rcx, args); + obj apply_nocheck(Opaque data, const DArray * args) override { + return I::apply_nocheck(_dcast(data), args); } ///@} diff --git a/include/xo/procedure2/detail/IRuntimeContext_Any.hpp b/include/xo/procedure2/detail/IRuntimeContext_Any.hpp index 1e5f97c..419d45c 100644 --- a/include/xo/procedure2/detail/IRuntimeContext_Any.hpp +++ b/include/xo/procedure2/detail/IRuntimeContext_Any.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/RuntimeContext.json5] * 2. jinja2 template for abstract facet .hpp file: diff --git a/include/xo/procedure2/detail/IRuntimeContext_Xfer.hpp b/include/xo/procedure2/detail/IRuntimeContext_Xfer.hpp index cd71b73..e9f5512 100644 --- a/include/xo/procedure2/detail/IRuntimeContext_Xfer.hpp +++ b/include/xo/procedure2/detail/IRuntimeContext_Xfer.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/RuntimeContext.json5] * 2. jinja2 template for abstract facet .hpp file: diff --git a/include/xo/procedure2/detail/RProcedure.hpp b/include/xo/procedure2/detail/RProcedure.hpp index 93599ae..9fff0c6 100644 --- a/include/xo/procedure2/detail/RProcedure.hpp +++ b/include/xo/procedure2/detail/RProcedure.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/Procedure.json5] * 2. jinja2 template for abstract facet .hpp file: @@ -56,8 +56,8 @@ public: } // non-const methods (still const in router!) - obj apply_nocheck(obj rcx, const DArray * args) { - return O::iface()->apply_nocheck(O::data(), rcx, args); + obj apply_nocheck(const DArray * args) { + return O::iface()->apply_nocheck(O::data(), args); } ///@} diff --git a/include/xo/procedure2/detail/RRuntimeContext.hpp b/include/xo/procedure2/detail/RRuntimeContext.hpp index b06227c..06b093d 100644 --- a/include/xo/procedure2/detail/RRuntimeContext.hpp +++ b/include/xo/procedure2/detail/RRuntimeContext.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/RuntimeContext.json5] * 2. jinja2 template for abstract facet .hpp file: diff --git a/include/xo/procedure2/init_primitives.hpp b/include/xo/procedure2/init_primitives.hpp index d4150d2..5e2d08e 100644 --- a/include/xo/procedure2/init_primitives.hpp +++ b/include/xo/procedure2/init_primitives.hpp @@ -3,13 +3,19 @@ #pragma once #include "DPrimitive.hpp" +#include "DPrimitive_gco_2_gco_gco.hpp" namespace xo { namespace scm { +#ifdef NOT_YET using Primitive_f64_1_f64 = Primitive; using Primitive_f64_2_f64_f64 = Primitive; +#endif struct Primitives { + static DPrimitive_gco_2_gco_gco s_mul_gco_gco_pm; + +#ifdef NOT_YET static Primitive_f64_1_f64 s_neg_f64_pm; static Primitive_f64_2_f64_f64 s_add_f64_f64_pm; @@ -22,6 +28,7 @@ namespace xo { static Primitive_f64_1_f64 s_sin_f64_pm; static Primitive_f64_1_f64 s_cos_f64_pm; static Primitive_f64_1_f64 s_tan_f64_pm; +#endif }; } } diff --git a/src/procedure2/IProcedure_Any.cpp b/src/procedure2/IProcedure_Any.cpp index d28d98e..79b3b77 100644 --- a/src/procedure2/IProcedure_Any.cpp +++ b/src/procedure2/IProcedure_Any.cpp @@ -35,7 +35,7 @@ IProcedure_Any::_valid // nonconst methods auto -IProcedure_Any::apply_nocheck(Opaque, obj, const DArray *) -> obj +IProcedure_Any::apply_nocheck(Opaque, const DArray *) -> obj { _fatal(); } diff --git a/src/procedure2/IProcedure_DPrimitive_gco_2_gco_gco.cpp b/src/procedure2/IProcedure_DPrimitive_gco_2_gco_gco.cpp index 67e73c9..5266477 100644 --- a/src/procedure2/IProcedure_DPrimitive_gco_2_gco_gco.cpp +++ b/src/procedure2/IProcedure_DPrimitive_gco_2_gco_gco.cpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/IProcedure_DPrimitive_gco_2_gco_gco.json5] * 2. jinja2 template for abstract facet .hpp file: @@ -28,9 +28,9 @@ namespace xo { } auto - IProcedure_DPrimitive_gco_2_gco_gco::apply_nocheck(DPrimitive_gco_2_gco_gco & self, obj rcx, const DArray * args) -> obj + IProcedure_DPrimitive_gco_2_gco_gco::apply_nocheck(DPrimitive_gco_2_gco_gco & self, const DArray * args) -> obj { - return self.apply_nocheck(rcx, args); + return self.apply_nocheck(args); } } /*namespace scm*/ diff --git a/src/procedure2/init_primitives.cpp b/src/procedure2/init_primitives.cpp index 35709e0..dbcb3b3 100644 --- a/src/procedure2/init_primitives.cpp +++ b/src/procedure2/init_primitives.cpp @@ -5,10 +5,23 @@ #include "init_primitives.hpp" #include "DPrimitive.hpp" +#include +#include +#include +#include +#include +#include +#include +#include #include namespace xo { + using xo::mm::AAllocator; + using xo::scm::DFloat; + using xo::facet::with_facet; + namespace scm { +#ifdef NOT_YET double neg_f64(double x) { return -x; @@ -23,11 +36,17 @@ namespace xo { sub_f64_f64(double x, double y) { return x - y; } +#endif -#ifdef NOT_YET obj - mul_any_any(obj x_gco, obj y_gco) + mul_gco_gco(obj rcx, + obj x_gco, + obj y_gco) { + using xo::reflect::typeseq; + + obj mm = rcx.allocator(); + // PLACEHOLDER // TODO: @@ -44,20 +63,45 @@ namespace xo { // FOR NOW: just test runtime values // - if (x_tseq == typeseq::id()) { - if (y_tseq == typeseq::id()) { - // unusable placeholder allocator; - obj placeholder_mm; + if (x_tseq == typeseq::id()) { + // i64 * .. + long x = GCObjectConversion::from_gco(mm, x_gco); + if (y_tseq == typeseq::id()) { + // i64 * i64 + long y = GCObjectConversion::from_gco(mm, y_gco); + + return DInteger::box(mm, x * y); + } else if (y_tseq == typeseq::id()) { + // i64 * f64 + double y = GCObjectConversion::from_gco(mm, y_gco); + + return DFloat::box(mm, x * y); + } + } else if (x_tseq == typeseq::id()) { + if (y_tseq == typeseq::id()) { + // f64 * i64. + double x = GCObjectConversion::from_gco(mm, x_gco); + long y = GCObjectConversion::from_gco(mm, y_gco); + + return DFloat::box(mm, x * y); + } else if (y_tseq == typeseq::id()) { // f64 * f64. - double x = GCObjectConversion::from_gco(placeholder_mm, x_gco); - double y = GCObjectConversion::from_gco(placeholder_mm, y_gco); - + double x = GCObjectConversion::from_gco(mm, x_gco); + double y = GCObjectConversion::from_gco(mm, y_gco); + return DFloat::box(mm, x * y); + } + } + // here: error + throw std::runtime_error(tostr("mul_gco_gco: unexpected argument types xt,yt", + xtag("x.tseq", x_tseq), + xtag("y.tseq", y_tseq))); + return obj(); } -#endif +#ifdef NOT_YET double mul_f64_f64(double x, double y) { return x * y; @@ -92,7 +136,12 @@ namespace xo { tan_f64(double x) { return ::tan(x); } +#endif + DPrimitive_gco_2_gco_gco + Primitives::s_mul_gco_gco_pm("_mul", &mul_gco_gco); + +#ifdef NOT_YET Primitive_f64_1_f64 Primitives::s_neg_f64_pm("_neg_d", &neg_f64); @@ -123,6 +172,7 @@ namespace xo { Primitive_f64_1_f64 Primitives::s_tan_f64_pm("_tan_d", &tan_f64); +#endif } /*namespace scm*/ } /*namespace xo*/