diff --git a/include/xo/procedure2/GcPrimitives.hpp b/include/xo/procedure2/GcPrimitives.hpp index 4b134fd..9b64eca 100644 --- a/include/xo/procedure2/GcPrimitives.hpp +++ b/include/xo/procedure2/GcPrimitives.hpp @@ -27,6 +27,10 @@ namespace xo { static DPrimitive_gco_0 * make_report_gc_object_types_pm(obj mm, StringTable * stbl); + /** create primitive: report gc location of a value **/ + static DPrimitive_gco_1_gco * make_gc_location_of_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 76570fa..f693bd0 100644 --- a/src/procedure2/GcPrimitives.cpp +++ b/src/procedure2/GcPrimitives.cpp @@ -58,7 +58,6 @@ namespace xo { obj stats; bool ok = rcx.collector().report_object_types(rcx.allocator(), rcx.error_allocator(), &stats); - if (ok && stats) return stats; } @@ -79,6 +78,33 @@ namespace xo { } + // ----- gc-location-of ----- + + obj + xfer_gc_location_of(obj rcx, obj gco) + { + std::int32_t location_code = 0; + + if (rcx.collector()) { + location_code = rcx.collector().locate_address(gco.data()); + } + + return DInteger::box(rcx.allocator(), location_code); + } + + DPrimitive_gco_1_gco * + GcPrimitives::make_gc_location_of_pm(obj mm, + StringTable * stbl) + { + (void)stbl; + + auto int_ty = DAtomicType::make(mm, Metatype::t_integer()); + auto any_ty = DAtomicType::make(mm, Metatype::t_any()); + auto pm_ty = obj(DFunctionType::_make(mm, int_ty, any_ty)); + + return DPrimitive_gco_1_gco::_make(mm, "gc-location-of", pm_ty, &xfer_gc_location_of); + } + // ----- request-gc ----- obj diff --git a/src/procedure2/SetupProcedure2.cpp b/src/procedure2/SetupProcedure2.cpp index a07a6ff..44d9b3e 100644 --- a/src/procedure2/SetupProcedure2.cpp +++ b/src/procedure2/SetupProcedure2.cpp @@ -142,6 +142,11 @@ namespace xo { GcPrimitives::make_report_gc_object_types_pm(mm, stbl), flags & InstallFlags::f_generalpurpose)); + ok = ok & (PrimitiveRegistry::install_aux + (sink, + GcPrimitives::make_gc_location_of_pm(mm, stbl), + flags & InstallFlags::f_generalpurpose)); + ok = ok & (PrimitiveRegistry::install_aux (sink, GcPrimitives::make_request_gc_pm(mm, stbl),