diff --git a/include/xo/procedure2/GcPrimitives.hpp b/include/xo/procedure2/GcPrimitives.hpp new file mode 100644 index 0000000..65ead09 --- /dev/null +++ b/include/xo/procedure2/GcPrimitives.hpp @@ -0,0 +1,30 @@ +/** @file GcPrimitives.hpp + * + * @author Roland Conybeare, Mar 2026 + **/ + +#pragma once + +#include "Primitive_gco_1_gco.hpp" + +namespace xo { + namespace scm { + + /** @rbief primitives centered on gc/ data structures. + * (i.e. X1Collector) + **/ + class GcPrimitives { + public: + using AAllocator = xo::mm::AAllocator; + + public: + /** create primitive: request collection **/ + static DPrimitive_gco_1_gco * make_request_gc_pm(obj mm, + StringTable * stbl); + }; + + } /*namespace scm*/ +} /*namespace xo*/ + + +/* end GcPrimitives.hpp */ diff --git a/src/procedure2/CMakeLists.txt b/src/procedure2/CMakeLists.txt index 2198403..f4314fe 100644 --- a/src/procedure2/CMakeLists.txt +++ b/src/procedure2/CMakeLists.txt @@ -6,6 +6,7 @@ set(SELF_SRCS init_primitives.cpp SetupProcedure2.cpp ObjectPrimitives.cpp + GcPrimitives.cpp PrimitiveRegistry.cpp DPrimitive.cpp DSimpleRcx.cpp diff --git a/src/procedure2/GcPrimitives.cpp b/src/procedure2/GcPrimitives.cpp new file mode 100644 index 0000000..732608d --- /dev/null +++ b/src/procedure2/GcPrimitives.cpp @@ -0,0 +1,55 @@ +/** @file GcPrimitives.cpp + * + * @author Roland Conybeare, Mar 2026 + **/ + +#include "GcPrimitives.hpp" +#include +#include +#include +#include +#include +#include + +namespace xo { + using xo::mm::generation; + + namespace scm { + + // ----- request-gc ----- + + obj + xfer_request_gc(obj rcx, + obj upto_gco) + { + bool have_gc = false; + + if (rcx.collector()) { + generation upto(obj::from(upto_gco)); + + rcx.collector().request_gc(upto); + + have_gc = true; + } + + return DBoolean::box(rcx.allocator(), have_gc); + } + + DPrimitive_gco_1_gco * + GcPrimitives::make_request_gc_pm(obj mm, + StringTable * stbl) + { + (void)stbl; + + auto int_ty = DAtomicType::make(mm, Metatype::t_integer()); + auto bool_ty = DAtomicType::make(mm, Metatype::t_bool()); + auto pm_ty = obj(DFunctionType::_make(mm, + bool_ty, + int_ty)); + + return DPrimitive_gco_1_gco::_make(mm, "request_gc", pm_ty, &xfer_request_gc); + } + } +} + +/* end GcPrimitives.cpp */ diff --git a/src/procedure2/PrimitiveRegistry.cpp b/src/procedure2/PrimitiveRegistry.cpp index ef5cb8c..6e606be 100644 --- a/src/procedure2/PrimitiveRegistry.cpp +++ b/src/procedure2/PrimitiveRegistry.cpp @@ -31,7 +31,7 @@ namespace xo { InstallSink sink, InstallFlags flags) { - scope log(XO_DEBUG(true)); + scope log(XO_DEBUG(false)); bool ok = true; diff --git a/src/procedure2/SetupProcedure2.cpp b/src/procedure2/SetupProcedure2.cpp index 60bd02e..520df9b 100644 --- a/src/procedure2/SetupProcedure2.cpp +++ b/src/procedure2/SetupProcedure2.cpp @@ -6,6 +6,7 @@ #include "SetupProcedure2.hpp" #include "Procedure.hpp" #include "ObjectPrimitives.hpp" +#include "GcPrimitives.hpp" #include "SimpleRcx.hpp" #include "Primitive_gco_0.hpp" #include "Primitive_gco_1_gco.hpp"