109#define RTLD_DEFAULT ((void *)::GetModuleHandle(NULL))
110#define dlsym(library, function_name) ::GetProcAddress((HMODULE)library, function_name)
136 static constexpr const char kUndeterminedClassInfoName[] =
"<NOT YET DETERMINED FROM fClassInfo>";
138 class TMmallocDescTemp {
142 TMmallocDescTemp(
void *value = 0) :
163 TNameMapNode(
const char *typedf,
const char *orig) :
176 const static bool foundSymbol = dlsym(RTLD_DEFAULT,
"usedToIdentifyRootClingByDlSym");
199 auto strLen = strlen(
name);
200 if (strLen == 0)
return;
202 const char* endCharPtr = strchr(
name,
'<');
203 endCharPtr = !endCharPtr ? &
name[strLen] : endCharPtr;
205 const char* beginCharPtr = endCharPtr;
206 while (beginCharPtr!=
name){
207 if (*beginCharPtr==
':'){
213 beginCharPtr = beginCharPtr!=endCharPtr ? beginCharPtr :
name;
214 std::string s(beginCharPtr, endCharPtr);
216 printf(
"TDeclNameRegistry::AddQualifiedName Adding key %s for class/namespace %s\n", s.c_str(),
name);
218 fClassNamesSet.insert(s);
228 found = fClassNamesSet.find(
name) != fClassNamesSet.end();
237 if (fVerbLevel > 1) {
238 printf(
"TDeclNameRegistry Destructor. List of %lu names:\n",
239 (
long unsigned int)fClassNamesSet.size());
240 for (
auto const & key: fClassNamesSet) {
241 printf(
" - %s\n", key.c_str());
272struct TClass__GetCallingNewRAII
279 fOldValue(fCurrentValue)
281 fCurrentValue = newvalue;
284 ~TClass__GetCallingNewRAII()
286 fCurrentValue = fOldValue;
306 std::pair<RepoCont_t::iterator, Bool_t> tmp =
fObjectVersionRepository.insert(RepoCont_t::value_type>(location, version));
308 Warning(where,
"Reregistering an object of class '%s' version %d at address %p",
what->GetName(), version, p);
312 Warning(where,
"Failed to reregister an object of class '%s' version %d at address %p",
what->GetName(), version, location);
325 RepoCont_t::iterator tmp = cur++;
326 if ((tmp->first == location) && (tmp->second ==
what->GetClassVersion())) {
342 size_t objsize =
what->Size();
343 long delta = (
char*)newadd - (
char*)oldadd;
347 RepoCont_t::iterator tmp = cur++;
348 if (oldadd <= tmp->
first && tmp->first < ( ((
char*)oldadd) + objsize) ) {
364#define R__USE_STD_MAP
365 class TMapTypeToTClass {
366#if defined R__USE_STD_MAP
370 typedef std::map<std::string,TClass*>
IdMap_t;
371 typedef IdMap_t::key_type key_type;
372 typedef IdMap_t::const_iterator const_iterator;
373 typedef IdMap_t::size_type size_type;
376 typedef TClass* mapped_type;
378 typedef IdMap_t::mapped_type mapped_type;
385 void Add(
const key_type &key, mapped_type &obj)
390 mapped_type Find(
const key_type &key)
const
393 IdMap_t::const_iterator iter = fMap.find(key);
395 if (iter != fMap.end()) cl = iter->second;
398 void Remove(
const key_type &key) {
407#ifdef R__COMPLETE_MEM_TERMINATION
416 void Add(
const char *key,
TClass *&obj) {
418 fMap.Add(realkey, obj);
420 TClass* Find(
const char *key)
const {
421 const TPair *
a = (
const TPair *)fMap.FindObject(key);
425 void Remove(
const char *key) {
427 TObject *actual = fMap.Remove(&realkey);
433 class TMapDeclIdToTClass {
436 typedef multimap<TDictionary::DeclId_t, TClass*>
DeclIdMap_t;
437 typedef DeclIdMap_t::key_type key_type;
438 typedef DeclIdMap_t::mapped_type mapped_type;
439 typedef DeclIdMap_t::const_iterator const_iterator;
440 typedef std::pair <const_iterator, const_iterator> equal_range;
441 typedef DeclIdMap_t::size_type size_type;
447 void Add(
const key_type &key, mapped_type obj)
450 std::pair<const key_type, mapped_type> pair = make_pair(key, obj);
453 size_type CountElementsWithKey(
const key_type &key)
455 return fMap.count(key);
457 equal_range
Find(
const key_type &key)
const
460 return fMap.equal_range(key);
462 void Remove(
const key_type &key) {
471#ifdef R__COMPLETE_MEM_TERMINATION
473 return &gIdMapObject;
482#ifdef R__COMPLETE_MEM_TERMINATION
484 return &gDeclIdMapObject;
499 gROOT->GetListOfClasses()->Add(cl);
513 if (!cl || !
id)
return;
525 gROOT->GetListOfClasses()->Remove(oldcl);
557 TDumpMembers(
bool noAddr): fNoAddr(noAddr) { }
560 void Inspect(
TClass *cl,
const char *parent,
const char *
name,
const void *addr,
Bool_t isTransient);
574void TDumpMembers::Inspect(
TClass *cl,
const char *pname,
const char *mname,
const void *add,
Bool_t )
576 const Int_t kvalue = 30;
578 const Int_t ktitle = 50;
580 const Int_t ktitle = 42;
582 const Int_t kline = 1024;
590 const char *memberName;
591 const char *memberFullTypeName;
592 const char *memberTitle;
598 if (member->GetDataType()) {
599 memberDataType = (
EDataType)member->GetDataType()->GetType();
601 memberName = member->GetName();
602 memberFullTypeName = member->GetFullTypeName();
603 memberTitle = member->GetTitle();
604 isapointer = member->IsaPointer();
605 isbasic = member->IsBasic();
607 isarray = member->GetArrayDim();
613 const char *cursor = mname;
614 while ( (*cursor)==
'*' ) ++cursor;
616 Ssiz_t pos = elname.Index(
"[");
617 if ( pos !=
kNPOS ) {
618 elname.Remove( pos );
621 if (!element)
return;
626 memberName = element->
GetName();
629 membertype =
gROOT->GetType(memberFullTypeName);
631 isbasic = membertype !=0;
639 if (strcmp(memberName,
"fDatime") == 0 && memberDataType ==
kUInt_t) {
643 if (strcmp(memberName,
"fBits") == 0 && memberDataType ==
kUInt_t) {
647 Bool_t isTString = (dataClass == TString::Class());
648 static TClassRef stdClass(
"std::string");
649 Bool_t isStdString = (dataClass == stdClass);
652 for (i = 0;i < kline; i++)
line[i] =
' ';
658 char *pointer = (
char*)add;
659 char **ppointer = (
char**)(pointer);
662 char **p3pointer = (
char**)(*ppointer);
669 }
else if (membertype) {
671 i = strlen(*ppointer);
672 if (kvalue+i > kline) i=kline-1-kvalue;
674 for (
Int_t j = 0; j < i; j++) {
675 if (!std::isprint((*ppointer)[j])) {
681 strncpy(
line + kvalue, *ppointer, i);
689 }
else if (!strcmp(memberFullTypeName,
"char*") ||
690 !strcmp(memberFullTypeName,
"const char*")) {
691 i = strlen(*ppointer);
692 if (kvalue+i >= kline) i=kline-1-kvalue;
694 for (
Int_t j = 0; j < i; j++) {
695 if (!std::isprint((*ppointer)[j])) {
701 strncpy(
line + kvalue, *ppointer, std::min( i, kline - kvalue));
711 }
else if (membertype) {
713 cdatime = (
UInt_t*)pointer;
715 snprintf(&
line[kvalue],kline-kvalue,
"%d/%d",cdate,ctime);
723 std::string *str = (std::string*)pointer;
725 }
else if (isTString) {
735 if (isdate ==
kFALSE && strcmp(memberFullTypeName,
"char*") && strcmp(memberFullTypeName,
"const char*")) {
736 i = strlen(&
line[0]);
line[i] =
' ';
737 assert(250 > ktitle);
738 strlcpy(&
line[ktitle],memberTitle,250-ktitle+1);
742 strncat(
line,
" ...", kline-strlen(
line)-1);
754 void *fRealDataObject;
758 TBuildRealData(
void *obj,
TClass *cl) {
760 fRealDataObject = obj;
764 void Inspect(
TClass *cl,
const char *parent,
const char *
name,
const void *addr,
Bool_t isTransient);
771void TBuildRealData::Inspect(
TClass* cl,
const char* pname,
const char* mname,
const void* add,
Bool_t isTransient)
783 isTransientMember =
kTRUE;
790 if (cl != fRealDataClass) {
791 if (!fRealDataClass->InheritsFrom(cl)) {
792 Ssiz_t dot = rname.Index(
'.');
797 if (!fRealDataClass->GetDataMember(rname)) {
812 if (!fRealDataClass->GetBaseDataMember(rname)) {
827 fRealDataClass->GetListOfRealData()->Add(rd);
837 fRealDataClass->GetListOfRealData()->Add(rd);
882 void* addrForRecursion = 0;
883 if (GetObjectValidity() == kValidObjectGiven)
884 addrForRecursion =
const_cast<void*
>(add);
891 fRealDataClass->GetListOfRealData()->Add(rd);
908 fBrowser =
b; fCount = 0; }
909 virtual ~TAutoInspector() { }
911 virtual void Inspect(
TClass *cl,
const char *parent,
const char *
name,
const void *addr,
Bool_t isTransient);
912 virtual Bool_t IsTreatingNonAccessibleTypes() {
return kFALSE;}
918void TAutoInspector::Inspect(
TClass *cl,
const char *tit,
const char *
name,
919 const void *addr,
Bool_t )
921 if(tit && strchr(tit,
'.')) return ;
922 if (fCount && !fBrowser)
return;
929 int ln = strcspn(
name,
"[ ");
933 if (!classInfo)
return;
943 if ((found = (iname==mname)))
break;
955 if (mname ==
"G__virtualinfo")
return;
957 int size =
sizeof(
void*);
977 for(
int i=0; i<nmax; i++) {
979 char *ptr = (
char*)addr + i*size;
986 if (!fBrowser)
return;
994 bwname = actualClass->
GetName();
1001 strcmp(bwname.
Data(),actualClass->
GetName())==0) {
1003 int l = strcspn(bwname.
Data(),
"[ ");
1004 if (
l<bwname.
Length() && bwname[
l]==
'[') {
1005 char cbuf[13];
snprintf(cbuf,13,
"[%02d]",i);
1008 bwname = (
const char*)ts;
1014 fBrowser->Add(obj,clm,bwname);
1021 fBrowser->Add( obj, clm, bwname );
1027 int sz = proxy->
Size();
1029 char fmt[] = {
"#%09d"};
1030 fmt[3] =
'0'+(
int)
log10(
double(sz))+1;
1032 for (
int ii=0;ii<sz;ii++) {
1033 void *p = proxy->
At(ii);
1045 fBrowser->Add( p, actualCl, ts );
1084 TMmallocDescTemp setreset;
1101 fStreamerInfo(0), fConversionStreamerInfo(0), fRealData(0),
1102 fBase(0), fData(0), fUsingData(0), fEnums(0), fFuncTemplate(0), fMethod(0), fAllPubData(0),
1103 fAllPubMethod(0), fClassMenuList(0),
1104 fDeclFileName(
""), fImplFileName(
""), fDeclFileLine(0), fImplFileLine(0),
1105 fInstanceCount(0), fOnHeap(0),
1106 fCheckSum(0), fCollectionProxy(0), fClassVersion(0), fClassInfo(0),
1107 fTypeInfo(0), fShowMembers(0),
1108 fStreamer(0), fIsA(0), fGlobalIsA(0), fIsAMethod(0),
1109 fMerge(0), fResetAfterMerge(0), fNew(0), fNewArray(0), fDelete(0), fDeleteArray(0),
1110 fDestructor(0), fDirAutoAdd(0), fStreamerFunc(0), fConvStreamerFunc(0), fSizeof(-1),
1111 fCanSplit(-1), fIsSyntheticPair(
kFALSE), fProperty(0), fClassProperty(0), fHasRootPcmInfo(
kFALSE), fCanLoadClassInfo(
kFALSE),
1112 fIsOffsetStreamerSet(
kFALSE), fVersionUsed(
kFALSE), fRuntimeProperties(0), fOffsetStreamer(0), fStreamerType(
TClass::
kDefault),
1114 fCurrentInfo(0), fLastReadInfo(0), fRefProxy(0),
1115 fSchemaRules(0), fStreamerImpl(&
TClass::StreamerDefault)
1120 ::Fatal(
"TClass::TClass",
"ROOT system not initialized");
1123 TMmallocDescTemp setreset;
1130 ::Fatal(
"TClass::TClass",
"gInterpreter not initialized");
1134 ::Warning(
"TClass::TClass",
"no dictionary for class %s is available",
name);
1148 fStreamerInfo(0), fConversionStreamerInfo(0), fRealData(0),
1149 fBase(0), fData(0), fUsingData(0), fEnums(0), fFuncTemplate(0), fMethod(0), fAllPubData(0),
1150 fAllPubMethod(0), fClassMenuList(0),
1151 fDeclFileName(
""), fImplFileName(
""), fDeclFileLine(0), fImplFileLine(0),
1152 fInstanceCount(0), fOnHeap(0),
1153 fCheckSum(0), fCollectionProxy(0), fClassVersion(0), fClassInfo(0),
1154 fTypeInfo(0), fShowMembers(0),
1155 fStreamer(0), fIsA(0), fGlobalIsA(0), fIsAMethod(0),
1156 fMerge(0), fResetAfterMerge(0), fNew(0), fNewArray(0), fDelete(0), fDeleteArray(0),
1157 fDestructor(0), fDirAutoAdd(0), fStreamerFunc(0), fConvStreamerFunc(0), fSizeof(-1),
1158 fCanSplit(-1), fIsSyntheticPair(
kFALSE), fProperty(0), fClassProperty(0), fHasRootPcmInfo(
kFALSE), fCanLoadClassInfo(
kFALSE),
1159 fIsOffsetStreamerSet(
kFALSE), fVersionUsed(
kFALSE), fRuntimeProperties(0), fOffsetStreamer(0), fStreamerType(
TClass::
kDefault),
1161 fCurrentInfo(0), fLastReadInfo(0), fRefProxy(0),
1162 fSchemaRules(0), fStreamerImpl(&
TClass::StreamerDefault)
1165 Init(
name, cversion, 0, 0, 0, 0, -1, -1, 0, silent);
1175 fStreamerInfo(0), fConversionStreamerInfo(0), fRealData(0),
1176 fBase(0), fData(0), fUsingData(0), fEnums(0), fFuncTemplate(0), fMethod(0), fAllPubData(0),
1177 fAllPubMethod(0), fClassMenuList(0),
1178 fDeclFileName(
""), fImplFileName(
""), fDeclFileLine(0), fImplFileLine(0),
1179 fInstanceCount(0), fOnHeap(0),
1180 fCheckSum(0), fCollectionProxy(0), fClassVersion(0), fClassInfo(0),
1181 fTypeInfo(0), fShowMembers(0),
1182 fStreamer(0), fIsA(0), fGlobalIsA(0), fIsAMethod(0),
1183 fMerge(0), fResetAfterMerge(0), fNew(0), fNewArray(0), fDelete(0), fDeleteArray(0),
1184 fDestructor(0), fDirAutoAdd(0), fStreamerFunc(0), fConvStreamerFunc(0), fSizeof(-1),
1185 fCanSplit(-1), fIsSyntheticPair(
kFALSE), fProperty(0), fClassProperty(0), fHasRootPcmInfo(
kFALSE), fCanLoadClassInfo(
kFALSE),
1186 fIsOffsetStreamerSet(
kFALSE), fVersionUsed(
kFALSE), fRuntimeProperties(0), fOffsetStreamer(0), fStreamerType(
TClass::
kDefault),
1188 fCurrentInfo(0), fLastReadInfo(0), fRefProxy(0),
1189 fSchemaRules(0), fStreamerImpl(&
TClass::StreamerDefault)
1201 "A TClass entry cannot be initialized in a state different from kForwardDeclared or kEmulated.");
1202 Init(
name, cversion, 0, 0, 0, 0, -1, -1, 0, silent);
1219 fStreamerInfo(0), fConversionStreamerInfo(0), fRealData(0),
1220 fBase(0), fData(0), fUsingData(0), fEnums(0), fFuncTemplate(0), fMethod(0), fAllPubData(0),
1221 fAllPubMethod(0), fClassMenuList(0),
1222 fDeclFileName(
""), fImplFileName(
""), fDeclFileLine(0), fImplFileLine(0),
1223 fInstanceCount(0), fOnHeap(0),
1224 fCheckSum(0), fCollectionProxy(0), fClassVersion(0), fClassInfo(0),
1225 fTypeInfo(0), fShowMembers(0),
1226 fStreamer(0), fIsA(0), fGlobalIsA(0), fIsAMethod(0),
1227 fMerge(0), fResetAfterMerge(0), fNew(0), fNewArray(0), fDelete(0), fDeleteArray(0),
1228 fDestructor(0), fDirAutoAdd(0), fStreamerFunc(0), fConvStreamerFunc(0), fSizeof(-1),
1229 fCanSplit(-1), fIsSyntheticPair(
kFALSE), fProperty(0), fClassProperty(0), fHasRootPcmInfo(
kFALSE), fCanLoadClassInfo(
kFALSE),
1230 fIsOffsetStreamerSet(
kFALSE), fVersionUsed(
kFALSE), fRuntimeProperties(0), fOffsetStreamer(0), fStreamerType(
TClass::
kDefault),
1232 fCurrentInfo(0), fLastReadInfo(0), fRefProxy(0),
1233 fSchemaRules(0), fStreamerImpl(&
TClass::StreamerDefault)
1238 ::Fatal(
"TClass::TClass",
"ROOT system not initialized");
1244 ::Fatal(
"TClass::TClass",
"gInterpreter not initialized");
1246 if (!classInfo || !
gInterpreter->ClassInfo_IsValid(classInfo)) {
1253 Init(
fName, cversion, 0, 0, dfil, ifil, dl, il, classInfo, silent);
1269 fStreamerInfo(0), fConversionStreamerInfo(0), fRealData(0),
1270 fBase(0), fData(0), fUsingData(0), fEnums(0), fFuncTemplate(0), fMethod(0), fAllPubData(0),
1271 fAllPubMethod(0), fClassMenuList(0),
1272 fDeclFileName(
""), fImplFileName(
""), fDeclFileLine(0), fImplFileLine(0),
1273 fInstanceCount(0), fOnHeap(0),
1274 fCheckSum(0), fCollectionProxy(0), fClassVersion(0), fClassInfo(0),
1275 fTypeInfo(0), fShowMembers(0),
1276 fStreamer(0), fIsA(0), fGlobalIsA(0), fIsAMethod(0),
1277 fMerge(0), fResetAfterMerge(0), fNew(0), fNewArray(0), fDelete(0), fDeleteArray(0),
1278 fDestructor(0), fDirAutoAdd(0), fStreamerFunc(0), fConvStreamerFunc(0), fSizeof(-1),
1279 fCanSplit(-1), fIsSyntheticPair(
kFALSE), fProperty(0), fClassProperty(0), fHasRootPcmInfo(
kFALSE), fCanLoadClassInfo(
kFALSE),
1280 fIsOffsetStreamerSet(
kFALSE), fVersionUsed(
kFALSE), fRuntimeProperties(0), fOffsetStreamer(0), fStreamerType(
TClass::
kDefault),
1282 fCurrentInfo(0), fLastReadInfo(0), fRefProxy(0),
1283 fSchemaRules(0), fStreamerImpl(&
TClass::StreamerDefault)
1286 Init(
name,cversion, 0, 0, dfil, ifil, dl, il, 0, silent);
1295 const char *dfil,
const char *ifil,
Int_t dl,
Int_t il,
1299 fStreamerInfo(0), fConversionStreamerInfo(0), fRealData(0),
1300 fBase(0), fData(0), fUsingData(0), fEnums(0), fFuncTemplate(0), fMethod(0), fAllPubData(0),
1303 fDeclFileName(
""), fImplFileName(
""), fDeclFileLine(0), fImplFileLine(0),
1304 fInstanceCount(0), fOnHeap(0),
1305 fCheckSum(0), fCollectionProxy(0), fClassVersion(0), fClassInfo(0),
1306 fTypeInfo(0), fShowMembers(0),
1307 fStreamer(0), fIsA(0), fGlobalIsA(0), fIsAMethod(0),
1308 fMerge(0), fResetAfterMerge(0), fNew(0), fNewArray(0), fDelete(0), fDeleteArray(0),
1309 fDestructor(0), fDirAutoAdd(0), fStreamerFunc(0), fConvStreamerFunc(0), fSizeof(-1),
1310 fCanSplit(-1), fIsSyntheticPair(
kFALSE), fProperty(0), fClassProperty(0), fHasRootPcmInfo(
kFALSE), fCanLoadClassInfo(
kFALSE),
1311 fIsOffsetStreamerSet(
kFALSE), fVersionUsed(
kFALSE), fRuntimeProperties(0), fOffsetStreamer(0), fStreamerType(
TClass::
kDefault),
1312 fState(kHasTClassInit),
1313 fCurrentInfo(0), fLastReadInfo(0), fRefProxy(0),
1314 fSchemaRules(0), fStreamerImpl(&
TClass::StreamerDefault)
1318 Init(
name, cversion, &info, isa, dfil, ifil, dl, il, 0, silent);
1336 info->
Clear(
"build");
1360 const char *dfil,
const char *ifil,
Int_t dl,
Int_t il,
1361 ClassInfo_t *givenInfo,
1365 ::Fatal(
"TClass::TClass",
"ROOT system not initialized");
1367 ::Error(
"TClass::Init",
"The name parameter is invalid (null or empty)");
1408 TClass **persistentRef = 0;
1426 info->
Clear(
"build");
1444 (*fMethod).fClass =
this;
1456 ::Fatal(
"TClass::Init",
"gInterpreter not initialized");
1459 bool invalid = !
gInterpreter->ClassInfo_IsValid(givenInfo);
1460 bool notloaded = !
gInterpreter->ClassInfo_IsLoaded(givenInfo);
1461 auto property =
gInterpreter->ClassInfo_Property(givenInfo);
1463 if (invalid || (notloaded && (property &
kIsNamespace)) ||
1503 proto->FillTClass(
this);
1529 ::Error(
"TClass::Init",
"no interpreter information for class %s is available even though it has a TClass "
1530 "initialization routine.",
1548 if (!givenInfo && strchr (
name,
'<')) {
1560 if (resolvedThis !=
name) {
1584 if (resolvedThis !=
fName) {
1585 oldcl = (
TClass*)
gROOT->GetListOfClasses()->FindObject(resolvedThis);
1586 if (oldcl && oldcl !=
this) {
1592 while ( TNameMapNode* htmp =
static_cast<TNameMapNode*
> (next()) ) {
1593 if (resolvedThis != htmp->String())
continue;
1594 oldcl = (
TClass*)
gROOT->GetListOfClasses()->FindObject(htmp->fOrigName);
1595 if (oldcl && oldcl !=
this) {
1613 if (persistentRef) {
1620 if ( isStl || !strncmp(
GetName(),
"stdext::hash_",13) || !strncmp(
GetName(),
"__gnu_cxx::hash_",16) ) {
1631 }
else if (!silent) {
1632 Warning(
"Init",
"Collection proxy for %s was not properly initialized!",
GetName());
1657 while ( TNameMapNode* htmp =
static_cast<TNameMapNode*
> (next()) ) {
1658 if (resolvedThis == htmp->String() && htmp->fOrigName ==
GetName()) {
1684 (*fUsingData).Delete();
1729 std::map<std::string, TObjArray*>::iterator it;
1730 std::map<std::string, TObjArray*>::iterator end = (*fConversionStreamerInfo).end();
1731 for( it = (*fConversionStreamerInfo).begin(); it != end; ++it ) {
1741 Int_t ReadRulesContent(FILE *
f)
1753 while ((
c = fgetc(
f)) != EOF) {
1759 if (rule.Length() > 0) {
1811 static const char *suffix =
"class.rules";
1817 FILE *
f = fopen(sname,
"r");
1819 res = ReadRulesContent(
f);
1822 ::Error(
"TClass::ReadRules()",
"Cannot find rules file %s", sname.
Data());
1835 if (!filename || !filename[0]) {
1836 ::Error(
"TClass::ReadRules",
"no file name specified");
1840 FILE *
f = fopen(filename,
"r");
1842 ::Error(
"TClass::ReadRules",
"Failed to open %s\n",filename);
1845 Int_t count = ReadRulesContent(
f);
1898 ::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).",
1959 TAutoInspector insp(
b);
1960 obj->ShowMembers(insp);
1981 }
else if (actual !=
this) {
1982 return actual->
Browse(obj,
b);
1988 TAutoInspector insp(
b);
2031 isTransient =
kTRUE;
2036 TMmallocDescTemp setreset;
2047 static TClassRef clRefString(
"std::string");
2048 if (clRefString ==
this) {
2058 Error(
"BuildRealData",
"Inspection for %s not supported!",
GetName());
2064 TBuildRealData brd(pointer,
this);
2070 if ( isTransient ) {
2078 Error(
"BuildRealData",
"Cannot find any ShowMembers function for %s!",
GetName());
2093 c->BuildRealData(0, isTransient);
2113 Error(
"BuildEmulatedRealData",
"Missing StreamerInfo for %s",
GetName());
2179 TMmallocDescTemp setreset;
2206 if (strcmp(
GetName(),
"string") == 0) {
2214 gInterpreter->InspectMembers(insp, obj,
this, isTransient);
2218 sinfo->CallShowMembers(obj, insp, isTransient);
2233 return gInterpreter->InspectMembers(insp, obj,
this, isTransient);
2252 if (
this == TClonesArray::Class()) {
fCanSplit = 1;
return kTRUE; }
2266 if (element->IsA() == TStreamerBase::Class()) {
2297 }
else if (!
c->CanSplitBaseAllow()) {
2322 if (
this == TObject::Class()) { This->
fCanSplit = 1;
return kTRUE; }
2341 static TClassRef stdStringClass(
"std::string");
2342 if (valueClass==TString::Class() || valueClass==stdStringClass)
2398 if (new_name == 0 || new_name[0]==
'\0' ||
fName == new_name) {
2399 Error(
"Clone",
"The name of the class must be changed when cloning a TClass object.");
2429 copy->
fName = new_name;
2484 if (!padsav || !opt.
Contains(
"same")) {
2487 gROOT->ProcessLine(
"new TCanvas(\"R__class\",\"class\",20,20,1000,750);");
2493 if (
gPad)
gPad->DrawClassObject(
this,option);
2495 if (padsav) padsav->
cd();
2536 if (
sizeof(
this) == 4)
2539 Printf(
"==> Dumping object at: 0x%016lx, name=%s, class=%s\n",prObj,tobj->
GetName(),
GetName());
2542 if (
sizeof(
this) == 4)
2543 Printf(
"==> Dumping object at: 0x%08lx, class=%s\n",prObj,
GetName());
2545 Printf(
"==> Dumping object at: 0x%016lx, class=%s\n",prObj,
GetName());
2548 TDumpMembers dm(noAddr);
2550 Info(
"Dump",
"No ShowMembers function, dumping disabled");
2560 static const UInt_t maxsize = 255;
2561 static char name[maxsize+2];
2565 for (
UInt_t i = 0; i < nch && icur < maxsize; ++i, ++icur) {
2566 if (
text[i] ==
'\"' ||
text[i] ==
'[' ||
text[i] ==
'~' ||
2569 text[i] ==
'?' ||
text[i] ==
'>') {
2599 if (
object==0)
return (
TClass*)
this;
2612 return realTObject->IsA();
2647 if (strcmp(
GetName(), classname) == 0)
return this;
2666 if (cl ==
this)
return this;
2678 if (cl ==
c)
return c;
2679 c1 =
c->GetBaseClass(cl);
2697 if (cl ==
this)
return 0;
2699 if (!
fBase.load()) {
2706 if (!sinfo)
return -1;
2712 for(
Int_t i=0; i<size; i++) {
2715 if (element->IsA() == TStreamerBase::Class()) {
2718 if (!baseclass)
return -1;
2720 if (subOffset == -2)
return -2;
2721 if (subOffset != -1)
return offset+subOffset;
2722 offset += baseclass->
Size();
2723 }
else if (element->IsA() == TStreamerSTL::Class()) {
2726 if (!baseclass)
return -1;
2728 if (subOffset == -2)
return -2;
2729 if (subOffset != -1)
return offset+subOffset;
2730 offset += baseclass->
Size();
2733 Error(
"GetBaseClassOffsetRecurse",
"Unexpected element type for base class: %s\n",element->IsA()->
GetName());
2745 if (
fBase.load() == 0)
2748 lnk =
fBase.load()->FirstLink();
2764 off =
c->GetBaseClassOffsetRecurse(cl);
2765 if (off == -2)
return -2;
2784 if (
this == toBase)
return 0;
2800 if(derived && base) {
2822 if (dm)
return this;
2830 TClass *cdm =
c->GetBaseDataMember(datamember);
2831 if (cdm)
return cdm;
2842 struct TClassLocalStorage {
2843 TClassLocalStorage() : fCollectionProxy(0), fStreamer(0) {};
2848 static TClassLocalStorage *GetStorage(
const TClass *cl)
2854 if (*thread_ptr==0) *thread_ptr =
new TExMap();
2861 local = (
ULong_t)
new TClassLocalStorage();
2864 return (TClassLocalStorage*)local;
2892 TClassLocalStorage *local = TClassLocalStorage::GetStorage(
this);
2895 return local->fCollectionProxy;
2906 TClassLocalStorage *local = TClassLocalStorage::GetStorage(
this);
2908 if (local->fStreamer==0) {
2910 const std::type_info &orig = (
typeid(*fStreamer) );
2911 if (!local->fStreamer) {
2912 Warning(
"GetStreamer",
"For %s, the TClassStreamer (%s) passed's call to Generate failed!",
GetName(),orig.name());
2914 const std::type_info © = (
typeid(*local->fStreamer) );
2915 if (strcmp(orig.name(),copy.name())!=0) {
2916 Warning(
"GetStreamer",
"For %s, the TClassStreamer passed does not properly implement the Generate method (%s vs %s)\n",
GetName(),orig.name(),copy.name());
2920 return local->fStreamer;
2966 if (strstr(
name,
"(anonymous)"))
return 0;
2967 if (strncmp(
name,
"class ",6)==0)
name += 6;
2968 if (strncmp(
name,
"struct ",7)==0)
name += 7;
2970 if (!
gROOT->GetListOfClasses())
return 0;
3025 if (!cl && !load)
return 0;
3027 TClass *loadedcl = (dict)();
3037 std::string normalizedName;
3046 if (normalizedName !=
name) {
3047 cl = (
TClass*)
gROOT->GetListOfClasses()->FindObject(normalizedName.c_str());
3058 normalizedName = cl->
GetName();
3059 checkTable = load && (normalizedName !=
name);
3062 if (!load)
return 0;
3099 if (!loadedcl && !ispair && !ispairbase) {
3100 if (
TDataType* theDataType =
gROOT->GetType(normalizedName.c_str())){
3102 auto underlyingTypeName = theDataType->GetTypeName();
3105 if (underlyingTypeDict){
3106 loadedcl = underlyingTypeDict();
3112 if (loadedcl)
return loadedcl;
3116 if (loadedcl)
return loadedcl;
3123 if (hint_pair_offset && hint_pair_size) {
3131 static const size_t slen = strlen(
"pair");
3132 static const char *associativeContainer[] = {
"map",
"unordered_map",
"multimap",
3133 "unordered_multimap",
"set",
"unordered_set",
"multiset",
"unordered_multiset" };
3134 for(
auto contname : associativeContainer) {
3135 std::string collname = contname;
3136 collname.append( normalizedName.c_str() + slen );
3143 cl = p->GetValueClass();
3156 std::string::size_type posLess = normalizedName.find(
'<');
3157 if (posLess != std::string::npos) {
3164 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());
3166 if (normalizedName.length()) {
3176 auto ci =
gInterpreter->ClassInfo_Factory(normalizedName.c_str());
3178 auto method =
gInterpreter->MethodInfo_Factory(funcDecl);
3184 funcPtr(0, 0,
nullptr, &res);
3196 std::string alternative;
3197 gInterpreter->GetInterpreterTypeName(normalizedName.c_str(), alternative,
kTRUE);
3198 if (alternative.empty())
3200 const char *altname = alternative.c_str();
3201 if (strncmp(altname,
"std::", 5) == 0) {
3206 if (altname != normalizedName && strcmp(altname,
name) != 0) {
3233 if (!
gROOT->GetListOfClasses())
3241 if (cl && cl->
IsLoaded())
return cl;
3248 cl =
GetIdMap()->Find(typeinfo.name());
3267 if (!load)
return 0;
3277 TIter next(
gROOT->GetListOfClassGenerators());
3289 if (!autoload_old) {
3296 cl =
GetClass(typeinfo, load, hint_pair_offset, hint_pair_size);
3302 if (hint_pair_offset) {
3307 free(demangled_name);
3331 if (!
gROOT->GetListOfClasses())
return 0;
3352 if (!load)
return 0;
3355 if (cl) loadedcl =
gROOT->LoadClass(cl->
GetName(),silent);
3356 else loadedcl =
gROOT->LoadClass(
name,silent);
3358 if (loadedcl)
return loadedcl;
3383 if (!
gROOT->GetListOfClasses())
return 0;
3387 DeclIdMap_t::equal_range iter = map->Find(
id);
3388 if (iter.first == iter.second)
return false;
3389 std::vector<TClass*>::iterator vectIt = classes.begin();
3390 for (DeclIdMap_t::const_iterator it = iter.first; it != iter.second; ++it)
3391 vectIt = classes.insert(vectIt, it->second);
3419 || datamember == 0)
return 0;
3422 const char *start_name = datamember;
3423 while (*start_name ==
'*') ++start_name;
3428 if (
const char *s = strchr(start_name,
'[')){
3429 UInt_t len = s-start_name;
3458 if (strchr(
name,
'[')==0) {
3500 std::string givenName(
name);
3503 std::string::size_type firstBracket = givenName.find_first_of(
"[");
3504 if (firstBracket != std::string::npos) {
3506 std::string nameNoDim(givenName.substr(0, firstBracket));
3510 std::string objName(obj->
GetName());
3511 std::string::size_type pos = objName.find_first_of(
"[");
3513 if (pos != std::string::npos) {
3515 if (objName == nameNoDim) {
3524 std::ostringstream ptrname;
3525 ptrname <<
"*" << givenName;
3532 std::string::size_type firstDot = givenName.find_first_of(
".");
3533 if (firstDot == std::string::npos) {
3544 std::string::size_type lastDot = givenName.find_last_of(
".");
3545 std::ostringstream starname;
3546 starname << givenName.substr(0, lastDot) <<
".*" << givenName.substr(lastDot + 1);
3562 std::string::size_type bracket = starname.str().find_first_of(
"[");
3563 if (bracket != std::string::npos) {
3572 std::string firstDotName(givenName.substr(firstDot + 1));
3615 if (!
fBase.load()) {
3636 Fatal(
"GetListOfBases",
"gInterpreter not initialized");
3639 if (!
fBase.load()) {
3665 auto temp =
fEnums.load();
3667 if (requestListLoading) {
3672 }
else if ( temp->IsA() == TListOfEnumsWithLock::Class() ) {
3682 if (!requestListLoading) {
3737 if (!(*data).IsLoaded())
3740 }
else if (load) (*data).Load();
3751 auto data =
fData.load();
3752 if (data && data->IsLoaded())
3754 }
else if (!load &&
fData)
3795 if (
gDebug>0)
Info(
"GetListOfMethods",
"Header Parsing - Asking for all the methods of class %s: this can involve parsing.",
GetName());
3828 if (
gDebug>0)
Info(
"GetListOfAllPublicMethods",
"Header Parsing - Asking for all the methods of class %s: this can involve parsing.",
GetName());
3858 while ((baseClass = (
TBaseClass *) nextBase())) {
3866 while ((method = (
TMethod*)next())) {
3872 if (
m &&
m->GetNargs() == method->
GetNargs())
3897 return cl->IsLoaded();
3925 TIter nextMemb(ldm);
3956 for (
int i = 0; i < 2; i++) {
3972 if (
this == sCIString)
return;
3984 auto checkDicts = [&](
const string &clName){
3991 if (cl && !cl->HasDictionary()) {
3992 cl->GetMissingDictionariesWithRecursionCheck(result, visited, recurse);
3996 const auto &elements = splitType.
fElements;
3997 const auto &templName = elements[0];
4000 if (templName ==
"pair") {
4008 if (templName ==
"unique_ptr" || templName ==
"array") {
4009 checkDicts(elements[1]);
4016 if (templName ==
"tuple") {
4019 const auto nTemplArgs = elements.size() - 1;
4021 for (
auto iTemplArg = 1U; iTemplArg < nTemplArgs; ++iTemplArg) {
4022 checkDicts(elements[iTemplArg]);
4071 if (
this == sCIString)
return;
4080 if (strncmp(
fName,
"unique_ptr<", 11) == 0 || strncmp(
fName,
"array<", 6) == 0 || strncmp(
fName,
"tuple<", 6) == 0) {
4133 while ((acl = (
TClass*)nextClass())) {
4134 if (acl == newcl)
continue;
4139 info->
Update(
this, newcl);
4151 Warning(
"ResetClassInfo(Long_t tagnum)",
"Call to deprecated interface (does nothing)");
4200 (*fUsingData).Unload();
4204 (*fMethod).Unload();
4238 if (options==0 || options[0]==0)
return;
4240 if (strstr(options,
"streamerinfo")!=0) {
4244 std::map<std::string, TObjArray*>::iterator it;
4245 std::map<std::string, TObjArray*>::iterator end = (*fConversionStreamerInfo).end();
4246 for( it = (*fConversionStreamerInfo).begin(); it != end; ++it ) {
4247 it->second->ls(options);
4274 TIter next(methodList);
4276 while ((method = (
TMethod*) next())) {
4278 if (classPtr != method->
GetClass()) {
4286 TIter nextarg(margsList);
4287 while ((methodArg = (
TMethodArg*)nextarg())) {
4337 if(
fMethod.compare_exchange_strong(expected, temp.get()) ) {
4373 m =
c->GetMethodAllAny(method);
4395 Fatal(
"GetMethod",
"gInterpreter not initialized");
4401 if (!decl)
return 0;
4408 "\nDid not find matching TMethod <%s> with \"%s\" %sfor %s",
4409 method,params,objectIsConst ?
"const " :
"",
GetName());
4419 return static_cast<TMethod *
>(method);
4423 if (
TFunction* method = base->FindClassOrBaseMethodWithId(declId))
4424 return static_cast<TMethod *
>(method);
4441 Fatal(
"GetMethodWithPrototype",
"gInterpreter not initialized");
4445 objectIsConst, mode);
4447 if (!decl)
return 0;
4450 Error(
"GetMethodWithPrototype",
4451 "\nDid not find matching TMethod <%s> with \"%s\" %sfor %s",
4452 method,
proto,objectIsConst ?
"const " :
"",
GetName());
4467 if (faddr == (
Long_t)
m->InterfaceMethod())
4486 Fatal(
"GetClassMethod",
"gInterpreter not initialized");
4492 if (!decl)
return 0;
4512 Fatal(
"GetClassMethodWithPrototype",
"gInterpreter not initialized");
4519 if (!decl)
return 0;
4618 Error(
"GetStreamerInfo",
"class: %s, attempting to access a wrong version: %d",
GetName(), version);
4637 TMmallocDescTemp setreset;
4646 sinfo->
Build(silent);
4691 newname +=
"@@emulated";
4716 for (
Int_t i = -1; sinfo == 0 && i < ninfos; ++i)
4729 Error(
"GetStreamerInfoAbstractEmulated",
"could not create TVirtualStreamerInfo");
4754 newname +=
"@@emulated";
4769 if (!sinfo && (checksum !=
fCheckSum)) {
4779 for (
Int_t i = -1; sinfo == 0 && i < ninfos; ++i)
4792 Error(
"GetStreamerInfoAbstractEmulated",
"could not create TVirtualStreamerInfo");
4839 Error(
"IgnoreTObjectStreamer",
"Must be called before the creation of StreamerInfo");
4865 if (cl ==
this)
return kTRUE;
4873 if (element->IsA() == TStreamerBase::Class()) {
4875 if (!clbase)
return kFALSE;
4894 if (cl ==
this)
return obj;
4901 return (
void*)((
Long_t)obj+off);
4903 return (
void*)((
Long_t)obj-off);
4957 auto obj =
NewObject(defConstructor, quiet);
4958 if (obj.GetPtr() && obj.GetAllocator()) {
4962 return obj.GetPtr();
4979 TClass__GetCallingNewRAII callingNew(defConstructor);
4984 Error(
"New",
"cannot create object of class %s",
GetName());
4996 TClass__GetCallingNewRAII callingNew(defConstructor);
5001 Error(
"New",
"cannot create object of class %s",
GetName());
5008 TClass__GetCallingNewRAII callingNew(defConstructor);
5013 Error(
"New",
"cannot create object of class %s",
GetName());
5041 TClass__GetCallingNewRAII callingNew(defConstructor);
5042 p = { sinfo->
New(), sinfo};
5052 Error(
"New",
"Failed to construct class '%s' using streamer info",
GetName());
5057 Fatal(
"New",
"This cannot happen!");
5070 auto obj =
NewObject(arena, defConstructor);
5071 if (obj.GetPtr() && obj.GetAllocator()) {
5075 return obj.GetPtr();
5093 TClass__GetCallingNewRAII callingNew(defConstructor);
5097 Error(
"New with placement",
"cannot create object of class %s version %d at address %p",
GetName(),
fClassVersion, arena);
5109 TClass__GetCallingNewRAII callingNew(defConstructor);
5113 Error(
"New with placement",
"cannot create object of class %s version %d at address %p",
GetName(),
fClassVersion, arena);
5120 TClass__GetCallingNewRAII callingNew(defConstructor);
5142 Error(
"New with placement",
"Cannot construct class '%s' version %d at address %p, no streamer info available!",
GetName(),
fClassVersion, arena);
5147 TClass__GetCallingNewRAII callingNew(defConstructor);
5148 p = { sinfo->
New(arena), sinfo };
5158 Error(
"New with placement",
"This cannot happen!");