38 TEnum::TEnum(
const char *name, DeclId_t declid, TClass *cls)
39 : fInfo(nullptr), fClass(cls)
43 fConstantList.SetOwner(kTRUE);
47 if (0 != strcmp(
"",GetTitle())){
48 fQualName = std::string(GetTitle()) +
"::" + GetName();
51 fQualName = std::string(GetClass()->GetName()) +
"::" + GetName();
54 fQualName = GetName();
65 gInterpreter->ClassInfo_Delete(fInfo);
71 void TEnum::AddConstant(TEnumConstant *constant)
73 fConstantList.Add(constant);
81 Bool_t TEnum::IsValid()
84 if (!fInfo && UpdateInterpreterStateMarker()) {
85 DeclId_t newId = gInterpreter->GetEnum(fClass, fName);
96 Long_t TEnum::Property()
const
98 return kIsEnum | (TestBit(kBitIsScopedEnum) ? kIsScopedEnum : 0);
107 EDataType TEnum::GetUnderlyingType()
const
110 return gInterpreter->ClassInfo_GetUnderlyingType(fInfo);
111 return kNumDataTypes;
116 TDictionary::DeclId_t TEnum::GetDeclId()
const
119 return gInterpreter->GetDeclId(fInfo);
126 void TEnum::Update(DeclId_t
id)
129 gInterpreter->ClassInfo_Delete(fInfo);
135 fInfo = gInterpreter->ClassInfo_Factory(
id);
138 SetBit(kBitIsScopedEnum, gInterpreter->ClassInfo_IsScopedEnum(fInfo));
143 TEnum *TEnum::GetEnum(
const std::type_info &ti, ESearchAction sa)
146 char *demangledEnumName = TClassEdit::DemangleName(ti.name(), errorCode);
148 if (errorCode != 0) {
149 free(demangledEnumName);
150 std::cerr <<
"ERROR TEnum::GetEnum - A problem occurred while demangling name.\n";
154 const char *constDemangledEnumName = demangledEnumName;
155 TEnum *en = TEnum::GetEnum(constDemangledEnumName, sa);
156 free(demangledEnumName);
177 TEnum *TEnum::GetEnum(
const char *enumName, ESearchAction sa)
182 TEnum *theEnum =
nullptr;
186 auto findEnumInList = [](
const TCollection * l,
const char * enName, ESearchAction sa_local) {
188 if (sa_local & kInterpLookup) {
189 obj = l->FindObject(enName);
191 auto enumTable =
dynamic_cast<const TListOfEnums *
>(l);
192 obj = enumTable->GetObject(enName);
194 return static_cast<TEnum *
>(obj);
200 auto searchEnum = [&theEnum, findEnumInList](
const char * scopeName,
const char * enName, ESearchAction sa_local) {
202 if (sa_local == (kALoadAndInterpLookup)) {
203 auto scope = TClass::GetClass(scopeName,
true);
205 if (scope) en = findEnumInList(scope->GetListOfEnums(kFALSE), enName, sa_local);
211 R__LOCKGUARD(gInterpreterMutex);
212 if (
auto tClassScope = static_cast<TClass *>(gROOT->GetListOfClasses()->FindObject(scopeName))) {
216 bool canLoadEnums (sa_local & kInterpLookup);
217 const bool scopeIsNamespace (tClassScope->Property() & kIsNamespace);
219 const bool autoParseSuspended = gInterpreter->IsAutoParsingSuspended();
220 const bool suspendAutoParse = autoParseSuspended || scopeIsNamespace;
222 TInterpreter::SuspendAutoParsing autoParseRaii(gInterpreter, suspendAutoParse);
224 if (scopeIsNamespace && !autoParseSuspended){
228 auto listOfEnums = tClassScope->GetListOfEnums(canLoadEnums);
232 theEnum = findEnumInList(listOfEnums, enName, sa_local);
235 else if (
auto tProtoClassscope = static_cast<TProtoClass *>((gClassTable->GetProtoNorm(scopeName)))) {
236 auto listOfEnums = tProtoClassscope->GetListOfEnums();
237 if (listOfEnums) theEnum = findEnumInList(listOfEnums, enName, sa_local);
242 const char *lastPos = TClassEdit::GetUnqualifiedName(enumName);
244 if (strchr(lastPos,
'<')) {
250 if (lastPos != enumName) {
253 const auto enName = lastPos;
254 const auto scopeNameSize = ((Long64_t)lastPos - (Long64_t)enumName) /
sizeof(decltype(*lastPos)) - 2;
256 char *scopeName =
new char[scopeNameSize + 1];
258 char scopeName[scopeNameSize + 1];
260 strncpy(scopeName, enumName, scopeNameSize);
261 scopeName[scopeNameSize] =
'\0';
263 theEnum = searchEnum(scopeName, enName, kNone);
264 if (!theEnum && (sa & kAutoload)) {
265 const auto libsLoaded = gInterpreter->AutoLoad(scopeName);
267 if (libsLoaded == 0){
268 gInterpreter->AutoLoad(enumName);
270 theEnum = searchEnum(scopeName, enName, kAutoload);
272 if (!theEnum && (sa & kALoadAndInterpLookup)) {
274 printf(
"TEnum::GetEnum: Header Parsing - The enumerator %s is not known to the typesystem: an interpreter lookup will be performed. This can imply parsing of headers. This can be avoided selecting the numerator in the linkdef/selection file.\n", enumName);
276 theEnum = searchEnum(scopeName, enName, kALoadAndInterpLookup);
283 theEnum = findEnumInList(gROOT->GetListOfEnums(), enumName, kNone);
284 if (!theEnum && (sa & kAutoload)) {
285 gInterpreter->AutoLoad(enumName);
286 theEnum = findEnumInList(gROOT->GetListOfEnums(), enumName, kAutoload);
288 if (!theEnum && (sa & kALoadAndInterpLookup)) {
290 printf(
"TEnum::GetEnum: Header Parsing - The enumerator %s is not known to the typesystem: an interpreter lookup will be performed. This can imply parsing of headers. This can be avoided selecting the numerator in the linkdef/selection file.\n", enumName);
292 theEnum = findEnumInList(gROOT->GetListOfEnums(), enumName, kALoadAndInterpLookup);