From b8647c8141be1ebea1ee62e340e15752bdd2c3ab Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Wed, 4 Mar 2026 14:07:08 +1100 Subject: [PATCH] xo-gc: + debug in GCObjectConversion --- include/xo/gc/GCObjectConversion.hpp | 29 ++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/include/xo/gc/GCObjectConversion.hpp b/include/xo/gc/GCObjectConversion.hpp index 8a950c8..53148bf 100644 --- a/include/xo/gc/GCObjectConversion.hpp +++ b/include/xo/gc/GCObjectConversion.hpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace xo { namespace scm { @@ -74,9 +75,33 @@ namespace xo { static obj from_gco(obj, obj gco) { + scope log(XO_DEBUG(false)); + if constexpr (std::is_same_v) { - // trivial conversion - return gco; + // Need accurate handling of DVariantPlaceholder. + // runtime type must be some concrete type. + // Only use obj::from when DRepr is a concrete type + + if constexpr (std::is_same_v) { + // At comptime gco has unknown repr. At runtime + // will have some known repr, which assignment here will transfer + return gco; + } else { + // Runtime conversion to concrete type DRepr + + auto retval = obj::from(gco); + + if (!retval) { + log.retroactively_enable(); + + log && log(xtag("gco.tseq", gco._typeseq())); + log && log(xtag("DRepr.tseq", reflect::typeseq::id())); + } + + assert(retval); + + return retval; + } } else { // both runtime and comptime polymorphism // use same path here, since representation of @p gco