From c5e9f1d2ec635ef097c755c50dc264d3ea953c90 Mon Sep 17 00:00:00 2001 From: silverweed Date: Mon, 15 Dec 2025 17:31:20 +0100 Subject: [PATCH] [core] Add TGenericClassInfo::AdoptMemberStreamer() --- core/meta/inc/TGenericClassInfo.h | 3 +++ core/meta/src/TGenericClassInfo.cxx | 21 ++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/core/meta/inc/TGenericClassInfo.h b/core/meta/inc/TGenericClassInfo.h index da75aab3dc652..bcd0fd49901eb 100644 --- a/core/meta/inc/TGenericClassInfo.h +++ b/core/meta/inc/TGenericClassInfo.h @@ -21,6 +21,7 @@ #include "TSchemaHelper.h" #include #include +#include // Forward declarations class TVirtualIsAProxy; @@ -72,6 +73,7 @@ namespace ROOT { std::vector fReadRules; std::vector fReadRawRules; std::vector fAlternate; + std::unordered_map fAdoptedMemberStreamers; public: TGenericClassInfo(const char *fullClassname, @@ -118,6 +120,7 @@ namespace ROOT { TClass *IsA(const void *obj); void AdoptAlternate(ROOT::TClassAlt *alt); + void AdoptMemberStreamer(const char *name, TMemberStreamer *strm); Short_t AdoptStreamer(TClassStreamer*); Short_t AdoptCollectionProxy(TVirtualCollectionProxy*); void AdoptCollectionProxyInfo(Detail::TCollectionProxyInfo*); diff --git a/core/meta/src/TGenericClassInfo.cxx b/core/meta/src/TGenericClassInfo.cxx index 41baf10255b3d..84d905c40290a 100644 --- a/core/meta/src/TGenericClassInfo.cxx +++ b/core/meta/src/TGenericClassInfo.cxx @@ -281,7 +281,11 @@ namespace Internal { fClass->SetConvStreamerFunc(fConvStreamerFunc); fClass->SetMerge(fMerge); fClass->SetResetAfterMerge(fResetAfterMerge); - fClass->AdoptStreamer(fStreamer); fStreamer = nullptr; + fClass->AdoptStreamer(fStreamer); + fStreamer = nullptr; + for (const auto &[name, strm] : fAdoptedMemberStreamers) + fClass->AdoptMemberStreamer(name.c_str(), strm); + fAdoptedMemberStreamers.clear(); // If IsZombie is true, something went wrong and we will not be // able to properly copy the collection proxy if (!fClass->IsZombie()) { @@ -434,6 +438,21 @@ namespace Internal { fAlternate.push_back(alt); } + void TGenericClassInfo::AdoptMemberStreamer(const char *name, TMemberStreamer *strm) + { + if (fClass) { + assert(fAdoptedMemberStreamers.empty()); + fClass->AdoptMemberStreamer(name, strm); + return; + } + + auto [it, inserted] = fAdoptedMemberStreamers.emplace(name, strm); + if (!inserted) { + delete it->second; + it->second = strm; + } + } + void TGenericClassInfo::AdoptCollectionProxyInfo(TCollectionProxyInfo *info) { // Set the info for the CollectionProxy and take ownership of the object