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