From b6353ccc3dce4d7a0e3ff2e5776bea10a50c68dd Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Sun, 29 Mar 2026 17:19:23 -0400 Subject: [PATCH] xo-gc stack: + gc-report-object-types() primitive --- include/xo/procedure2/GcPrimitives.hpp | 4 ++++ src/procedure2/GcPrimitives.cpp | 32 ++++++++++++++++++++++++-- src/procedure2/SetupProcedure2.cpp | 5 ++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/include/xo/procedure2/GcPrimitives.hpp b/include/xo/procedure2/GcPrimitives.hpp index d0a1525..4b134fd 100644 --- a/include/xo/procedure2/GcPrimitives.hpp +++ b/include/xo/procedure2/GcPrimitives.hpp @@ -23,6 +23,10 @@ namespace xo { static DPrimitive_gco_0 * make_report_gc_statistics_pm(obj mm, StringTable * stbl); + /** create primitive: report gc object-type statistics **/ + static DPrimitive_gco_0 * make_report_gc_object_types_pm(obj mm, + StringTable * stbl); + /** create primitive: request collection **/ static DPrimitive_gco_1_gco * make_request_gc_pm(obj mm, StringTable * stbl); diff --git a/src/procedure2/GcPrimitives.cpp b/src/procedure2/GcPrimitives.cpp index 9573f66..76570fa 100644 --- a/src/procedure2/GcPrimitives.cpp +++ b/src/procedure2/GcPrimitives.cpp @@ -25,8 +25,6 @@ namespace xo { xfer_report_gc_statistics(obj rcx) { if (rcx.collector()) { - // status currently only implemented for X1 collector - obj stats; bool ok = rcx.collector().report_statistics(rcx.allocator(), rcx.error_allocator(), @@ -51,6 +49,36 @@ namespace xo { return DPrimitive_gco_0::_make(mm, "report-gc-statistics", pm_ty, &xfer_report_gc_statistics); } + // ----- report-gc-object-types ----- + + obj + xfer_report_gc_object_types(obj rcx) + { + if (rcx.collector()) { + obj stats; + bool ok = rcx.collector().report_object_types(rcx.allocator(), rcx.error_allocator(), &stats); + + + if (ok && stats) + return stats; + } + + return DBoolean::box(rcx.allocator(), false); + } + + DPrimitive_gco_0 * + GcPrimitives::make_report_gc_object_types_pm(obj mm, + StringTable * stbl) + { + (void)stbl; + + auto any_ty = DAtomicType::make(mm, Metatype::t_any()); + auto pm_ty = obj(DFunctionType::_make(mm, any_ty)); + + return DPrimitive_gco_0::_make(mm, "report-gc-object-types", pm_ty, &xfer_report_gc_object_types); + + } + // ----- request-gc ----- obj diff --git a/src/procedure2/SetupProcedure2.cpp b/src/procedure2/SetupProcedure2.cpp index 6772fff..a07a6ff 100644 --- a/src/procedure2/SetupProcedure2.cpp +++ b/src/procedure2/SetupProcedure2.cpp @@ -137,6 +137,11 @@ namespace xo { GcPrimitives::make_report_gc_statistics_pm(mm, stbl), flags & InstallFlags::f_generalpurpose)); + ok = ok & (PrimitiveRegistry::install_aux + (sink, + GcPrimitives::make_report_gc_object_types_pm(mm, stbl), + flags & InstallFlags::f_generalpurpose)); + ok = ok & (PrimitiveRegistry::install_aux (sink, GcPrimitives::make_request_gc_pm(mm, stbl),