103#define RTLD_DEFAULT ((void *)::GetModuleHandle(NULL))
104#define dlsym(library, function_name) ::GetProcAddress((HMODULE)library, function_name)
130 static constexpr const char kUndeterminedClassInfoName[] =
"<NOT YET DETERMINED FROM fClassInfo>";
132 class TMmallocDescTemp {
136 TMmallocDescTemp(
void *value = 0) :
163 auto strLen = strlen(
name);
164 if (strLen == 0)
return;
166 const char* endCharPtr = strchr(
name,
'<');
167 endCharPtr = !endCharPtr ? &
name[strLen] : endCharPtr;
169 const char* beginCharPtr = endCharPtr;
170 while (beginCharPtr!=
name){
171 if (*beginCharPtr==
':'){
177 beginCharPtr = beginCharPtr!=endCharPtr ? beginCharPtr :
name;
178 std::string
s(beginCharPtr, endCharPtr);
180 printf(
"TDeclNameRegistry::AddQualifiedName Adding key %s for class/namespace %s\n",
s.c_str(),
name);
182 fClassNamesSet.insert(
s);
192 found = fClassNamesSet.find(
name) != fClassNamesSet.end();
201 if (fVerbLevel > 1) {
202 printf(
"TDeclNameRegistry Destructor. List of %lu names:\n",
203 (
long unsigned int)fClassNamesSet.size());
204 for (
auto const & key: fClassNamesSet) {
205 printf(
" - %s\n", key.c_str());
237 ObjRepoValue(
const TClass *what,
Version_t version) : fClass(what),fVersion(version) {}
262 std::pair<RepoCont_t::iterator, Bool_t> tmp =
gObjectVersionRepository.insert(RepoCont_t::value_type>(location, RepoCont_t::mapped_type(what,version)));
264 Warning(where,
"Reregistering an object of class '%s' version %d at address %p", what->
GetName(), version, p);
268 Warning(where,
"Failed to reregister an object of class '%s' version %d at address %p", what->
GetName(), version, location);
281 RepoCont_t::iterator tmp = cur++;
282 if ((tmp->first == location) && (tmp->second.fVersion == what->
GetClassVersion())) {
298 size_t objsize = what->
Size();
299 long delta = (
char*)newadd - (
char*)oldadd;
303 RepoCont_t::iterator tmp = cur++;
304 if (oldadd <= tmp->
first && tmp->first < ( ((
char*)oldadd) + objsize) ) {
307 gObjectVersionRepository.insert(RepoCont_t::value_type(((
char*)tmp->first)+delta, RepoCont_t::mapped_type(tmp->second.fClass,tmp->second.fVersion)));
320#define R__USE_STD_MAP
321 class TMapTypeToTClass {
322#if defined R__USE_STD_MAP
326 typedef std::map<std::string,TClass*>
IdMap_t;
327 typedef IdMap_t::key_type key_type;
328 typedef IdMap_t::const_iterator const_iterator;
329 typedef IdMap_t::size_type size_type;
332 typedef TClass* mapped_type;
334 typedef IdMap_t::mapped_type mapped_type;
341 void Add(
const key_type &key, mapped_type &obj)
346 mapped_type
Find(
const key_type &key)
const
349 IdMap_t::const_iterator iter = fMap.find(key);
351 if (iter != fMap.end()) cl = iter->second;
354 void Remove(
const key_type &key) {
363#ifdef R__COMPLETE_MEM_TERMINATION
372 void Add(
const char *key,
TClass *&obj) {
374 fMap.Add(realkey, obj);
377 const TPair *
a = (
const TPair *)fMap.FindObject(key);
381 void Remove(
const char *key) {
383 TObject *actual = fMap.Remove(&realkey);
389 class TMapDeclIdToTClass {
392 typedef multimap<TDictionary::DeclId_t, TClass*>
DeclIdMap_t;
393 typedef DeclIdMap_t::key_type key_type;
394 typedef DeclIdMap_t::mapped_type mapped_type;
395 typedef DeclIdMap_t::const_iterator const_iterator;
396 typedef std::pair <const_iterator, const_iterator> equal_range;
397 typedef DeclIdMap_t::size_type size_type;
403 void Add(
const key_type &key, mapped_type obj)
406 std::pair<const key_type, mapped_type> pair = make_pair(key, obj);
409 size_type CountElementsWithKey(
const key_type &key)
411 return fMap.count(key);
413 equal_range
Find(
const key_type &key)
const
416 return fMap.equal_range(key);
418 void Remove(
const key_type &key) {
427#ifdef R__COMPLETE_MEM_TERMINATION
429 return &gIdMapObject;
438#ifdef R__COMPLETE_MEM_TERMINATION
440 return &gDeclIdMapObject;
455 gROOT->GetListOfClasses()->Add(cl);
469 if (!cl || !
id)
return;
481 gROOT->GetListOfClasses()->Remove(oldcl);
513 TDumpMembers(
bool noAddr): fNoAddr(noAddr) { }
530void TDumpMembers::Inspect(
TClass *cl,
const char *pname,
const char *mname,
const void *add,
Bool_t )
532 const Int_t kvalue = 30;
534 const Int_t ktitle = 50;
536 const Int_t ktitle = 42;
538 const Int_t kline = 1024;
546 const char *memberName;
547 const char *memberFullTypeName;
548 const char *memberTitle;
553 if (member->GetDataType()) {
554 memberDataType = (
EDataType)member->GetDataType()->GetType();
556 memberName = member->GetName();
557 memberFullTypeName = member->GetFullTypeName();
558 memberTitle = member->GetTitle();
559 isapointer = member->IsaPointer();
560 isbasic = member->IsBasic();
567 const char *cursor = mname;
568 while ( (*cursor)==
'*' ) ++cursor;
570 Ssiz_t pos = elname.Index(
"[");
571 if ( pos !=
kNPOS ) {
572 elname.Remove( pos );
575 if (!element)
return;
580 memberName = element->
GetName();
583 membertype =
gROOT->GetType(memberFullTypeName);
585 isbasic = membertype !=0;
592 if (strcmp(memberName,
"fDatime") == 0 && memberDataType ==
kUInt_t) {
596 if (strcmp(memberName,
"fBits") == 0 && memberDataType ==
kUInt_t) {
601 static TClassRef stdClass(
"std::string");
602 Bool_t isStdString = (dataClass == stdClass);
605 for (i = 0;i < kline; i++)
line[i] =
' ';
611 char *pointer = (
char*)add;
612 char **ppointer = (
char**)(pointer);
615 char **p3pointer = (
char**)(*ppointer);
622 }
else if (membertype) {
624 i = strlen(*ppointer);
625 if (kvalue+i > kline) i=kline-1-kvalue;
627 for (
Int_t j = 0; j < i; j++) {
628 if (!std::isprint((*ppointer)[j])) {
634 strncpy(
line + kvalue, *ppointer, i);
642 }
else if (!strcmp(memberFullTypeName,
"char*") ||
643 !strcmp(memberFullTypeName,
"const char*")) {
644 i = strlen(*ppointer);
645 if (kvalue+i >= kline) i=kline-1-kvalue;
647 for (
Int_t j = 0; j < i; j++) {
648 if (!std::isprint((*ppointer)[j])) {
654 strncpy(
line + kvalue, *ppointer, std::min( i, kline - kvalue));
664 }
else if (membertype) {
666 cdatime = (
UInt_t*)pointer;
668 snprintf(&
line[kvalue],kline-kvalue,
"%d/%d",cdate,ctime);
676 std::string *str = (std::string*)pointer;
678 }
else if (isTString) {
688 if (isdate ==
kFALSE && strcmp(memberFullTypeName,
"char*") && strcmp(memberFullTypeName,
"const char*")) {
689 i = strlen(&
line[0]);
line[i] =
' ';
690 assert(250 > ktitle);
691 strlcpy(&
line[ktitle],memberTitle,250-ktitle+1);
713 void *fRealDataObject;
717 TBuildRealData(
void *obj,
TClass *cl) {
719 fRealDataObject = obj;
730void TBuildRealData::Inspect(
TClass* cl,
const char* pname,
const char* mname,
const void* add,
Bool_t isTransient)
742 isTransientMember =
kTRUE;
749 if (cl != fRealDataClass) {
750 if (!fRealDataClass->InheritsFrom(cl)) {
751 Ssiz_t dot = rname.Index(
'.');
756 if (!fRealDataClass->GetDataMember(rname)) {
771 if (!fRealDataClass->GetBaseDataMember(rname)) {
786 fRealDataClass->GetListOfRealData()->Add(rd);
796 fRealDataClass->GetListOfRealData()->Add(rd);
841 void* addrForRecursion = 0;
842 if (GetObjectValidity() == kValidObjectGiven)
843 addrForRecursion =
const_cast<void*
>(add);
850 fRealDataClass->GetListOfRealData()->Add(rd);
867 fBrowser =
b; fCount = 0; }
868 virtual ~TAutoInspector() { }
871 virtual Bool_t IsTreatingNonAccessibleTypes() {
return kFALSE;}
877void TAutoInspector::Inspect(
TClass *cl,
const char *tit,
const char *
name,
878 const void *addr,
Bool_t )
880 if(tit && strchr(tit,
'.')) return ;
881 if (fCount && !fBrowser)
return;
888 int ln = strcspn(
name,
"[ ");
892 if (!classInfo)
return;
902 if ((found = (iname==mname)))
break;
914 if (mname ==
"G__virtualinfo")
return;
916 int size =
sizeof(
void*);
936 for(
int i=0; i<nmax; i++) {
938 char *ptr = (
char*)addr + i*size;
945 if (!fBrowser)
return;
953 bwname = actualClass->
GetName();
962 int l = strcspn(bwname.
Data(),
"[ ");
963 if (
l<bwname.
Length() && bwname[
l]==
'[') {
964 char cbuf[13];
snprintf(cbuf,13,
"[%02d]",i);
967 bwname = (
const char*)ts;
973 fBrowser->Add(obj,clm,bwname);
980 fBrowser->Add( obj, clm, bwname );
986 int sz = proxy->
Size();
988 char fmt[] = {
"#%09d"};
989 fmt[3] =
'0'+(int)
log10(
double(sz))+1;
991 for (
int ii=0;ii<sz;ii++) {
992 void *p = proxy->
At(ii);
1004 fBrowser->Add( p, actualCl, ts );
1043 TMmallocDescTemp setreset;
1060 fStreamerInfo(0), fConversionStreamerInfo(0), fRealData(0),
1061 fBase(0), fData(0), fEnums(0), fFuncTemplate(0), fMethod(0), fAllPubData(0),
1062 fAllPubMethod(0), fClassMenuList(0),
1063 fDeclFileName(
""), fImplFileName(
""), fDeclFileLine(0), fImplFileLine(0),
1064 fInstanceCount(0), fOnHeap(0),
1065 fCheckSum(0), fCollectionProxy(0), fClassVersion(0), fClassInfo(0),
1066 fTypeInfo(0), fShowMembers(0),
1067 fStreamer(0), fIsA(0), fGlobalIsA(0), fIsAMethod(0),
1068 fMerge(0), fResetAfterMerge(0), fNew(0), fNewArray(0), fDelete(0), fDeleteArray(0),
1069 fDestructor(0), fDirAutoAdd(0), fStreamerFunc(0), fConvStreamerFunc(0), fSizeof(-1),
1070 fCanSplit(-1), fProperty(0), fClassProperty(0), fHasRootPcmInfo(
kFALSE), fCanLoadClassInfo(
kFALSE),
1071 fIsOffsetStreamerSet(
kFALSE), fVersionUsed(
kFALSE), fRuntimeProperties(0), fOffsetStreamer(0), fStreamerType(
TClass::
kDefault),
1073 fCurrentInfo(0), fLastReadInfo(0), fRefProxy(0),
1074 fSchemaRules(0), fStreamerImpl(&
TClass::StreamerDefault)
1079 ::Fatal(
"TClass::TClass",
"ROOT system not initialized");
1082 TMmallocDescTemp setreset;
1089 ::Fatal(
"TClass::TClass",
"gInterpreter not initialized");
1093 ::Warning(
"TClass::TClass",
"no dictionary for class %s is available",
name);
1107 fStreamerInfo(0), fConversionStreamerInfo(0), fRealData(0),
1108 fBase(0), fData(0), fEnums(0), fFuncTemplate(0), fMethod(0), fAllPubData(0),
1109 fAllPubMethod(0), fClassMenuList(0),
1110 fDeclFileName(
""), fImplFileName(
""), fDeclFileLine(0), fImplFileLine(0),
1111 fInstanceCount(0), fOnHeap(0),
1112 fCheckSum(0), fCollectionProxy(0), fClassVersion(0), fClassInfo(0),
1113 fTypeInfo(0), fShowMembers(0),
1114 fStreamer(0), fIsA(0), fGlobalIsA(0), fIsAMethod(0),
1115 fMerge(0), fResetAfterMerge(0), fNew(0), fNewArray(0), fDelete(0), fDeleteArray(0),
1116 fDestructor(0), fDirAutoAdd(0), fStreamerFunc(0), fConvStreamerFunc(0), fSizeof(-1),
1117 fCanSplit(-1), fProperty(0), fClassProperty(0), fHasRootPcmInfo(
kFALSE), fCanLoadClassInfo(
kFALSE),
1118 fIsOffsetStreamerSet(
kFALSE), fVersionUsed(
kFALSE), fRuntimeProperties(0), fOffsetStreamer(0), fStreamerType(
TClass::
kDefault),
1120 fCurrentInfo(0), fLastReadInfo(0), fRefProxy(0),
1121 fSchemaRules(0), fStreamerImpl(&
TClass::StreamerDefault)
1124 Init(
name, cversion, 0, 0, 0, 0, -1, -1, 0, silent);
1134 fStreamerInfo(0), fConversionStreamerInfo(0), fRealData(0),
1135 fBase(0), fData(0), fEnums(0), fFuncTemplate(0), fMethod(0), fAllPubData(0),
1136 fAllPubMethod(0), fClassMenuList(0),
1137 fDeclFileName(
""), fImplFileName(
""), fDeclFileLine(0), fImplFileLine(0),
1138 fInstanceCount(0), fOnHeap(0),
1139 fCheckSum(0), fCollectionProxy(0), fClassVersion(0), fClassInfo(0),
1140 fTypeInfo(0), fShowMembers(0),
1141 fStreamer(0), fIsA(0), fGlobalIsA(0), fIsAMethod(0),
1142 fMerge(0), fResetAfterMerge(0), fNew(0), fNewArray(0), fDelete(0), fDeleteArray(0),
1143 fDestructor(0), fDirAutoAdd(0), fStreamerFunc(0), fConvStreamerFunc(0), fSizeof(-1),
1144 fCanSplit(-1), fProperty(0), fClassProperty(0), fHasRootPcmInfo(
kFALSE), fCanLoadClassInfo(
kFALSE),
1145 fIsOffsetStreamerSet(
kFALSE), fVersionUsed(
kFALSE), fRuntimeProperties(0), fOffsetStreamer(0), fStreamerType(
TClass::
kDefault),
1147 fCurrentInfo(0), fLastReadInfo(0), fRefProxy(0),
1148 fSchemaRules(0), fStreamerImpl(&
TClass::StreamerDefault)
1160 "A TClass entry cannot be initialized in a state different from kForwardDeclared or kEmulated.");
1161 Init(
name, cversion, 0, 0, 0, 0, -1, -1, 0, silent);
1178 fStreamerInfo(0), fConversionStreamerInfo(0), fRealData(0),
1179 fBase(0), fData(0), fEnums(0), fFuncTemplate(0), fMethod(0), fAllPubData(0),
1180 fAllPubMethod(0), fClassMenuList(0),
1181 fDeclFileName(
""), fImplFileName(
""), fDeclFileLine(0), fImplFileLine(0),
1182 fInstanceCount(0), fOnHeap(0),
1183 fCheckSum(0), fCollectionProxy(0), fClassVersion(0), fClassInfo(0),
1184 fTypeInfo(0), fShowMembers(0),
1185 fStreamer(0), fIsA(0), fGlobalIsA(0), fIsAMethod(0),
1186 fMerge(0), fResetAfterMerge(0), fNew(0), fNewArray(0), fDelete(0), fDeleteArray(0),
1187 fDestructor(0), fDirAutoAdd(0), fStreamerFunc(0), fConvStreamerFunc(0), fSizeof(-1),
1188 fCanSplit(-1), fProperty(0), fClassProperty(0), fHasRootPcmInfo(
kFALSE), fCanLoadClassInfo(
kFALSE),
1189 fIsOffsetStreamerSet(
kFALSE), fVersionUsed(
kFALSE), fRuntimeProperties(0), fOffsetStreamer(0), fStreamerType(
TClass::
kDefault),
1191 fCurrentInfo(0), fLastReadInfo(0), fRefProxy(0),
1192 fSchemaRules(0), fStreamerImpl(&
TClass::StreamerDefault)
1197 ::Fatal(
"TClass::TClass",
"ROOT system not initialized");
1203 ::Fatal(
"TClass::TClass",
"gInterpreter not initialized");
1205 if (!classInfo || !
gInterpreter->ClassInfo_IsValid(classInfo)) {
1212 Init(
fName, cversion, 0, 0, dfil, ifil, dl, il, classInfo, silent);
1228 fStreamerInfo(0), fConversionStreamerInfo(0), fRealData(0),
1229 fBase(0), fData(0), fEnums(0), fFuncTemplate(0), fMethod(0), fAllPubData(0),
1230 fAllPubMethod(0), fClassMenuList(0),
1231 fDeclFileName(
""), fImplFileName(
""), fDeclFileLine(0), fImplFileLine(0),
1232 fInstanceCount(0), fOnHeap(0),
1233 fCheckSum(0), fCollectionProxy(0), fClassVersion(0), fClassInfo(0),
1234 fTypeInfo(0), fShowMembers(0),
1235 fStreamer(0), fIsA(0), fGlobalIsA(0), fIsAMethod(0),
1236 fMerge(0), fResetAfterMerge(0), fNew(0), fNewArray(0), fDelete(0), fDeleteArray(0),
1237 fDestructor(0), fDirAutoAdd(0), fStreamerFunc(0), fConvStreamerFunc(0), fSizeof(-1),
1238 fCanSplit(-1), fProperty(0), fClassProperty(0), fHasRootPcmInfo(
kFALSE), fCanLoadClassInfo(
kFALSE),
1239 fIsOffsetStreamerSet(
kFALSE), fVersionUsed(
kFALSE), fRuntimeProperties(0), fOffsetStreamer(0), fStreamerType(
TClass::
kDefault),
1241 fCurrentInfo(0), fLastReadInfo(0), fRefProxy(0),
1242 fSchemaRules(0), fStreamerImpl(&
TClass::StreamerDefault)
1245 Init(
name,cversion, 0, 0, dfil, ifil, dl, il, 0, silent);
1254 const char *dfil,
const char *ifil,
Int_t dl,
Int_t il,
1258 fStreamerInfo(0), fConversionStreamerInfo(0), fRealData(0),
1259 fBase(0), fData(0), fEnums(0), fFuncTemplate(0), fMethod(0), fAllPubData(0),
1262 fDeclFileName(
""), fImplFileName(
""), fDeclFileLine(0), fImplFileLine(0),
1263 fInstanceCount(0), fOnHeap(0),
1264 fCheckSum(0), fCollectionProxy(0), fClassVersion(0), fClassInfo(0),
1265 fTypeInfo(0), fShowMembers(0),
1266 fStreamer(0), fIsA(0), fGlobalIsA(0), fIsAMethod(0),
1267 fMerge(0), fResetAfterMerge(0), fNew(0), fNewArray(0), fDelete(0), fDeleteArray(0),
1268 fDestructor(0), fDirAutoAdd(0), fStreamerFunc(0), fConvStreamerFunc(0), fSizeof(-1),
1269 fCanSplit(-1), fProperty(0), fClassProperty(0), fHasRootPcmInfo(
kFALSE), fCanLoadClassInfo(
kFALSE),
1270 fIsOffsetStreamerSet(
kFALSE), fVersionUsed(
kFALSE), fRuntimeProperties(0), fOffsetStreamer(0), fStreamerType(
TClass::
kDefault),
1271 fState(kHasTClassInit),
1272 fCurrentInfo(0), fLastReadInfo(0), fRefProxy(0),
1273 fSchemaRules(0), fStreamerImpl(&
TClass::StreamerDefault)
1277 Init(
name, cversion, &info, isa, dfil, ifil, dl, il, 0, silent);
1295 info->
Clear(
"build");
1311 const char *dfil,
const char *ifil,
Int_t dl,
Int_t il,
1312 ClassInfo_t *givenInfo,
1316 ::Fatal(
"TClass::TClass",
"ROOT system not initialized");
1318 ::Error(
"TClass::Init",
"The name parameter is invalid (null or empty)");
1352 TClass **persistentRef = 0;
1370 info->
Clear(
"build");
1388 (*fMethod).fClass =
this;
1400 ::Fatal(
"TClass::Init",
"gInterpreter not initialized");
1403 bool invalid = !
gInterpreter->ClassInfo_IsValid(givenInfo);
1404 bool notloaded = !
gInterpreter->ClassInfo_IsLoaded(givenInfo);
1405 auto property =
gInterpreter->ClassInfo_Property(givenInfo);
1407 if (invalid || (notloaded && (property &
kIsNamespace)) ||
1474 ::Error(
"TClass::Init",
"no interpreter information for class %s is available even though it has a TClass "
1475 "initialization routine.",
1493 if (!givenInfo && strchr (
name,
'<')) {
1505 if (resolvedThis !=
name) {
1529 if (resolvedThis !=
fName) {
1530 oldcl = (
TClass*)
gROOT->GetListOfClasses()->FindObject(resolvedThis);
1531 if (oldcl && oldcl !=
this) {
1538 if (resolvedThis != htmp->String())
continue;
1539 oldcl = (
TClass*)
gROOT->GetListOfClasses()->FindObject(htmp->fOrigName);
1540 if (oldcl && oldcl !=
this) {
1558 if (persistentRef) {
1565 if ( isStl || !strncmp(
GetName(),
"stdext::hash_",13) || !strncmp(
GetName(),
"__gnu_cxx::hash_",16) ) {
1576 }
else if (!silent) {
1577 Warning(
"Init",
"Collection proxy for %s was not properly initialized!",
GetName());
1583 }
else if (!strncmp(
GetName(),
"std::pair<",10) || !strncmp(
GetName(),
"pair<",5) ) {
1603 if (resolvedThis == htmp->String() && htmp->fOrigName ==
GetName()) {
1670 std::map<std::string, TObjArray*>::iterator it;
1671 std::map<std::string, TObjArray*>::iterator end = (*fConversionStreamerInfo).end();
1672 for( it = (*fConversionStreamerInfo).begin(); it != end; ++it ) {
1682 Int_t ReadRulesContent(FILE *
f)
1694 while ((
c = fgetc(
f)) != EOF) {
1700 if (rule.Length() > 0) {
1752 static const char *suffix =
"class.rules";
1758 FILE *
f = fopen(sname,
"r");
1760 res = ReadRulesContent(
f);
1763 ::Error(
"TClass::ReadRules()",
"Cannot find rules file %s", sname.
Data());
1776 if (!filename || !filename[0]) {
1777 ::Error(
"TClass::ReadRules",
"no file name specified");
1781 FILE *
f = fopen(filename,
"r");
1783 ::Error(
"TClass::ReadRules",
"Failed to open %s\n",filename);
1786 Int_t count = ReadRulesContent(
f);
1839 ::Warning(
"TClass::AddRule",
"The rule for class: \"%s\": version, \"%s\" and data members: \"%s\" has been skipped because it conflicts with one of the other rules (%s).",
1900 TAutoInspector insp(
b);
1901 obj->ShowMembers(insp);
1922 }
else if (actual !=
this) {
1923 return actual->
Browse(obj,
b);
1929 TAutoInspector insp(
b);
1972 isTransient =
kTRUE;
1977 TMmallocDescTemp setreset;
1988 static TClassRef clRefString(
"std::string");
1989 if (clRefString ==
this) {
1998 && strncmp(
GetName(),
"pair<", 5) != 0) {
1999 Error(
"BuildRealData",
"Inspection for %s not supported!",
GetName());
2005 TBuildRealData brd(pointer,
this);
2011 if ( isTransient ) {
2019 Error(
"BuildRealData",
"Cannot find any ShowMembers function for %s!",
GetName());
2034 c->BuildRealData(0, isTransient);
2054 Error(
"BuildEmulatedRealData",
"Missing StreamerInfo for %s",
GetName());
2120 TMmallocDescTemp setreset;
2147 if (strcmp(
GetName(),
"string") == 0) {
2155 gInterpreter->InspectMembers(insp, obj,
this, isTransient);
2159 sinfo->CallShowMembers(obj, insp, isTransient);
2174 return gInterpreter->InspectMembers(insp, obj,
this, isTransient);
2238 }
else if (!
c->CanSplitBaseAllow()) {
2282 static TClassRef stdStringClass(
"std::string");
2347 if (new_name == 0 || new_name[0]==
'\0' ||
fName == new_name) {
2348 Error(
"Clone",
"The name of the class must be changed when cloning a TClass object.");
2378 copy->
fName = new_name;
2433 if (!padsav || !opt.
Contains(
"same")) {
2436 gROOT->ProcessLine(
"new TCanvas(\"R__class\",\"class\",20,20,1000,750);");
2442 if (
gPad)
gPad->DrawClassObject(
this,option);
2444 if (padsav) padsav->
cd();
2485 if (
sizeof(
this) == 4)
2488 Printf(
"==> Dumping object at: 0x%016lx, name=%s, class=%s\n",prObj,tobj->
GetName(),
GetName());
2491 if (
sizeof(
this) == 4)
2492 Printf(
"==> Dumping object at: 0x%08lx, class=%s\n",prObj,
GetName());
2494 Printf(
"==> Dumping object at: 0x%016lx, class=%s\n",prObj,
GetName());
2497 TDumpMembers dm(noAddr);
2499 Info(
"Dump",
"No ShowMembers function, dumping disabled");
2509 static const UInt_t maxsize = 255;
2510 static char name[maxsize+2];
2514 for (
UInt_t i = 0; i < nch && icur < maxsize; ++i, ++icur) {
2515 if (
text[i] ==
'\"' ||
text[i] ==
'[' ||
text[i] ==
'~' ||
2518 text[i] ==
'?' ||
text[i] ==
'>') {
2548 if (
object==0)
return (
TClass*)
this;
2550 return (*
fIsA)(object);
2561 return realTObject->IsA();
2578 return (*
fIsA)(object);
2596 if (strcmp(
GetName(), classname) == 0)
return this;
2615 if (cl ==
this)
return this;
2627 if (cl ==
c)
return c;
2628 c1 =
c->GetBaseClass(cl);
2646 if (cl ==
this)
return 0;
2648 if (!
fBase.load()) {
2655 if (!sinfo)
return -1;
2661 for(
Int_t i=0; i<size; i++) {
2667 if (!baseclass)
return -1;
2669 if (subOffset == -2)
return -2;
2670 if (subOffset != -1)
return offset+subOffset;
2671 offset += baseclass->
Size();
2675 if (!baseclass)
return -1;
2677 if (subOffset == -2)
return -2;
2678 if (subOffset != -1)
return offset+subOffset;
2679 offset += baseclass->
Size();
2682 Error(
"GetBaseClassOffsetRecurse",
"Unexpected element type for base class: %s\n",element->IsA()->
GetName());
2694 if (
fBase.load() == 0)
2697 lnk =
fBase.load()->FirstLink();
2713 off =
c->GetBaseClassOffsetRecurse(cl);
2714 if (off == -2)
return -2;
2733 if (
this == toBase)
return 0;
2749 if(derived && base) {
2771 if (dm)
return this;
2779 TClass *cdm =
c->GetBaseDataMember(datamember);
2780 if (cdm)
return cdm;
2791 struct TClassLocalStorage {
2792 TClassLocalStorage() : fCollectionProxy(0), fStreamer(0) {};
2797 static TClassLocalStorage *GetStorage(
const TClass *cl)
2803 if (*thread_ptr==0) *thread_ptr =
new TExMap();
2810 local = (
ULong_t)
new TClassLocalStorage();
2813 return (TClassLocalStorage*)local;
2841 TClassLocalStorage *local = TClassLocalStorage::GetStorage(
this);
2844 return local->fCollectionProxy;
2855 TClassLocalStorage *local = TClassLocalStorage::GetStorage(
this);
2857 if (local->fStreamer==0) {
2859 const std::type_info &orig = (
typeid(*fStreamer) );
2860 if (!local->fStreamer) {
2861 Warning(
"GetStreamer",
"For %s, the TClassStreamer (%s) passed's call to Generate failed!",
GetName(),orig.name());
2863 const std::type_info © = (
typeid(*local->fStreamer) );
2864 if (strcmp(orig.name(),copy.name())!=0) {
2865 Warning(
"GetStreamer",
"For %s, the TClassStreamer passed does not properly implement the Generate method (%s vs %s)\n",
GetName(),orig.name(),copy.name());
2869 return local->fStreamer;
2910 if (strstr(
name,
"(anonymous)"))
return 0;
2911 if (strncmp(
name,
"class ",6)==0)
name += 6;
2912 if (strncmp(
name,
"struct ",7)==0)
name += 7;
2914 if (!
gROOT->GetListOfClasses())
return 0;
2960 if (!cl && !load)
return 0;
2962 TClass *loadedcl = (dict)();
2972 std::string normalizedName;
2981 if (normalizedName !=
name) {
2982 cl = (
TClass*)
gROOT->GetListOfClasses()->FindObject(normalizedName.c_str());
2993 normalizedName = cl->
GetName();
2994 checkTable = load && (normalizedName !=
name);
2997 if (!load)
return 0;
3023 if (
TDataType* theDataType =
gROOT->GetType(normalizedName.c_str())){
3025 auto underlyingTypeName = theDataType->GetTypeName();
3028 if (underlyingTypeDict){
3029 loadedcl = underlyingTypeDict();
3035 if (loadedcl)
return loadedcl;
3039 if (loadedcl)
return loadedcl;
3052 std::string::size_type posLess = normalizedName.find(
'<');
3053 if (posLess != std::string::npos) {
3060 printf(
"TClass::GetClass: Header Parsing - The representation of %s was not found in the type system. A lookup in the interpreter is about to be tried: this can cause parsing. This can be avoided selecting %s in the linkdef/selection file.\n",normalizedName.c_str(), normalizedName.c_str());
3062 if (normalizedName.length()) {
3072 auto ci =
gInterpreter->ClassInfo_Factory(normalizedName.c_str());
3074 auto method =
gInterpreter->MethodInfo_Factory(funcDecl);
3080 funcPtr(0, 0,
nullptr, &res);
3092 std::string alternative;
3093 gInterpreter->GetInterpreterTypeName(normalizedName.c_str(), alternative,
kTRUE);
3094 const char *altname = alternative.c_str();
3095 if (strncmp(altname,
"std::", 5) == 0) {
3100 if (altname != normalizedName && strcmp(altname,
name) != 0) {
3127 if (!
gROOT->GetListOfClasses())
3135 if (cl && cl->
IsLoaded())
return cl;
3142 cl =
GetIdMap()->Find(typeinfo.name());
3161 if (!load)
return 0;
3171 TIter next(
gROOT->GetListOfClassGenerators());
3183 if (!autoload_old) {
3214 if (!
gROOT->GetListOfClasses())
return 0;
3235 if (!load)
return 0;
3238 if (cl) loadedcl =
gROOT->LoadClass(cl->
GetName(),silent);
3239 else loadedcl =
gROOT->LoadClass(
name,silent);
3241 if (loadedcl)
return loadedcl;
3266 if (!
gROOT->GetListOfClasses())
return 0;
3270 DeclIdMap_t::equal_range iter = map->Find(
id);
3271 if (iter.first == iter.second)
return false;
3272 std::vector<TClass*>::iterator vectIt = classes.begin();
3273 for (DeclIdMap_t::const_iterator it = iter.first; it != iter.second; ++it)
3274 vectIt = classes.insert(vectIt, it->second);
3302 || datamember == 0)
return 0;
3305 const char *start_name = datamember;
3306 while (*start_name ==
'*') ++start_name;
3311 if (
const char *
s = strchr(start_name,
'[')){
3341 if (strchr(
name,
'[')==0) {
3383 std::string givenName(
name);
3386 std::string::size_type firstBracket = givenName.find_first_of(
"[");
3387 if (firstBracket != std::string::npos) {
3389 std::string nameNoDim(givenName.substr(0, firstBracket));
3393 std::string objName(obj->
GetName());
3394 std::string::size_type pos = objName.find_first_of(
"[");
3396 if (pos != std::string::npos) {
3398 if (objName == nameNoDim) {
3407 std::ostringstream ptrname;
3408 ptrname <<
"*" << givenName;
3415 std::string::size_type firstDot = givenName.find_first_of(
".");
3416 if (firstDot == std::string::npos) {
3427 std::string::size_type lastDot = givenName.find_last_of(
".");
3428 std::ostringstream starname;
3429 starname << givenName.substr(0, lastDot) <<
".*" << givenName.substr(lastDot + 1);
3445 std::string::size_type bracket = starname.str().find_first_of(
"[");
3446 if (bracket != std::string::npos) {
3455 std::string firstDotName(givenName.substr(firstDot + 1));
3498 if (!
fBase.load()) {
3523 Fatal(
"GetListOfBases",
"gInterpreter not initialized");
3526 if (!
fBase.load()) {
3552 auto temp =
fEnums.load();
3554 if (requestListLoading) {
3569 if (!requestListLoading) {
3576 static bool fromRootCling = dlsym(RTLD_DEFAULT,
"usedToIdentifyRootClingByDlSym");
3661 if (
gDebug>0)
Info(
"GetListOfMethods",
"Header Parsing - Asking for all the methods of class %s: this can involve parsing.",
GetName());
3694 if (
gDebug>0)
Info(
"GetListOfAllPublicMethods",
"Header Parsing - Asking for all the methods of class %s: this can involve parsing.",
GetName());
3724 while ((baseClass = (
TBaseClass *) nextBase())) {
3732 while ((method = (
TMethod*)next())) {
3738 if (
m &&
m->GetNargs() == method->
GetNargs())
3763 return cl->IsLoaded();
3791 TIter nextMemb(ldm);
3822 for (
int i = 0; i < 2; i++) {
3838 if (
this == sCIString)
return;
3850 auto checkDicts = [&](
const string &clName){
3857 if (cl && !cl->HasDictionary()) {
3858 cl->GetMissingDictionariesWithRecursionCheck(result, visited, recurse);
3862 const auto &elements = splitType.
fElements;
3863 const auto &templName = elements[0];
3866 if (templName ==
"pair") {
3874 if (templName ==
"unique_ptr" || templName ==
"array") {
3875 checkDicts(elements[1]);
3882 if (templName ==
"tuple") {
3885 const auto nTemplArgs = elements.size() - 1;
3887 for (
auto iTemplArg = 1U; iTemplArg < nTemplArgs; ++iTemplArg) {
3888 checkDicts(elements[iTemplArg]);
3937 if (
this == sCIString)
return;
3941 if (strncmp(
fName,
"pair<", 5) == 0) {
3995 while ((acl = (
TClass*)nextClass())) {
3996 if (acl == newcl)
continue;
4001 info->
Update(
this, newcl);
4005 TIter delIter( &tobedeleted );
4006 while ((acl = (
TClass*)delIter())) {
4017 Warning(
"ResetClassInfo(Long_t tagnum)",
"Call to deprecated interface (does nothing)");
4068 (*fMethod).Unload();
4102 if (options==0 || options[0]==0)
return;
4104 if (strstr(options,
"streamerinfo")!=0) {
4108 std::map<std::string, TObjArray*>::iterator it;
4109 std::map<std::string, TObjArray*>::iterator end = (*fConversionStreamerInfo).end();
4110 for( it = (*fConversionStreamerInfo).begin(); it != end; ++it ) {
4111 it->second->ls(options);
4138 TIter next(methodList);
4140 while ((method = (
TMethod*) next())) {
4142 if (classPtr != method->
GetClass()) {
4150 TIter nextarg(margsList);
4151 while ((methodArg = (
TMethodArg*)nextarg())) {
4201 if(
fMethod.compare_exchange_strong(expected, temp.get()) ) {
4237 m =
c->GetMethodAllAny(method);
4259 Fatal(
"GetMethod",
"gInterpreter not initialized");
4265 if (!decl)
return 0;
4272 "\nDid not find matching TMethod <%s> with \"%s\" %sfor %s",
4273 method,params,objectIsConst ?
"const " :
"",
GetName());
4283 return static_cast<TMethod *
>(method);
4287 if (
TFunction* method = base->FindClassOrBaseMethodWithId(declId))
4288 return static_cast<TMethod *
>(method);
4305 Fatal(
"GetMethodWithPrototype",
"gInterpreter not initialized");
4309 objectIsConst, mode);
4311 if (!decl)
return 0;
4314 Error(
"GetMethodWithPrototype",
4315 "\nDid not find matching TMethod <%s> with \"%s\" %sfor %s",
4316 method,
proto,objectIsConst ?
"const " :
"",
GetName());
4331 if (faddr == (
Long_t)
m->InterfaceMethod())
4350 Fatal(
"GetClassMethod",
"gInterpreter not initialized");
4356 if (!decl)
return 0;
4376 Fatal(
"GetClassMethodWithPrototype",
"gInterpreter not initialized");
4383 if (!decl)
return 0;
4475 Error(
"GetStreamerInfo",
"class: %s, attempting to access a wrong version: %d",
GetName(), version);
4494 TMmallocDescTemp setreset;
4548 newname +=
"@@emulated";
4573 for (
Int_t i = -1; sinfo == 0 && i < ninfos; ++i)
4586 Error(
"GetStreamerInfoAbstractEmulated",
"could not create TVirtualStreamerInfo");
4611 newname +=
"@@emulated";
4626 if (!sinfo && (checksum !=
fCheckSum)) {
4636 for (
Int_t i = -1; sinfo == 0 && i < ninfos; ++i)
4649 Error(
"GetStreamerInfoAbstractEmulated",
"could not create TVirtualStreamerInfo");
4696 Error(
"IgnoreTObjectStreamer",
"Must be called before the creation of StreamerInfo");
4722 if (cl ==
this)
return kTRUE;
4732 if (!clbase)
return kFALSE;
4751 if (cl ==
this)
return obj;
4758 return (
void*)((
Long_t)obj+off);
4760 return (
void*)((
Long_t)obj-off);
4826 Error(
"New",
"cannot create object of class %s",
GetName());
4842 Error(
"New",
"cannot create object of class %s",
GetName());
4853 Error(
"New",
"cannot create object of class %s",
GetName());
4874 if (!sinfo && !quiet) {
4893 Error(
"New",
"Failed to construct class '%s' using streamer info",
GetName());
4896 Fatal(
"New",
"This cannot happen!");
4920 Error(
"New with placement",
"cannot create object of class %s version %d at address %p",
GetName(),
fClassVersion, arena);
4935 Error(
"New with placement",
"cannot create object of class %s version %d at address %p",
GetName(),
fClassVersion, arena);
4963 Error(
"New with placement",
"Cannot construct class '%s' version %d at address %p, no streamer info available!",
GetName(),
fClassVersion, arena);
4968 p = sinfo->
New(arena);
4982 Error(
"New with placement",
"This cannot happen!");
5069 Error(
"NewArray",
"This cannot happen!");
5093 Error(
"NewArray with placement",
"cannot create object of class %s version %d at address %p",
GetName(),
fClassVersion, arena);
5108 Error(
"NewArray with placement",
"cannot create object of class %s version %d at address %p",
GetName(),
fClassVersion, arena);