From ca45ead7bd03bd95be875d67f0a2323bcfcff5d7 Mon Sep 17 00:00:00 2001 From: Philippe Canal <pcanal@fnal.gov> Date: Fri, 13 Dec 2013 11:31:30 -0600 Subject: [PATCH] Fix autoloading based on a typeinfo. The string based AutoLoading function expect a short normalized type as input, so we need to transformed the demangled name a bit before passing it along. --- core/meta/src/TCling.cxx | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/core/meta/src/TCling.cxx b/core/meta/src/TCling.cxx index a4d9d892d09..f73dd1d34cc 100644 --- a/core/meta/src/TCling.cxx +++ b/core/meta/src/TCling.cxx @@ -3911,7 +3911,32 @@ Int_t TCling::AutoLoad(const type_info& typeinfo) if (err) { return 0; } - return AutoLoad(demangled_name.c_str()); + // AutoLoad expects (because TClass::GetClass already prepares it that way) a + // shortened name. + TClassEdit::TSplitType splitname( demangled_name.c_str(), (TClassEdit::EModType)(TClassEdit::kLong64 | TClassEdit::kDropStd) ); + splitname.ShortType(demangled_name, TClassEdit::kDropStlDefault | TClassEdit::kDropStd); + + // No need to worry anout typedef, they aren't any ... + // But we need to replace basic_string with string. + static const char *full_string_name = "basic_string<char,char_traits<char>,allocator<char> >"; + static const unsigned int full_string_name_len = strlen(full_string_name); + static const char* basic_string_s = "basic_string<char>"; + static const unsigned int basic_string_len = strlen(basic_string_s); + + int pos = 0; + while( (pos = demangled_name.find( basic_string_s,pos) ) >=0 ) { + demangled_name.replace(pos,basic_string_len, "string"); + } + while( (pos = demangled_name.find( full_string_name,pos) ) >=0 ) { + demangled_name.replace(pos,full_string_name_len, "string"); + } + + Int_t result = AutoLoad(demangled_name.c_str()); + if (result == 0) { + demangled_name = TClassEdit::GetLong64_Name(demangled_name); + result = AutoLoad(demangled_name.c_str()); + } + return result; } //______________________________________________________________________________ -- GitLab