63#include "RConfigure.h"
64#include "compiledata.h"
83#include "clang/AST/ASTContext.h"
84#include "clang/AST/Decl.h"
85#include "clang/AST/DeclarationName.h"
86#include "clang/AST/GlobalDecl.h"
87#include "clang/AST/RecordLayout.h"
88#include "clang/AST/DeclVisitor.h"
89#include "clang/AST/RecursiveASTVisitor.h"
90#include "clang/AST/Type.h"
91#include "clang/Basic/SourceLocation.h"
92#include "clang/Basic/Specifiers.h"
93#include "clang/Basic/TargetInfo.h"
94#include "clang/CodeGen/ModuleBuilder.h"
95#include "clang/Frontend/CompilerInstance.h"
96#include "clang/Frontend/FrontendDiagnostic.h"
97#include "clang/Lex/HeaderSearch.h"
98#include "clang/Lex/Preprocessor.h"
99#include "clang/Lex/PreprocessorOptions.h"
100#include "clang/Parse/Parser.h"
101#include "clang/Sema/Lookup.h"
102#include "clang/Sema/Sema.h"
103#include "clang/Serialization/ASTReader.h"
104#include "clang/Serialization/GlobalModuleIndex.h"
106#include "cling/Interpreter/ClangInternalState.h"
107#include "cling/Interpreter/DynamicLibraryManager.h"
108#include "cling/Interpreter/Interpreter.h"
109#include "cling/Interpreter/LookupHelper.h"
110#include "cling/Interpreter/Value.h"
111#include "cling/Interpreter/Transaction.h"
112#include "cling/MetaProcessor/MetaProcessor.h"
113#include "cling/Utils/AST.h"
114#include "cling/Utils/ParserStateRAII.h"
115#include "cling/Utils/SourceNormalization.h"
116#include "cling/Interpreter/Exception.h"
118#include "llvm/IR/GlobalValue.h"
119#include "llvm/IR/Module.h"
121#include "llvm/Support/DynamicLibrary.h"
122#include "llvm/Support/raw_ostream.h"
123#include "llvm/Support/Path.h"
124#include "llvm/Support/Process.h"
125#include "llvm/Object/ELFObjectFile.h"
126#include "llvm/Object/ObjectFile.h"
127#include "llvm/Object/SymbolicFile.h"
128#include "llvm/Support/FileSystem.h"
142#include <unordered_map>
143#include <unordered_set>
150#define R__DLLEXPORT __attribute__ ((visibility ("default")))
158#include <mach-o/dyld.h>
159#include <mach-o/loader.h>
173#if defined(__CYGWIN__)
174#include <sys/cygwin.h>
175#define HMODULE void *
177 __declspec(dllimport)
void * __stdcall GetCurrentProcess();
178 __declspec(dllimport)
bool __stdcall EnumProcessModules(
void *,
void **,
unsigned long,
unsigned long *);
179 __declspec(dllimport)
unsigned long __stdcall GetModuleFileNameExW(
void *,
void *,
wchar_t *,
unsigned long);
186# define STDIN_FILENO 0
189# define STDOUT_FILENO 1
192# define STDERR_FILENO 2
201#undef GetModuleFileName
202#define RTLD_DEFAULT ((void *)::GetModuleHandle(NULL))
203#define dlsym(library, function_name) ::GetProcAddress((HMODULE)library, function_name)
204#define dlopen(library_name, flags) ::LoadLibraryA(library_name)
205#define dlclose(library) ::FreeLibrary((HMODULE)library)
206#define R__DLLEXPORT __declspec(dllexport)
214 return D->getDeclContext();
217 return llvm::dyn_cast<clang::NamespaceDecl>(DC);
220 return llvm::dyn_cast<clang::RecordDecl>(DC);
223 return DC->dumpDeclContext();
232 return ((clang::Decl*)D)->dump();
235 if (clang::NamedDecl* ND = llvm::dyn_cast<clang::NamedDecl>(D)) {
238 llvm::raw_string_ostream OS(
name);
239 ND->getNameForDiagnostic(OS, D->getASTContext().getPrintingPolicy(),
242 printf(
"%s\n",
name.c_str());
250 return D->isInvalidDecl();
254 assert(info && info->
IsValid());
255 return info->
GetDecl()->isInvalidDecl();
259using namespace clang;
263 static const std::string gInterpreterClassDef = R
"ICF(
265#define ClassDef(name, id) \
266_ClassDefInterp_(name,id,virtual,) \
267static int DeclFileLine() { return __LINE__; }
269#define ClassDefNV(name, id) \
270_ClassDefInterp_(name,id,,) \
271static int DeclFileLine() { return __LINE__; }
272#undef ClassDefOverride
273#define ClassDefOverride(name, id) \
274_ClassDefInterp_(name,id,,override) \
275static int DeclFileLine() { return __LINE__; }
278 static const std::string gNonInterpreterClassDef = R
"ICF(
279#define __ROOTCLING__ 1
281#define ClassDef(name,id) \
282_ClassDefOutline_(name,id,virtual,) \
283static int DeclFileLine() { return __LINE__; }
285#define ClassDefNV(name, id)\
286_ClassDefOutline_(name,id,,)\
287static int DeclFileLine() { return __LINE__; }
288#undef ClassDefOverride
289#define ClassDefOverride(name, id)\
290_ClassDefOutline_(name,id,,override)\
291static int DeclFileLine() { return __LINE__; }
295 static const std::string gClassDefInterpMacro = R
"ICF(
298#define _ClassDefInterp_(name,id,virtual_keyword, overrd) \
301 static TClass *Class() { static TClass* sIsA = 0; if (!sIsA) sIsA = TClass::GetClass(#name); return sIsA; } \
302 static const char *Class_Name() { return #name; } \
303 virtual_keyword Bool_t CheckTObjectHashConsistency() const overrd { return true; } \
304 static Version_t Class_Version() { return id; } \
305 static TClass *Dictionary() { return 0; } \
306 virtual_keyword TClass *IsA() const overrd { return name::Class(); } \
307 virtual_keyword void ShowMembers(TMemberInspector&insp) const overrd { ::ROOT::Class_ShowMembers(name::Class(), this, insp); } \
308 virtual_keyword void Streamer(TBuffer&) overrd { ::Error("Streamer", "Cannot stream interpreted class."); } \
309 void StreamerNVirtual(TBuffer&ClassDef_StreamerNVirtual_b) { name::Streamer(ClassDef_StreamerNVirtual_b); } \
310 static const char *DeclFileName() { return __FILE__; } \
311 static int ImplFileLine() { return 0; } \
312 static const char *ImplFileName() { return __FILE__; }
351 return ((
TCling*)
gCling)->LibraryLoadingFailed(errmessage, libStem, permanent, resolved);
390 static vector<const NamedDecl*> updateList;
393 if (entered) topLevel =
kFALSE;
408 updateList.push_back(TD);
411 while (!updateList.empty()) {
413 updateList.pop_back();
420 const clang::Decl* D =
static_cast<const clang::Decl*
>(enumObj->
GetDeclId());
421 if(
const clang::EnumDecl* ED = dyn_cast<clang::EnumDecl>(D)) {
423 for (EnumDecl::enumerator_iterator EDI = ED->enumerator_begin(),
424 EDE = ED->enumerator_end(); EDI != EDE; ++EDI) {
426 std::string constbuf;
427 if (
const NamedDecl* END = llvm::dyn_cast<NamedDecl>(*EDI)) {
428 PrintingPolicy Policy((*EDI)->getASTContext().getPrintingPolicy());
429 llvm::raw_string_ostream stream(constbuf);
431 Policy.AnonymousTagLocations =
false;
432 (END)->getNameForDiagnostic(stream, Policy,
false);
434 const char* constantName = constbuf.c_str();
438 const llvm::APSInt valAPSInt = (*EDI)->getInitVal();
439 if (valAPSInt.isSigned()) {
440 value = valAPSInt.getSExtValue();
442 value = valAPSInt.getZExtValue();
449 DataMemberInfo_t* dmInfo = (DataMemberInfo_t*) tcDmInfo;
460 globals->
Add(enumConstant);
473 const clang::Decl* D =
static_cast<const clang::Decl*
>(VD);
475 if (
const EnumDecl* ED = llvm::dyn_cast<EnumDecl>(D)) {
477 PrintingPolicy Policy(ED->getASTContext().getPrintingPolicy());
478 llvm::raw_string_ostream stream(buf);
480 Policy.AnonymousTagLocations =
false;
481 ED->getNameForDiagnostic(stream, Policy,
false);
487 const char*
name = buf.c_str();
498 const clang::Decl* D =
static_cast<const clang::Decl*
>(DV);
500 if (!D->isCanonicalDecl() && !isa<clang::NamespaceDecl>(D)
501 && !dyn_cast<clang::RecordDecl>(D))
return;
503 if (isa<clang::FunctionDecl>(D->getDeclContext())
504 || isa<clang::TagDecl>(D->getDeclContext()))
508 if (
const clang::CXXRecordDecl* RD = dyn_cast<clang::CXXRecordDecl>(D)) {
509 if (RD->getDescribedClassTemplate())
511 }
else if (
const clang::FunctionDecl* FD = dyn_cast<clang::FunctionDecl>(D)) {
512 if (FD->getDescribedFunctionTemplate())
516 if (
const RecordDecl *TD = dyn_cast<RecordDecl>(D)) {
517 if (TD->isCanonicalDecl() || TD->isThisDeclarationADefinition())
520 else if (
const NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
522 if (
const TagDecl *TD = dyn_cast<TagDecl>(D)) {
526 }
else if (
const NamespaceDecl* NSD = dyn_cast<NamespaceDecl>(D)) {
531 if (!isa<TranslationUnitDecl>(ND->getDeclContext()))
535 if (isa<EnumDecl>(ND))
540 if (!(isa<VarDecl>(ND)))
544 if (
gROOT->GetListOfGlobals()->FindObject(ND->getNameAsString().c_str()))
548 gROOT->GetListOfGlobals()->Add(
new TGlobal((DataMemberInfo_t *)
550 cast<ValueDecl>(ND), 0)));
582 const char* canonicalName) {
583 ((
TCling*)
gCling)->LibraryLoaded(dyLibHandle, canonicalName);
588 ((
TCling *)
gCling)->RegisterRdictForLoadPCM(pcmFileNameFullPath, pcmContent);
592 const char* canonicalName) {
593 ((
TCling*)
gCling)->LibraryUnloaded(dyLibHandle, canonicalName);
599 return ((
TCling*)
gCling)->GetObjectAddress(Name, LookupCtx);
609 auto tcling =
new TCling(
"C++",
"cling C++ Interpreter", argv, interpLibHandle);
639 return ((
TCling*)
gCling)->IsAutoLoadNamespaceCandidate(nsDecl);
644 string file(fileName);
650 string &args,
string &io,
string &fname)
652 string file(fileName);
653 TString f, amode, arguments, aclicio;
656 io = aclicio.
Data(); fname =
f.Data();
666 char *__unDName(
char *demangled,
const char *mangled,
int out_len,
667 void * (* pAlloc )(
size_t),
void (* pFree )(
void *),
668 unsigned short int flags);
680 using namespace clang;
681 if (NamespaceDecl* nsd = llvm::dyn_cast<NamespaceDecl>(decl)){
685 if (ClassTemplateDecl* ctd = llvm::dyn_cast<ClassTemplateDecl>(decl)){
698 const std::vector<std::string> &headers,
699 const std::vector<std::string> &fwdDecls,
700 const std::vector<std::string> &unknown)
706 if (classes.empty()) {
710 const std::string& className = classes[0];
712 TString fileName =
"AutoDict_";
713 std::string::const_iterator sIt;
714 for (sIt = className.begin(); sIt != className.end(); ++sIt) {
715 if (*sIt ==
'<' || *sIt ==
'>' ||
716 *sIt ==
' ' || *sIt ==
'*' ||
717 *sIt ==
',' || *sIt ==
'&' ||
725 if (classes.size() > 1) {
727 std::vector<std::string>::const_iterator it = classes.begin();
728 while ((++it) != classes.end()) {
730 chk = chk * 3 + it->at(
cursor);
743 static const std::set<std::string> sSTLTypes {
744 "vector",
"list",
"forward_list",
"deque",
"map",
"unordered_map",
"multimap",
745 "unordered_multimap",
"set",
"unordered_set",
"multiset",
"unordered_multiset",
746 "queue",
"priority_queue",
"stack",
"iterator"};
747 std::vector<std::string>::const_iterator it;
748 std::string fileContent(
"");
749 for (it = headers.begin(); it != headers.end(); ++it) {
750 fileContent +=
"#include \"" + *it +
"\"\n";
752 for (it = unknown.begin(); it != unknown.end(); ++it) {
758 while (dirbase.
Length() && dirbase !=
"."
759 && dirbase !=
"include" && dirbase !=
"inc"
760 && dirbase !=
"prec_stl") {
764 fileContent +=
TString(
"#include \"") + header +
"\"\n";
767 for (it = fwdDecls.begin(); it != fwdDecls.end(); ++it) {
768 fileContent +=
"class " + *it +
";\n";
770 fileContent +=
"#ifdef __CLING__ \n";
771 fileContent +=
"#pragma link C++ nestedclasses;\n";
772 fileContent +=
"#pragma link C++ nestedtypedefs;\n";
773 for (it = classes.begin(); it != classes.end(); ++it) {
775 size_t posTemplate =
n.find(
'<');
776 std::set<std::string>::const_iterator iSTLType = sSTLTypes.end();
777 if (posTemplate != std::string::npos) {
778 n.erase(posTemplate, std::string::npos);
779 if (
n.compare(0, 5,
"std::") == 0) {
782 iSTLType = sSTLTypes.find(
n);
784 fileContent +=
"#pragma link C++ class ";
785 fileContent += *it +
"+;\n" ;
786 fileContent +=
"#pragma link C++ class ";
787 if (iSTLType != sSTLTypes.end()) {
791 fileContent += *it +
"::*;\n" ;
796 fileContent += *it +
"::*+;\n" ;
799 fileContent +=
"#endif\n";
803 filePointer = fopen(fileName,
"w");
804 if (filePointer == NULL) {
810 fprintf(filePointer,
"%s", fileContent.c_str());
826 const std::vector<std::string> &headers,
827 const std::vector<std::string> &fwdDecls,
828 const std::vector<std::string> &unknown)
834 std::vector<std::string> classes;
835 classes.push_back(className);
863 void exceptionErrorHandler(
void * ,
864 const std::string& reason,
866 throw std::runtime_error(std::string(
">>> Interpreter compilation error:\n") + reason);
880 class clangDiagSuppr {
882 clangDiagSuppr(clang::DiagnosticsEngine& diag): fDiagEngine(diag){
883 fOldDiagValue = fDiagEngine.getIgnoreAllWarnings();
884 fDiagEngine.setIgnoreAllWarnings(
true);
888 fDiagEngine.setIgnoreAllWarnings(fOldDiagValue);
891 clang::DiagnosticsEngine& fDiagEngine;
914 if (strncmp(tname.c_str(),
"const ", 6) == 0) {
917 unsigned long end = tname.length();
918 while( end && (tname[end-1]==
'&' || tname[end-1]==
'*' || tname[end-1]==
']') ) {
919 if ( tname[end-1]==
']' ) {
921 while ( end && tname[end-1]!=
'[' ) --end;
925 std::string innerbuf;
927 if (end != tname.length()) {
929 inner = innerbuf.c_str();
931 inner = tname.c_str()+
offset;
935 if (
gROOT->GetListOfClasses()->FindObject(inner)
945 const char *newname =
type->GetFullTypeName();
947 newname =
"Long64_t";
949 newname =
"ULong64_t";
951 if (strcmp(inner,newname) == 0) {
956 if ( end != tname.length() ) {
957 result += tname.substr(end,tname.length()-end);
965 if (lastPos != inner)
969 const auto enName = lastPos;
970 const auto scopeNameSize = ((
Long64_t)lastPos - (
Long64_t)inner) /
sizeof(
decltype(*lastPos)) - 2;
971 char *scopeName =
new char[scopeNameSize + 1];
972 strncpy(scopeName, inner, scopeNameSize);
973 scopeName[scopeNameSize] =
'\0';
975 if (
auto scope =
static_cast<TClass *
>(
gROOT->GetListOfClasses()->FindObject(scopeName))) {
976 auto enumTable =
dynamic_cast<const THashList *
>(scope->GetListOfEnums(
false));
977 if (enumTable && enumTable->THashList::FindObject(enName)) {
delete [] scopeName;
return true; }
981 auto listOfEnums = scope->GetListOfEnums();
983 auto enumTable =
dynamic_cast<const THashList *
>(listOfEnums);
984 if (enumTable && enumTable->THashList::FindObject(enName)) {
delete [] scopeName;
return true; }
991 auto enumTable =
dynamic_cast<const THashList *
>(
gROOT->GetListOfEnums());
992 if (enumTable && enumTable->THashList::FindObject(inner))
return true;
1015 return fContent.c_str();
1023 bool notPresent = fLinesHashSet.emplace(fHashFunc(str)).second;
1037static bool LoadModule(
const std::string &ModuleName, cling::Interpreter &interp)
1047 assert(!currentDir.empty());
1050 ::Info(
"TCling::__LoadModule",
"Preloading module %s. \n",
1051 ModuleName.c_str());
1053 return interp.loadModule(ModuleName,
true);
1059static void LoadModules(
const std::vector<std::string> &modules, cling::Interpreter &interp)
1061 for (
const auto &modName : modules)
1067 const static bool foundSymbol = dlsym(RTLD_DEFAULT,
"usedToIdentifyRootClingByDlSym");
1072static bool HasASTFileOnDisk(clang::Module *M,
const clang::Preprocessor &PP, std::string *FullFileName =
nullptr)
1074 const HeaderSearchOptions &HSOpts = PP.getHeaderSearchInfo().getHeaderSearchOpts();
1076 std::string ModuleFileName;
1077 if (!HSOpts.PrebuiltModulePaths.empty())
1079 ModuleFileName = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(M->Name);
1081 *FullFileName = ModuleFileName;
1083 return !ModuleFileName.empty();
1089 CompilerInstance &CI = *interp.getCI();
1090 Preprocessor &PP = CI.getPreprocessor();
1091 auto ModuleManager = CI.getASTReader();
1092 assert(ModuleManager);
1097 if (ModuleIndexPath.empty())
1100 ModuleManager->resetForReload();
1101 ModuleManager->loadGlobalIndex();
1102 GlobalModuleIndex *GlobalIndex = ModuleManager->getGlobalIndex();
1107 ModuleMap &MMap = PP.getHeaderSearchInfo().getModuleMap();
1108 bool RecreateIndex =
false;
1109 for (ModuleMap::module_iterator
I = MMap.module_begin(), E = MMap.module_end();
I != E; ++
I) {
1110 Module *TheModule =
I->second;
1115 RecreateIndex =
true;
1117 if (RecreateIndex) {
1118 cling::Interpreter::PushTransactionRAII deserRAII(&interp);
1119 clang::GlobalModuleIndex::UserDefinedInterestingIDs IDs;
1121 struct DefinitionFinder :
public RecursiveASTVisitor<DefinitionFinder> {
1122 DefinitionFinder(clang::GlobalModuleIndex::UserDefinedInterestingIDs& IDs,
1123 clang::TranslationUnitDecl* TU) : DefinitionIDs(IDs) {
1126 bool VisitNamedDecl(NamedDecl *ND) {
1127 if (!ND->isFromASTFile())
1129 if (!ND->getIdentifier())
1132 if (ND->getAccess() == AS_protected || ND->getAccess() == AS_private)
1135 if (TagDecl *TD = llvm::dyn_cast<TagDecl>(ND)) {
1136 if (TD->isCompleteDefinition())
1138 }
else if (NamespaceDecl *NSD = llvm::dyn_cast<NamespaceDecl>(ND)) {
1139 Register(NSD,
false);
1141 else if (TypedefNameDecl *TND = dyn_cast<TypedefNameDecl>(ND))
1147 clang::GlobalModuleIndex::UserDefinedInterestingIDs &DefinitionIDs;
1148 void Register(
const NamedDecl* ND,
bool AddSingleEntry =
true) {
1149 assert(ND->isFromASTFile());
1152 if (!ND->hasOwningModule()) {
1154 SourceManager &SM = ND->getASTContext().getSourceManager();
1155 SourceLocation Loc = ND->getLocation();
1156 const FileEntry *FE = SM.getFileEntryForID(SM.getFileID(Loc));
1158 assert(FE->getName().contains(
"input_line_"));
1163 Module *OwningModule = ND->getOwningModule()->getTopLevelModule();
1164 assert(OwningModule);
1165 assert(!ND->getName().empty() &&
"Empty name");
1166 if (AddSingleEntry && DefinitionIDs.count(ND->getName()))
1172 DefinitionIDs[ND->getName()].push_back(OwningModule->getASTFile());
1175 DefinitionFinder defFinder(IDs, CI.getASTContext().getTranslationUnitDecl());
1177 llvm::cantFail(GlobalModuleIndex::writeIndex(CI.getFileManager(),
1178 CI.getPCHContainerReader(),
1181 ModuleManager->resetForReload();
1182 ModuleManager->loadGlobalIndex();
1183 GlobalIndex = ModuleManager->getGlobalIndex();
1192 if (!clingInterp.getCI()->getLangOpts().Modules)
1196 cling::Interpreter::PushTransactionRAII deserRAII(&clingInterp);
1214 LoadModule(
"_Builtin_intrinsics", clingInterp);
1218 std::vector<std::string> CoreModules = {
"ROOT_Foundation_C",
1221 "ROOT_Foundation_Stage1_NoRTTI",
1230 std::vector<std::string> CommonModules = {
"MathCore"};
1236 std::vector<std::string> FIXMEModules = {
"Hist"};
1237 clang::CompilerInstance &CI = *clingInterp.getCI();
1238 clang::Preprocessor &PP = CI.getPreprocessor();
1239 ModuleMap &MMap = PP.getHeaderSearchInfo().getModuleMap();
1240 if (MMap.findModule(
"RInterface"))
1241 FIXMEModules.push_back(
"RInterface");
1245 GlobalModuleIndex *GlobalIndex =
nullptr;
1247 bool supportedPlatform =
1250#elif defined(R__MACOSX)
1257 llvm::Optional<std::string> envUseGMI = llvm::sys::Process::GetEnv(
"ROOT_USE_GMI");
1258 if (envUseGMI.hasValue()) {
1261 "Cannot convert '%s' to bool, setting to false!",
1262 envUseGMI->c_str());
1266 if (supportedPlatform ==
value)
1267 ::Warning(
"TCling__RegisterCxxModules",
"Global module index is%sused already!",
1268 (
value) ?
" " :
" not ");
1269 supportedPlatform =
value;
1272 if (supportedPlatform) {
1276 GlobalIndex = CI.getASTReader()->getGlobalIndex();
1279 llvm::StringSet<> KnownModuleFileNames;
1281 GlobalIndex->getKnownModuleFileNames(KnownModuleFileNames);
1283 std::vector<std::string> PendingModules;
1284 PendingModules.reserve(256);
1285 for (
auto I = MMap.module_begin(), E = MMap.module_end();
I != E; ++
I) {
1286 clang::Module *M =
I->second;
1290 std::string FullASTFilePath;
1294 if (GlobalIndex && KnownModuleFileNames.count(FullASTFilePath))
1297 if (M->IsUnimportable)
1305 if (std::find(CoreModules.begin(), CoreModules.end(), M->Name) != CoreModules.end())
1313 PendingModules.push_back(M->Name);
1320 assert(clingInterp.getMacro(
"gROOT") &&
"Couldn't load gROOT macro?");
1324 clingInterp.declare(R
"CODE(
1336 std::string PreIncludes;
1337 bool hasCxxModules = clingInterp.getCI()->getLangOpts().Modules;
1343 PreIncludes +=
"#include \"RtypesCore.h\"\n";
1346 PreIncludes +=
"#include \"Rtypes.h\"\n";
1348 PreIncludes += gClassDefInterpMacro +
"\n"
1349 + gInterpreterClassDef +
"\n"
1351 "#define ClassImp(X);\n";
1354 PreIncludes +=
"#include <string>\n";
1359 PreIncludes +=
"#include <cassert>\n";
1361 PreIncludes +=
"using namespace std;\n";
1362 clingInterp.declare(PreIncludes);
1382#ifdef R__USE_CXXMODULES
1386 llvm::install_fatal_error_handler(&exceptionErrorHandler);
1390 std::vector<std::string> clingArgsStorage;
1391 clingArgsStorage.push_back(
"cling4root");
1392 for (
const char*
const* arg = argv; *arg; ++arg)
1393 clingArgsStorage.push_back(*arg);
1396 if (!fromRootCling) {
1401 clingArgsStorage.push_back(
"-I" + interpInclude);
1404 clingArgsStorage.push_back(
"-I" + interpInclude +
"/cling");
1407 clingArgsStorage.push_back(
"-I" + interpInclude +
"/cling/plugins/include");
1418 std::string pchFilename = interpInclude +
"/allDict.cxx.pch";
1423 clingArgsStorage.push_back(
"-include-pch");
1424 clingArgsStorage.push_back(pchFilename);
1427 clingArgsStorage.push_back(
"-Wno-undefined-inline");
1428 clingArgsStorage.push_back(
"-fsigned-char");
1431#if !defined(_MSC_VER) || defined(_WIN64)
1432 clingArgsStorage.push_back(
"-O1");
1435 clingArgsStorage.push_back(
"-mllvm");
1436 clingArgsStorage.push_back(
"-optimize-regalloc=0");
1441 llvm::Optional<std::string> EnvOpt = llvm::sys::Process::GetEnv(
"EXTRA_CLING_ARGS");
1442 if (EnvOpt.hasValue()) {
1443 StringRef Env(*EnvOpt);
1444 while (!Env.empty()) {
1446 std::tie(Arg, Env) = Env.split(
' ');
1447 clingArgsStorage.push_back(Arg.str());
1451 auto GetEnvVarPath = [](
const std::string &EnvVar,
1452 std::vector<std::string> &Paths) {
1453 llvm::Optional<std::string> EnvOpt = llvm::sys::Process::GetEnv(EnvVar);
1454 if (EnvOpt.hasValue()) {
1455 StringRef Env(*EnvOpt);
1456 while (!Env.empty()) {
1459 if (std::find(Paths.begin(), Paths.end(), Arg.str()) == Paths.end())
1460 Paths.push_back(Arg.str());
1466 std::vector<std::string> Paths;
1475 GetEnvVarPath(
"CLING_PREBUILT_MODULE_PATH", Paths);
1476 std::string EnvVarPath;
1477 for (
const std::string& P : Paths)
1480 gSystem->
Setenv(
"CLING_PREBUILT_MODULE_PATH", EnvVarPath.c_str());
1484 EnvOpt = llvm::sys::Process::GetEnv(
"ROOT_CLING_TIMING");
1485 if (EnvOpt.hasValue())
1486 clingArgsStorage.push_back(
"-ftime-report");
1493 std::vector<std::string> ModuleMaps;
1497 GetEnvVarPath(
"CLING_MODULEMAP_FILES", ModuleMaps);
1501 if (llvm::sys::fs::exists(cwd + ModuleMapSuffix))
1502 ModuleMaps.push_back(cwd + ModuleMapSuffix);
1504 for (
const std::string& M : ModuleMaps)
1505 clingArgsStorage.push_back(
"-fmodule-map-file=" + M);
1507 std::string ModulesCachePath;
1508 EnvOpt = llvm::sys::Process::GetEnv(
"CLING_MODULES_CACHE_PATH");
1509 if (EnvOpt.hasValue()){
1510 StringRef Env(*EnvOpt);
1511 assert(llvm::sys::fs::exists(Env) &&
"Path does not exist!");
1512 ModulesCachePath = Env.str();
1517 clingArgsStorage.push_back(
"-fmodules-cache-path=" + ModulesCachePath);
1520 std::vector<const char*> interpArgs;
1521 for (std::vector<std::string>::const_iterator iArg = clingArgsStorage.begin(),
1522 eArg = clingArgsStorage.end(); iArg != eArg; ++iArg)
1523 interpArgs.push_back(iArg->c_str());
1530 if (!fromRootCling) {
1532 interpArgs.push_back(
"-fmodules");
1533 interpArgs.push_back(
"-fno-implicit-module-maps");
1537 interpArgs.push_back(
"-Rmodule-build");
1543 interpArgs.push_back(
"-fno-autolink");
1548 interpArgs.push_back(
"-ffast-math");
1554 extraArgs && *extraArgs; ++extraArgs) {
1555 if (!strcmp(*extraArgs,
"-resource-dir")) {
1557 llvmResourceDir = *(++extraArgs);
1559 interpArgs.push_back(*extraArgs);
1563 std::vector<std::string> _empty;
1565 for (
const auto &arg: args)
1566 interpArgs.emplace_back(arg.c_str());
1569 cling::Interpreter::ModuleFileExtensions extensions;
1570 EnvOpt = llvm::sys::Process::GetEnv(
"ROOTDEBUG_RDICT");
1571 if (!EnvOpt.hasValue())
1572 extensions.push_back(std::make_shared<TClingRdictModuleFileExtension>());
1574 fInterpreter = std::make_unique<cling::Interpreter>(interpArgs.size(),
1576 llvmResourceDir, extensions,
1580 fInterpreter->getCI()->getPreprocessorOpts().DisablePCHOrModuleValidation =
1581 DisableValidationForModuleKind::All;
1585 fInterpreter->getCI()->getLangOpts().SpellChecking =
false;
1588 auto isModulesArg = [](
const char* arg) {
return !strcmp(arg,
"-fmodules"); };
1589 bool hasModulesArg = std::find_if(interpArgs.begin(), interpArgs.end(), isModulesArg) != interpArgs.end();
1590 fInterpreter->getCI()->getLangOpts().Modules = hasModulesArg;
1595 static llvm::raw_fd_ostream fMPOuts (STDOUT_FILENO,
false);
1615 if (!fromRootCling) {
1620 fInterpreter->getRuntimeOptions().AllowRedefinition = 1;
1621 auto &Policy =
const_cast<clang::PrintingPolicy &
>(
fInterpreter->getCI()->getASTContext().getPrintingPolicy());
1625 Policy.SplitTemplateClosers =
true;
1627 Policy.SuppressDefaultTemplateArgs =
false;
1633 std::unique_ptr<TClingCallbacks>
1639 if (!fromRootCling) {
1640 cling::DynamicLibraryManager& DLM = *
fInterpreter->getDynamicLibraryManager();
1645 auto ShouldPermanentlyIgnore = [](llvm::StringRef FileName) ->
bool{
1646 llvm::StringRef stem = llvm::sys::path::stem(FileName);
1647 return stem.startswith(
"libNew") || stem.startswith(
"libcppyy_backend");
1650 DLM.initializeDyld(ShouldPermanentlyIgnore);
1688 assert(
GetRootMapFiles() == 0 &&
"Must be called before LoadLibraryMap!");
1707 auto setFactory = []() {
1711 static bool doneFactory = setFactory();
1723 if (llvm::sys::fs::exists(pcmFileNameFullPath)) {
1724 ::Error(
"TCling::RegisterRdictForLoadPCM",
"Rdict '%s' is both in Module extension and in File system.", pcmFileNameFullPath.c_str());
1741 if (listOfKeys && ((listOfKeys->GetSize() == 0) ||
1742 ((listOfKeys->GetSize() == 1) &&
1743 !strcmp(((
TKey *)listOfKeys->At(0))->GetName(),
"EMPTY")
1750 ::Info(
"TCling::LoadPCMImpl",
"reading protoclasses for %s \n", pcmFile.
GetName());
1756 auto listOfGlobals =
gROOT->GetListOfGlobals();
1757 auto listOfEnums =
dynamic_cast<THashList *
>(
gROOT->GetListOfEnums());
1759 for (
auto selEnum : *enums) {
1760 const char *enumScope = selEnum->
GetTitle();
1761 const char *enumName = selEnum->GetName();
1762 if (strcmp(enumScope,
"") == 0) {
1765 if (!listOfEnums->THashList::FindObject(enumName)) {
1766 ((
TEnum *)selEnum)->SetClass(
nullptr);
1767 listOfEnums->Add(selEnum);
1769 for (
auto enumConstant : *
static_cast<TEnum *
>(selEnum)->GetConstants()) {
1770 if (!listOfGlobals->FindObject(enumConstant)) {
1771 listOfGlobals->Add(enumConstant);
1778 if (!nsTClassEntry) {
1781 auto listOfEnums = nsTClassEntry->
fEnums.load();
1792 if (listOfEnums && !listOfEnums->THashList::FindObject(enumName)) {
1793 ((
TEnum *)selEnum)->SetClass(nsTClassEntry);
1794 listOfEnums->Add(selEnum);
1802 pcmFile.
GetObject(
"__ProtoClasses", protoClasses);
1805 for (
auto obj : *protoClasses) {
1815 for (
auto proto : *protoClasses) {
1823 ::Error(
"TCling::LoadPCM",
"Inconsistent TClassTable for %s",
proto->GetName());
1834 protoClasses->
Clear();
1835 delete protoClasses;
1839 pcmFile.
GetObject(
"__Typedefs", dataTypes);
1841 for (
auto typedf : *dataTypes)
1842 gROOT->GetListOfTypes()->Add(typedf);
1855 assert(!pcmFileNameFullPath.empty());
1856 assert(llvm::sys::path::is_absolute(pcmFileNameFullPath));
1859 TString pcmFileName = pcmFileNameFullPath;
1867 llvm::SaveAndRestore<Int_t> SaveGDebug(
gDebug);
1870 ::Info(
"TCling::LoadPCM",
"Loading ROOT PCM %s", pcmFileName.
Data());
1875 if (llvm::sys::fs::is_symlink_file(pcmFileNameFullPath))
1880 llvm::StringRef pcmContent = pendingRdict->second;
1882 std::string RDictFileOpts = pcmFileNameFullPath +
"?filetype=pcm";
1883 TMemFile pcmMemFile(RDictFileOpts.c_str(), range);
1898 if (!llvm::sys::fs::exists(pcmFileNameFullPath)) {
1899 ::Error(
"TCling::LoadPCM",
"ROOT PCM %s file does not exist",
1900 pcmFileNameFullPath.data());
1903 ::Info(
"TCling::LoadPCM",
"In-memory ROOT PCM candidate %s\n",
1904 rdict.first.c_str());
1908 if (!
gROOT->IsRootFile(pcmFileName)) {
1909 Fatal(
"LoadPCM",
"The file %s is not a ROOT as was expected\n", pcmFileName.
Data());
1912 TFile pcmFile(pcmFileName +
"?filetype=pcm",
"READ");
1919 using namespace clang;
1921 class ExtLexicalStorageAdder:
public RecursiveASTVisitor<ExtLexicalStorageAdder>{
1926 bool VisitRecordDecl(clang::RecordDecl* rcd){
1928 Info(
"ExtLexicalStorageAdder",
1929 "Adding external lexical storage to class %s",
1930 rcd->getNameAsString().c_str());
1931 auto reDeclPtr = rcd->getMostRecentDecl();
1933 reDeclPtr->setHasExternalLexicalStorage();
1934 }
while ((reDeclPtr = reDeclPtr->getPreviousDecl()));
1947 const std::string &ModuleMapName )
const
1949 assert(llvm::sys::path::is_absolute(FullPath));
1950 Preprocessor &PP =
fInterpreter->getCI()->getPreprocessor();
1951 FileManager &FM = PP.getFileManager();
1954 if (
auto DE = FM.getOptionalDirectoryRef(FullPath)) {
1955 HeaderSearch &HS = PP.getHeaderSearchInfo();
1956 HeaderSearchOptions &HSOpts = HS.getHeaderSearchOpts();
1957 const auto &ModPaths = HSOpts.PrebuiltModulePaths;
1958 bool pathExists = std::find(ModPaths.begin(), ModPaths.end(), FullPath) != ModPaths.end();
1960 HSOpts.AddPrebuiltModulePath(FullPath);
1965 llvm::SmallString<256> ModuleMapFileName(DE->getName());
1966 llvm::sys::path::append(ModuleMapFileName, ModuleMapName);
1967 if (
auto FE = FM.getOptionalFileRef(ModuleMapFileName,
false,
1969 if (!HS.loadModuleMapFile(*FE,
false))
1971 Error(
"RegisterPrebuiltModulePath",
"Could not load modulemap in %s", ModuleMapFileName.c_str());
1988 "libforward_listDict",
1996 "libunordered_setDict",
1997 "libunordered_multisetDict",
1998 "libunordered_mapDict",
1999 "libunordered_multimapDict",
2007 char dyLibError[1000];
2008 FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
2009 dyLibError,
sizeof(dyLibError), NULL);
2011 const char *dyLibError = dlerror();
2013 ::Error(
"TCling::RegisterModule",
"Cannot open shared library %s for dictionary %s:\n %s", dyLibName, modulename,
2014 (dyLibError) ? dyLibError :
"");
2051 const char** headers,
2052 const char** includePaths,
2053 const char* payloadCode,
2054 const char* fwdDeclsCode,
2055 void (*triggerFunc)(),
2057 const char** classesHeaders,
2058 Bool_t lateRegistration ,
2065 if (fromRootCling)
return;
2074 bool isACLiC = strstr(modulename,
"_ACLiC_dict") !=
nullptr;
2075 if (hasHeaderParsingOnDemand && isACLiC) {
2077 Info(
"TCling::RegisterModule",
2078 "Header parsing on demand is active but this is an Aclic library. Disabling it for this library.");
2079 hasHeaderParsingOnDemand =
false;
2093 for (
const char** inclPath = includePaths; *inclPath; ++inclPath) {
2096 cling::Transaction* T = 0;
2098 for (
auto& fwdDeclArgToSkipPair : fwdDeclsArgToSkip){
2099 const std::string& fwdDecl = fwdDeclArgToSkipPair.first;
2100 const int nArgsToSkip = fwdDeclArgToSkipPair.second;
2101 auto compRes =
fInterpreter->declare(fwdDecl.c_str(), &T);
2102 assert(cling::Interpreter::kSuccess == compRes &&
2103 "A fwd declaration could not be compiled");
2104 if (compRes!=cling::Interpreter::kSuccess){
2105 Warning(
"TCling::RegisterModule",
2106 "Problems in declaring string '%s' were encountered.",
2121 TString code = gNonInterpreterClassDef;
2123 code += payloadCode;
2125 std::string dyLibName = cling::DynamicLibraryManager::getSymbolLocation(triggerFunc);
2126 assert(!llvm::sys::fs::is_symlink_file(dyLibName));
2128 if (dyLibName.empty()) {
2129 ::Error(
"TCling::RegisterModule",
"Dictionary trigger function for %s not found", modulename);
2134 bool isSharedLib = cling::DynamicLibraryManager::isSharedLibrary(dyLibName);
2136 bool wasDlopened =
false;
2141 if (!lateRegistration) {
2148 void* dyLibHandle = dlopen(dyLibName.c_str(), RTLD_LAZY | RTLD_GLOBAL);
2158 if (hasHeaderParsingOnDemand && fwdDeclsCode){
2161 std::string fwdDeclsCodeLessEnums;
2165 std::string fwdDeclsLine;
2166 std::istringstream fwdDeclsCodeStr(fwdDeclsCode);
2167 std::vector<std::string> scopes;
2168 while (std::getline(fwdDeclsCodeStr, fwdDeclsLine)) {
2169 const auto enumPos = fwdDeclsLine.find(
"enum __attribute__((annotate(\"");
2171 if (enumPos != std::string::npos) {
2178 auto nsPos = fwdDeclsLine.find(
"namespace");
2179 R__ASSERT(nsPos < enumPos &&
"Inconsistent enum and enclosing scope parsing!");
2180 while (nsPos < enumPos && nsPos != std::string::npos) {
2182 const auto nsNameStart = nsPos + 10;
2183 const auto nsNameEnd = fwdDeclsLine.find(
'{', nsNameStart);
2184 const auto nsName = fwdDeclsLine.substr(nsNameStart, nsNameEnd - nsNameStart);
2185 scopes.push_back(nsName);
2186 nsPos = fwdDeclsLine.find(
"namespace", nsNameEnd);
2189 clang::DeclContext* DC = 0;
2190 for (
auto &&aScope: scopes) {
2191 DC = cling::utils::Lookup::Namespace(&
fInterpreter->getSema(), aScope.c_str(), DC);
2197 if (scopes.empty() || DC) {
2201 size_t posEnumName = fwdDeclsLine.rfind(
"\"))) ");
2202 R__ASSERT(posEnumName != std::string::npos &&
"Inconsistent enum fwd decl!");
2204 while (isspace(fwdDeclsLine[posEnumName]))
2206 size_t posEnumNameEnd = fwdDeclsLine.find(
" : ", posEnumName);
2207 R__ASSERT(posEnumNameEnd != std::string::npos &&
"Inconsistent enum fwd decl (end)!");
2208 while (isspace(fwdDeclsLine[posEnumNameEnd]))
2212 std::string enumName = fwdDeclsLine.substr(posEnumName,
2213 posEnumNameEnd - posEnumName + 1);
2215 if (clang::NamedDecl* enumDecl
2216 = cling::utils::Lookup::Named(&
fInterpreter->getSema(),
2217 enumName.c_str(), DC)) {
2220 R__ASSERT(llvm::dyn_cast<clang::EnumDecl>(enumDecl) &&
"not an enum decl!");
2227 fwdDeclsCodeLessEnums += fwdDeclsLine +
"\n";
2231 if (!fwdDeclsCodeLessEnums.empty()){
2232 auto compRes =
fInterpreter->declare(fwdDeclsCodeLessEnums, &T);
2233 assert(cling::Interpreter::kSuccess == compRes &&
2234 "The forward declarations could not be compiled");
2235 if (compRes!=cling::Interpreter::kSuccess){
2236 Warning(
"TCling::RegisterModule",
2237 "Problems in compiling forward declarations for module %s: '%s'",
2238 modulename, fwdDeclsCodeLessEnums.c_str()) ;
2246 ExtLexicalStorageAdder elsa;
2247 for (
auto dciIt = T->decls_begin();dciIt!=T->decls_end();dciIt++){
2248 cling::Transaction::DelayCallInfo& dci = *dciIt;
2249 for(
auto dit = dci.m_DGR.begin(); dit != dci.m_DGR.end(); ++dit) {
2250 clang::Decl* declPtr = *dit;
2251 elsa.TraverseDecl(declPtr);
2265 for (
const char** classesHeader = classesHeaders; *classesHeader; ++classesHeader) {
2266 temp=*classesHeader;
2268 size_t theTemplateHash = 0;
2269 bool addTemplate =
false;
2270 size_t posTemplate = temp.find(
'<');
2271 if (posTemplate != std::string::npos) {
2273 std::string templateName = temp.substr(0, posTemplate);
2279 for (
const char** classesHeader_inner = classesHeader; 0!=strcmp(*classesHeader_inner,
"@"); ++classesHeader_inner,++classesHeader){
2281 if (payloadCode == *classesHeader_inner ){
2283 if (addTemplate)
fPayloads.insert(theTemplateHash);
2286 Info(
"TCling::RegisterModule",
2287 "Adding a header for %s", temp.c_str());
2293 addTemplate =
false;
2301 bool ModuleWasSuccessfullyLoaded =
false;
2303 std::string ModuleName = modulename;
2304 if (llvm::StringRef(modulename).startswith(
"lib"))
2305 ModuleName = llvm::StringRef(modulename).substr(3).str();
2310 clang::Preprocessor &PP = TheSema.getPreprocessor();
2311 std::string ModuleMapName;
2313 ModuleMapName = ModuleName +
".modulemap";
2315 ModuleMapName =
"module.modulemap";
2323 if (!ModuleWasSuccessfullyLoaded) {
2325 clang::HeaderSearch &headerSearch = PP.getHeaderSearchInfo();
2326 clang::ModuleMap &moduleMap = headerSearch.getModuleMap();
2327 if (moduleMap.findModule(ModuleName))
2328 Info(
"TCling::RegisterModule",
"Module %s in modulemap failed to load.", ModuleName.c_str());
2333 llvm::SmallString<256> pcmFileNameFullPath(dyLibName);
2336 llvm::sys::fs::make_absolute(pcmFileNameFullPath);
2337 llvm::sys::path::remove_filename(pcmFileNameFullPath);
2338 llvm::sys::path::append(pcmFileNameFullPath,
2340 LoadPCM(pcmFileNameFullPath.str().str());
2347 clangDiagSuppr diagSuppr(TheSema.getDiagnostics());
2349#if defined(R__MUST_REVISIT)
2350#if R__MUST_REVISIT(6,2)
2351 Warning(
"TCling::RegisterModule",
"Diagnostics suppression should be gone by now.");
2355 if (!ModuleWasSuccessfullyLoaded && !hasHeaderParsingOnDemand){
2358 const cling::Transaction* watermark =
fInterpreter->getLastTransaction();
2359 cling::Interpreter::CompilationResult compRes =
fInterpreter->parseForModule(code.
Data());
2365 assert(cling::Interpreter::kSuccess == compRes &&
2366 "Payload code of a dictionary could not be parsed correctly.");
2367 if (compRes!=cling::Interpreter::kSuccess) {
2368 Warning(
"TCling::RegisterModule",
2369 "Problems declaring payload for module %s.", modulename) ;
2382 if (!ModuleWasSuccessfullyLoaded && !hasHeaderParsingOnDemand) {
2385 "#undef __ROOTCLING__\n"
2386 + gInterpreterClassDef +
2391 assert(isSharedLib);
2394 dlclose(dyLibHandle);
2400 ASTContext &C = CI.getASTContext();
2408 if (IdentifierInfoLookup *External = C.Idents.getExternalIdentifierLookup()) {
2409 std::unique_ptr<IdentifierIterator> Iter(External->getIdentifiers());
2410 for (llvm::StringRef Ident = Iter->Next(); !Ident.empty(); Ident = Iter->Next()) {
2411 std::string
I = Ident.str();
2435 typedef std::vector<std::pair<TClass*,DictFuncPtr_t> >::iterator iterator;
2441 if ( i->first == oldcl ) {
2464 const char* input_line,
2465 cling::Interpreter::CompilationResult& compRes,
2469 return metaProcessor->process(input_line, compRes,
result);
2471 catch (cling::InterpreterException&
ex)
2473 Error(
"HandleInterpreterException",
"%s\n%s",
ex.what(),
"Execution of your code was aborted.");
2475 compRes = cling::Interpreter::kFailure;
2484 if (
auto ie =
dynamic_cast<const cling::InterpreterException*
>(&
e)) {
2510 gROOT->SetLineIsProcessing();
2514 gROOT->SetLineHasBeenProcessed();
2527 gROOT->SetLineIsProcessing();
2529 struct InterpreterFlagsRAII {
2530 cling::Interpreter* fInterpreter;
2531 bool fWasDynamicLookupEnabled;
2533 InterpreterFlagsRAII(cling::Interpreter* interp):
2534 fInterpreter(interp),
2535 fWasDynamicLookupEnabled(interp->isDynamicLookupEnabled())
2537 fInterpreter->enableDynamicLookup(
true);
2539 ~InterpreterFlagsRAII() {
2540 fInterpreter->enableDynamicLookup(fWasDynamicLookupEnabled);
2541 gROOT->SetLineHasBeenProcessed();
2550 cling::Interpreter::CompilationResult compRes = cling::Interpreter::kSuccess;
2551 if (!strncmp(sLine.
Data(),
".L", 2) || !strncmp(sLine.
Data(),
".x", 2) ||
2552 !strncmp(sLine.
Data(),
".X", 2)) {
2560 aclicMode, arguments, io);
2561 if (aclicMode.
Length()) {
2563 R__ASSERT(aclicMode[0]==
'+' &&
"ACLiC mode must start with a +");
2565 if (aclicMode[1]==
'+') {
2571 compRes = cling::Interpreter::kFailure;
2573 if (strncmp(sLine.
Data(),
".L", 2) != 0) {
2576 if (arguments.
Length()==0) {
2585 mod_line = function + arguments + io;
2591 size_t unnamedMacroOpenCurly;
2594 std::string codeline;
2597 std::ifstream in(fname, std::ifstream::binary);
2599 std::getline(in, codeline);
2600 code += codeline +
"\n";
2602 unnamedMacroOpenCurly
2603 = cling::utils::isUnnamedMacro(code,
fInterpreter->getCI()->getLangOpts());
2607 if (unnamedMacroOpenCurly != std::string::npos) {
2609 unnamedMacroOpenCurly);
2619 if (0!=strncmp(sLine.
Data(),
".autodict ",10) && sLine !=
".autodict") {
2624 bool isInclusionDirective = sLine.
Contains(
"\n#include") || sLine.
BeginsWith(
"#include");
2625 if (isInclusionDirective) {
2642 case cling::Interpreter::kSuccess: *error =
kNoError;
break;
2643 case cling::Interpreter::kFailure: *error =
kRecoverable;
break;
2644 case cling::Interpreter::kMoreInputExpected: *error =
kProcessing;
break;
2647 if (compRes == cling::Interpreter::kSuccess
2678 if (path[0] ==
'-' && path[1] ==
'I')
2703 static const TClassRef clRefString(
"std::string");
2704 if (clRefString == cl) {
2714 const char* cobj = (
const char*) obj;
2721 auto inspInspect = [&] (ptrdiff_t
offset){
2727 switch(complexType) {
2734 inspInspect(
sizeof(
float));
2739 inspInspect(
sizeof(
double));
2744 inspInspect(
sizeof(
int));
2749 inspInspect(
sizeof(
long));
2754 static clang::PrintingPolicy
2756 if (printPol.Indentation) {
2758 printPol.Indentation = 0;
2759 printPol.SuppressInitializers =
true;
2762 const char* clname = cl->
GetName();
2765 const clang::ASTContext& astContext =
fInterpreter->getCI()->getASTContext();
2766 const clang::Decl *scopeDecl = 0;
2767 const clang::Type *recordType = 0;
2771 scopeDecl = clingCI->
GetDecl();
2772 recordType = clingCI->
GetType();
2774 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
2776 scopeDecl = lh.findScope(clname, cling::LookupHelper::NoDiagnostics,
2780 Error(
"InspectMembers",
"Cannot find Decl for class %s", clname);
2783 const clang::CXXRecordDecl* recordDecl
2784 = llvm::dyn_cast<const clang::CXXRecordDecl>(scopeDecl);
2786 Error(
"InspectMembers",
"Cannot find Decl for class %s is not a CXXRecordDecl.", clname);
2795 astContext.getASTRecordLayout(recordDecl);
2797 for (clang::RecordDecl::field_iterator iField = recordDecl->field_begin(),
2798 eField = recordDecl->field_end(); iField != eField; ++iField) {}
2801 const clang::ASTRecordLayout& recLayout
2802 = astContext.getASTRecordLayout(recordDecl);
2809 if (cl->
Size() != recLayout.getSize().getQuantity()) {
2810 Error(
"InspectMembers",
"TClass and cling disagree on the size of the class %s, respectively %d %lld\n",
2814 unsigned iNField = 0;
2817 for (clang::RecordDecl::field_iterator iField = recordDecl->field_begin(),
2818 eField = recordDecl->field_end(); iField != eField;
2819 ++iField, ++iNField) {
2822 clang::QualType memberQT = iField->getType();
2827 memberQT = cling::utils::Transform::GetPartiallyDesugaredType(astContext, memberQT,
fNormalizedCtxt->
GetConfig(),
false );
2828 if (memberQT.isNull()) {
2829 std::string memberName;
2830 llvm::raw_string_ostream stream(memberName);
2832 printPol.AnonymousTagLocations =
false;
2833 iField->getNameForDiagnostic(stream, printPol,
true );
2835 Error(
"InspectMembers",
2836 "Cannot retrieve QualType for member %s while inspecting class %s",
2837 memberName.c_str(), clname);
2840 const clang::Type* memType = memberQT.getTypePtr();
2842 std::string memberName;
2843 llvm::raw_string_ostream stream(memberName);
2845 printPol.AnonymousTagLocations =
false;
2846 iField->getNameForDiagnostic(stream, printPol,
true );
2848 Error(
"InspectMembers",
2849 "Cannot retrieve Type for member %s while inspecting class %s",
2850 memberName.c_str(), clname);
2854 const clang::Type* memNonPtrType = memType;
2855 Bool_t ispointer =
false;
2856 if (memNonPtrType->isPointerType()) {
2858 clang::QualType ptrQT
2859 = memNonPtrType->getAs<clang::PointerType>()->getPointeeType();
2864 ptrQT = cling::utils::Transform::GetPartiallyDesugaredType(astContext, ptrQT,
fNormalizedCtxt->
GetConfig(),
false );
2865 if (ptrQT.isNull()) {
2866 std::string memberName;
2867 llvm::raw_string_ostream stream(memberName);
2869 printPol.AnonymousTagLocations =
false;
2870 iField->getNameForDiagnostic(stream, printPol,
true );
2872 Error(
"InspectMembers",
2873 "Cannot retrieve pointee Type for member %s while inspecting class %s",
2874 memberName.c_str(), clname);
2877 memNonPtrType = ptrQT.getTypePtr();
2881 llvm::SmallString<8> arraySize;
2882 const clang::ArrayType* arrType = memNonPtrType->getAsArrayTypeUnsafe();
2883 unsigned arrLevel = 0;
2884 bool haveErrorDueToArray =
false;
2888 const clang::ConstantArrayType* constArrType =
2889 clang::dyn_cast<clang::ConstantArrayType>(arrType);
2891 constArrType->getSize().toStringUnsigned(arraySize);
2894 clang::QualType subArrQT = arrType->getElementType();
2895 if (subArrQT.isNull()) {
2896 std::string memberName;
2897 llvm::raw_string_ostream stream(memberName);
2899 printPol.AnonymousTagLocations =
false;
2900 iField->getNameForDiagnostic(stream, printPol,
true );
2902 Error(
"InspectMembers",
2903 "Cannot retrieve QualType for array level %d (i.e. element type of %s) for member %s while inspecting class %s",
2904 arrLevel, subArrQT.getAsString(printPol).c_str(),
2905 memberName.c_str(), clname);
2906 haveErrorDueToArray =
true;
2909 arrType = subArrQT.getTypePtr()->getAsArrayTypeUnsafe();
2911 if (haveErrorDueToArray) {
2916 std::string fieldName;
2917 if (memType->isPointerType()) {
2922 std::string ioname(iField->getName());
2924 fieldName += ioname;
2925 fieldName += arraySize;
2930 clang::CharUnits
offset(astContext.toCharUnitsFromBits(recLayout.getFieldOffset(iNField)));
2931 ptrdiff_t fieldOffset =
offset.getQuantity();
2941 auto iFiledQtype = iField->getType();
2942 if (
auto tagDecl = iFiledQtype->getAsTagDecl()){
2943 auto declAccess = tagDecl->getAccess();
2944 if (declAccess == AS_private || declAccess == AS_protected) {
2950 insp.
Inspect(
const_cast<TClass*
>(cl), insp.
GetParent(), fieldName.c_str(), cobj + fieldOffset, isTransient);
2953 const clang::CXXRecordDecl* fieldRecDecl = memNonPtrType->getAsCXXRecordDecl();
2954 if (fieldRecDecl && !fieldRecDecl->isAnonymousStructOrUnion()) {
2957 std::string sFieldRecName;
2960 clang::QualType(memNonPtrType,0),
2970 insp.
InspectMember(sFieldRecName.c_str(), cobj + fieldOffset,
2971 (fieldName +
'.').c_str(), transient);
2979 unsigned iNBase = 0;
2980 for (clang::CXXRecordDecl::base_class_const_iterator iBase
2981 = recordDecl->bases_begin(), eBase = recordDecl->bases_end();
2982 iBase != eBase; ++iBase, ++iNBase) {
2983 clang::QualType baseQT = iBase->getType();
2984 if (baseQT.isNull()) {
2985 Error(
"InspectMembers",
2986 "Cannot find QualType for base number %d while inspecting class %s",
2990 const clang::CXXRecordDecl* baseDecl
2991 = baseQT->getAsCXXRecordDecl();
2993 Error(
"InspectMembers",
2994 "Cannot find CXXRecordDecl for base number %d while inspecting class %s",
2999 std::string sBaseName;
3001 std::vector<TClass*> foundClasses;
3003 if (foundClasses.size()==1){
3004 baseCl=foundClasses[0];
3017 std::string qualNameForDiag;
3019 Error(
"InspectMembers",
3020 "Cannot find TClass for base class %s", qualNameForDiag.c_str() );
3025 if (iBase->isVirtual()) {
3028 Error(
"InspectMembers",
3029 "Base %s of class %s is virtual but no object provided",
3030 sBaseName.c_str(), clname);
3038 baseOffset = ci->
GetBaseOffset(baseCi,
const_cast<void*
>(obj),
3040 if (baseOffset == -1) {
3041 Error(
"InspectMembers",
3042 "Error calculating offset of virtual base %s of class %s",
3043 sBaseName.c_str(), clname);
3046 Error(
"InspectMembers",
3047 "Cannot calculate offset of virtual base %s of class %s",
3048 sBaseName.c_str(), clname);
3053 baseOffset = recLayout.getBaseClassOffset(baseDecl).getQuantity();
3100 bool oldDynLookup =
fInterpreter->isDynamicLookupEnabled();
3129 return fInterpreter->getDynamicLibraryManager()->isLibraryLoaded(tLibName.
Data());
3144 llvm::StringRef ModuleName(libname);
3145 ModuleName = llvm::sys::path::stem(ModuleName);
3146 ModuleName.consume_front(
"lib");
3154 clang::ModuleMap &moduleMap =
fInterpreter->getCI()->getPreprocessor().getHeaderSearchInfo().getModuleMap();
3155 clang::Module *M = moduleMap.findModule(ModuleName);
3156 return M && !M->IsUnimportable && M->getASTFile();
3175 size_t at = std::string::npos;
3176 while ((at = file_name.find(
"/./")) != std::string::npos)
3177 file_name.replace(at, 3,
"/");
3179 std::string filesStr =
"";
3180 llvm::raw_string_ostream filesOS(filesStr);
3181 clang::SourceManager &SM =
fInterpreter->getCI()->getSourceManager();
3182 cling::ClangInternalState::printIncludedFiles(filesOS, SM);
3185 llvm::SmallVector<llvm::StringRef, 100> files;
3186 llvm::StringRef(filesStr).split(files,
"\n");
3188 std::set<std::string> fileMap;
3189 llvm::StringRef file_name_ref(file_name);
3191 for (llvm::SmallVector<llvm::StringRef, 100>::const_iterator
3192 iF = files.begin(), iE = files.end(); iF != iE; ++iF) {
3193 if ((*iF) == file_name_ref)
return kTRUE;
3194 fileMap.insert(iF->str());
3197 if (fileMap.empty())
return kFALSE;
3200 TString sFilename(file_name.c_str());
3202 && fileMap.count(sFilename.
Data())) {
3210 while (incPath.
Index(
" :") != -1) {
3214 sFilename = file_name.c_str();
3216 && fileMap.count(sFilename.
Data())) {
3225 const clang::DirectoryLookup *CurDir = 0;
3226 clang::Preprocessor &PP =
fInterpreter->getCI()->getPreprocessor();
3227 clang::HeaderSearch &HS = PP.getHeaderSearchInfo();
3228 auto FE = HS.LookupFile(file_name.c_str(),
3229 clang::SourceLocation(),
3232 clang::ArrayRef<std::pair<
const clang::FileEntry *,
3233 const clang::DirectoryEntry *>>(),
3244 if (FE && FE->isValid()) {
3246 clang::SourceManager &SM =
fInterpreter->getCI()->getSourceManager();
3248 clang::FileID FID = SM.translateFile(*FE);
3249 if (!FID.isInvalid() && FID.getHashValue() == 0)
3252 clang::SrcMgr::SLocEntry SLocE = SM.getSLocEntry(FID);
3253 if (SLocE.isFile() && !SLocE.getFile().getContentCache().getBufferIfLoaded())
3255 if (!FID.isInvalid())
3259 sFilename = FE->getName().str();
3261 && fileMap.count(sFilename.
Data())) {
3269#if defined(R__MACOSX)
3277static bool R__UpdateLibFileForLinking(
TString &lib)
3279 const char *mapfile =
nullptr;
3281 mapfile =
"/System/Library/dyld/dyld_shared_cache_x86_64.map";
3283 mapfile =
"/System/Library/dyld/dyld_shared_cache_arm64e.map";
3285 #error unsupported architecture
3287 if (std::ifstream cacheMap{mapfile}) {
3289 while (getline(cacheMap,
line)) {
3290 if (
line.find(lib) != std::string::npos) {
3308static int callback_for_dl_iterate_phdr(
struct dl_phdr_info *info,
size_t size,
void *
data)
3311 static std::unordered_set<
decltype(info->dlpi_addr)> sKnownLoadedLibBaseAddrs;
3313 auto newLibs =
static_cast<std::vector<std::string>*
>(
data);
3314 if (!sKnownLoadedLibBaseAddrs.count(info->dlpi_addr)) {
3316 if (info->dlpi_name && info->dlpi_name[0]
3317 && strncmp(info->dlpi_name,
"linux-vdso.so", 13)
3318 && strncmp(info->dlpi_name,
"linux-vdso32.so", 15)
3319 && strncmp(info->dlpi_name,
"linux-vdso64.so", 15)
3320 && strncmp(info->dlpi_name,
"linux-gate.so", 13))
3321 newLibs->emplace_back(info->dlpi_name);
3322 sKnownLoadedLibBaseAddrs.insert(info->dlpi_addr);
3335#if defined(R__WIN32) || defined(__CYGWIN__)
3336 HMODULE hModules[1024];
3338 unsigned long cbModules;
3340 hProcess = (
void *)::GetCurrentProcess();
3341 ::EnumProcessModules(hProcess, hModules,
sizeof(hModules), &cbModules);
3343 for (i = 1; i < (cbModules /
sizeof(
void *)); i++) {
3344 static const int bufsize = 260;
3345 wchar_t winname[bufsize];
3346 char posixname[bufsize];
3347 ::GetModuleFileNameExW(hProcess, hModules[i], winname, bufsize);
3348#if defined(__CYGWIN__)
3349 cygwin_conv_path(CCP_WIN_W_TO_POSIX, winname, posixname, bufsize);
3351 std::wstring wpath = winname;
3352 std::replace(wpath.begin(), wpath.end(),
'\\',
'/');
3353 string path(wpath.begin(), wpath.end());
3354 strncpy(posixname, path.c_str(), bufsize);
3360#elif defined(R__MACOSX)
3364 while (
const mach_header* mh = _dyld_get_image_header(imageIndex)) {
3366 if (mh->filetype == MH_DYLIB) {
3367 if (
const char* imageName = _dyld_get_image_name(imageIndex)) {
3375#elif defined(R__LINUX)
3379 std::vector<std::string> newLibs;
3380 dl_iterate_phdr(callback_for_dl_iterate_phdr, &newLibs);
3381 for (
auto &&lib: newLibs)
3384 Error(
"TCling::UpdateListOfLoadedSharedLibraries",
3385 "Platform not supported!");
3391static bool StartsWithStrLit(
const char *haystack,
const char (&needle)[
N]) {
3392 return !strncmp(haystack, needle,
N - 1);
3407 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
3408 if (!DLM->isLibraryLoaded(
filename)) {
3409 DLM->loadLibrary(
filename,
true ,
true );
3412#if defined(R__MACOSX)
3414 auto lenFilename = strlen(
filename);
3415 auto isInMacOSSystemDir = [](
const char *fn) {
3416 return StartsWithStrLit(fn,
"/usr/lib/") || StartsWithStrLit(fn,
"/System/Library/");
3418 if (!strcmp(
filename,
"cl_kernels")
3421 || StartsWithStrLit(
filename,
"/usr/lib/system/")
3422 || StartsWithStrLit(
filename,
"/usr/lib/libc++")
3423 || StartsWithStrLit(
filename,
"/System/Library/Frameworks/")
3424 || StartsWithStrLit(
filename,
"/System/Library/PrivateFrameworks/")
3425 || StartsWithStrLit(
filename,
"/System/Library/CoreServices/")
3426 || StartsWithStrLit(
filename,
"/usr/lib/libSystem")
3427 || StartsWithStrLit(
filename,
"/usr/lib/libstdc++")
3428 || StartsWithStrLit(
filename,
"/usr/lib/libicucore")
3429 || StartsWithStrLit(
filename,
"/usr/lib/libbsm")
3430 || StartsWithStrLit(
filename,
"/usr/lib/libobjc")
3431 || StartsWithStrLit(
filename,
"/usr/lib/libresolv")
3432 || StartsWithStrLit(
filename,
"/usr/lib/libauto")
3433 || StartsWithStrLit(
filename,
"/usr/lib/libcups")
3434 || StartsWithStrLit(
filename,
"/usr/lib/libDiagnosticMessagesClient")
3435 || StartsWithStrLit(
filename,
"/usr/lib/liblangid")
3436 || StartsWithStrLit(
filename,
"/usr/lib/libCRFSuite")
3437 || StartsWithStrLit(
filename,
"/usr/lib/libpam")
3438 || StartsWithStrLit(
filename,
"/usr/lib/libOpenScriptingUtil")
3439 || StartsWithStrLit(
filename,
"/usr/lib/libextension")
3440 || StartsWithStrLit(
filename,
"/usr/lib/libAudioToolboxUtility")
3441 || StartsWithStrLit(
filename,
"/usr/lib/liboah")
3442 || StartsWithStrLit(
filename,
"/usr/lib/libRosetta")
3443 || StartsWithStrLit(
filename,
"/usr/lib/libCoreEntitlements")
3444 || StartsWithStrLit(
filename,
"/usr/lib/libssl.")
3445 || StartsWithStrLit(
filename,
"/usr/lib/libcrypto.")
3451 || StartsWithStrLit(
filename,
"/usr/lib/system/libsystem_kernel")
3452 || StartsWithStrLit(
filename,
"/usr/lib/system/libsystem_platform")
3453 || StartsWithStrLit(
filename,
"/usr/lib/system/libsystem_pthread")
3458 || (lenFilename > 4 && !strcmp(
filename + lenFilename - 4,
".tbd")))
3461 R__UpdateLibFileForLinking(sFileName);
3463#elif defined(__CYGWIN__)
3465 static const int bufsize = 260;
3466 char posixwindir[bufsize];
3467 char *windir = getenv(
"WINDIR");
3469 cygwin_conv_path(CCP_WIN_A_TO_POSIX, windir, posixwindir, bufsize);
3471 snprintf(posixwindir,
sizeof(posixwindir),
"/Windows/");
3472 if (strstr(
filename, posixwindir) ||
3475#elif defined(R__WIN32)
3478#elif defined (R__LINUX)
3502 assert(!
IsFromRootCling() &&
"Trying to load library from rootcling!");
3506 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
3507 std::string canonLib = DLM->lookupLibrary(
filename);
3508 cling::DynamicLibraryManager::LoadLibResult res
3509 = cling::DynamicLibraryManager::kLoadLibNotFound;
3510 if (!canonLib.empty()) {
3512 res = DLM->loadLibrary(
filename, system,
true);
3516 cling::Interpreter::CompilationResult compRes;
3518 if (compRes == cling::Interpreter::kSuccess)
3519 res = cling::DynamicLibraryManager::kLoadLibSuccess;
3523 if (res == cling::DynamicLibraryManager::kLoadLibSuccess) {
3527 case cling::DynamicLibraryManager::kLoadLibSuccess:
return 0;
3528 case cling::DynamicLibraryManager::kLoadLibAlreadyLoaded:
return 1;
3578 Warning(
"Calc",
"waiting for cling thread to free");
3581 gROOT->SetLineIsProcessing();
3588 cling::Value valRef;
3589 cling::Interpreter::CompilationResult cr = cling::Interpreter::kFailure;
3593 catch (cling::InterpreterException&
ex)
3595 Error(
"Calc",
"%s.\n%s",
ex.what(),
"Evaluation of your expression was aborted.");
3597 cr = cling::Interpreter::kFailure;
3600 if (cr != cling::Interpreter::kSuccess) {
3608 if (!valRef.isValid()) {
3617 if (valRef.isVoid()) {
3624 gROOT->SetLineHasBeenProcessed();
3627 return valRef.simplisticCastAs<
Longptr_t>();
3634 void (*histaddFunc)(
const char*
line))
3639#if defined(R__MUST_REVISIT)
3640#if R__MUST_REVISIT(6,2)
3641 Warning(
"SetGetline",
"Cling should support the equivalent of SetGetlineFunc(getlineFunc, histaddFunc)");
3654 if ((std::distance(T.decls_begin(), T.decls_end()) != 1)
3655 || T.deserialized_decls_begin() != T.deserialized_decls_end()
3656 || T.macros_begin() != T.macros_end()
3657 || ((!T.getFirstDecl().isNull()) && ((*T.getFirstDecl().begin()) != T.getWrapperFD()))) {
3680 std::set<TObject*>::iterator iSpecial = ((std::set<TObject*>*)
fgSetOfSpecials)->find(obj);
3698#if defined(R__MUST_REVISIT)
3699#if R__MUST_REVISIT(6,2)
3701 Warning(
"Reset",
"Cling should support the equivalent of scratch_upto(&fDictPos)");
3711#if defined(R__MUST_REVISIT)
3712#if R__MUST_REVISIT(6,2)
3714 Warning(
"ResetAll",
"Cling should support the equivalent of complete reset (unload everything but the startup decls.");
3741#if defined(R__MUST_REVISIT)
3742#if R__MUST_REVISIT(6,2)
3744 Warning(
"ResetGlobalVar",
"Cling should support the equivalent of resetglobalvar(obj)");
3756#if defined(R__MUST_REVISIT)
3757#if R__MUST_REVISIT(6,2)
3759 Warning(
"RewindDictionary",
"Cling should provide a way to revert transaction similar to rewinddictionary()");
3770#if defined(R__MUST_REVISIT)
3771#if R__MUST_REVISIT(6,2)
3773 Warning(
"DeleteGlobal",
"Cling should provide the equivalent of deleteglobal(obj), see also DeleteVariable.");
3785#if defined(R__MUST_REVISIT)
3786#if R__MUST_REVISIT(6,2)
3787 Warning(
"DeleteVariable",
"should do more that just reseting the value to zero");
3792 llvm::StringRef srName(
name);
3793 const char* unscopedName =
name;
3794 llvm::StringRef::size_type posScope = srName.rfind(
"::");
3795 const clang::DeclContext* declCtx = 0;
3796 if (posScope != llvm::StringRef::npos) {
3797 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
3798 const clang::Decl* scopeDecl
3799 = lh.findScope(srName.substr(0, posScope),
3800 cling::LookupHelper::WithDiagnostics);
3802 Error(
"DeleteVariable",
"Cannot find enclosing scope for variable %s",
3806 declCtx = llvm::dyn_cast<clang::DeclContext>(scopeDecl);
3808 Error(
"DeleteVariable",
3809 "Enclosing scope for variable %s is not a declaration context",
3813 unscopedName += posScope + 2;
3817 clang::NamedDecl* nVarDecl
3818 = cling::utils::Lookup::Named(&
fInterpreter->getSema(), unscopedName, declCtx);
3820 Error(
"DeleteVariable",
"Unknown variable %s",
name);
3823 clang::VarDecl* varDecl = llvm::dyn_cast<clang::VarDecl>(nVarDecl);
3825 Error(
"DeleteVariable",
"Entity %s is not a variable",
name);
3829 clang::QualType qType = varDecl->getType();
3830 const clang::Type*
type = qType->getUnqualifiedDesugaredType();
3833 if (
type->isPointerType()) {
3834 int** ppInt = (
int**)
fInterpreter->getAddressOfGlobal(GlobalDecl(varDecl));
3836 if (ppInt) *ppInt = 0;
3846#if defined(R__MUST_REVISIT)
3847#if R__MUST_REVISIT(6,2)
3849 Warning(
"SaveContext",
"Cling should provide a way to record a state watermark similar to store_dictposition(&fDictPos)");
3859#if defined(R__MUST_REVISIT)
3860#if R__MUST_REVISIT(6,2)
3862 Warning(
"SaveGlobalsContext",
"Cling should provide a way to record a watermark for the list of global variable similar to store_dictposition(&fDictPosGlobals)");
3910 std::tuple<int,double>
value;
3914 size_t offset0 = ((
char*)&(std::get<0>(
value))) - ((
char*)&
value);
3915 size_t offset1 = ((
char*)&(std::get<1>(
value))) - ((
char*)&
value);
3917 size_t ascOffset0 = ((
char*)&(asc.
_0)) - ((
char*)&asc);
3918 size_t ascOffset1 = ((
char*)&(asc.
_1)) - ((
char*)&asc);
3920 size_t desOffset0 = ((
char*)&(des.
_0)) - ((
char*)&des);
3921 size_t desOffset1 = ((
char*)&(des.
_1)) - ((
char*)&des);
3923 if (offset0 == ascOffset0 && offset1 == ascOffset1) {
3925 }
else if (offset0 == desOffset0 && offset1 == desOffset1) {
3932static std::string
AlternateTuple(
const char *classname,
const cling::LookupHelper& lh)
3935 std::string alternateName =
"TEmulatedTuple";
3936 alternateName.append( classname + 5 );
3938 std::string fullname =
"ROOT::Internal::" + alternateName;
3939 if (lh.findScope(fullname, cling::LookupHelper::NoDiagnostics,
3943 std::string guard_name;
3945 std::ostringstream guard;
3946 guard <<
"ROOT_INTERNAL_TEmulated_";
3947 guard << guard_name;
3949 std::ostringstream alternateTuple;
3950 alternateTuple <<
"#ifndef " << guard.str() <<
"\n";
3951 alternateTuple <<
"#define " << guard.str() <<
"\n";
3952 alternateTuple <<
"namespace ROOT { namespace Internal {\n";
3953 alternateTuple <<
"template <class... Types> struct TEmulatedTuple;\n";
3954 alternateTuple <<
"template <> struct " << alternateName <<
" {\n";
3959 unsigned int nMember = 0;
3960 auto iter = tupleContent.
fElements.begin() + 1;
3961 auto theEnd = tupleContent.
fElements.end() - 1;
3962 while (iter != theEnd) {
3963 alternateTuple <<
" " << *iter <<
" _" << nMember <<
";\n";
3970 unsigned int nMember = tupleContent.
fElements.size() - 3;
3971 auto iter = tupleContent.
fElements.rbegin() + 1;
3972 auto theEnd = tupleContent.
fElements.rend() - 1;
3973 while (iter != theEnd) {
3974 alternateTuple <<
" " << *iter <<
" _" << nMember <<
";\n";
3981 Fatal(
"TCling::SetClassInfo::AlternateTuple",
3982 "Layout of std::tuple on this platform is unexpected.");
3987 alternateTuple <<
"};\n";
3988 alternateTuple <<
"}}\n";
3989 alternateTuple <<
"#endif\n";
3991 Error(
"Load",
"Could not declare %s",alternateName.c_str());
3994 alternateName =
"ROOT::Internal::" + alternateName;
3995 return alternateName;
4035 auto SetWithoutClassInfoState = [](
TClass *cl)
4048 if (strncmp(cl->
GetName(),
"tuple<",strlen(
"tuple<"))==0) {
4051 if (reload ||
name.empty()) {
4053 SetWithoutClassInfoState(cl);
4065 SetWithoutClassInfoState(cl);
4082 zombieCandidate =
kTRUE;
4089 zombieCandidate =
kTRUE;
4143 static const char *anonEnum =
"anonymous enum ";
4144 static const int cmplen = strlen(anonEnum);
4171 const char *classname =
name;
4174 class MaybeSuspendAutoLoadParse {
4175 int fStoreAutoLoad = 0;
4176 int fStoreAutoParse = 0;
4177 bool fSuspendedAutoParse =
false;
4179 MaybeSuspendAutoLoadParse(
int autoload) {
4180 fStoreAutoLoad = ((
TCling*)
gCling)->SetClassAutoLoading(autoload);
4184 fSuspendedAutoParse =
true;
4185 fStoreAutoParse = ((
TCling*)
gCling)->SetSuspendAutoParsing(
true);
4188 ~MaybeSuspendAutoLoadParse() {
4189 if (fSuspendedAutoParse)
4190 ((
TCling*)
gCling)->SetSuspendAutoParsing(fStoreAutoParse);
4191 ((
TCling*)
gCling)->SetClassAutoLoading(fStoreAutoLoad);
4195 MaybeSuspendAutoLoadParse autoLoadParseRAII( autoload );
4197 autoLoadParseRAII.SuspendAutoParsing();
4206 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
4207 const clang::Type *
type = 0;
4208 const clang::Decl *decl
4209 = lh.findScope(classname,
4210 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
4211 : cling::LookupHelper::NoDiagnostics,
4215 decl = lh.findScope(buf,
4216 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
4217 : cling::LookupHelper::NoDiagnostics,
4234 clang::ClassTemplateSpecializationDecl *tmpltDecl =
4235 llvm::dyn_cast_or_null<clang::ClassTemplateSpecializationDecl>
4236 (
type->getAsCXXRecordDecl());
4237 if (tmpltDecl && !tmpltDecl->getPointOfInstantiation().isValid()) {
4254 if (tci.
Property() & propertiesMask) {
4255 bool hasClassDefInline =
false;
4256 if (isClassOrNamespaceOnly) {
4262 if (hasDictionary.IsValid() && implLineFunc.IsValid()) {
4264 bool success =
false;
4265 std::tie(success, lineNumber) =
4267 hasClassDefInline = success && (lineNumber == -1);
4275 if (hasClassDefInline)
4314 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
4315 const clang::Decl *decl
4316 = lh.findClassTemplate(
name,
4317 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
4318 : cling::LookupHelper::NoDiagnostics);
4320 std::string strname =
"std::";
4322 decl = lh.findClassTemplate(strname,
4323 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
4324 : cling::LookupHelper::NoDiagnostics);
4350 cl->
fBase = listOfBase;
4366 D =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
4369 if (
const clang::DeclContext* DC = dyn_cast<clang::DeclContext>(D)) {
4372 llvm::SmallVector< DeclContext *, 4> allDeclContexts;
4373 const_cast< clang::DeclContext *
>(DC)->collectAllContexts(allDeclContexts);
4374 for (llvm::SmallVector<DeclContext*, 4>::iterator declIter = allDeclContexts.begin(), declEnd = allDeclContexts.end();
4375 declIter != declEnd; ++declIter) {
4377 for (clang::DeclContext::decl_iterator DI = (*declIter)->decls_begin(),
4378 DE = (*declIter)->decls_end(); DI != DE; ++DI) {
4379 if (
const clang::EnumDecl* ED = dyn_cast<clang::EnumDecl>(*DI)) {
4382 PrintingPolicy Policy(ED->getASTContext().getPrintingPolicy());
4383 llvm::raw_string_ostream stream(buf);
4385 Policy.AnonymousTagLocations =
false;
4386 ED->getNameForDiagnostic(stream, Policy,
false);
4390 const char*
name = buf.c_str();
4414 D =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
4418 if (
const clang::DeclContext* DC = dyn_cast<clang::DeclContext>(D)) {
4421 llvm::SmallVector< DeclContext *, 4> allDeclContexts;
4422 const_cast< clang::DeclContext *
>(DC)->collectAllContexts(allDeclContexts);
4423 for (llvm::SmallVector<DeclContext*, 4>::iterator declIter = allDeclContexts.begin(),
4424 declEnd = allDeclContexts.end(); declIter != declEnd; ++declIter) {
4426 for (clang::DeclContext::decl_iterator DI = (*declIter)->decls_begin(),
4427 DE = (*declIter)->decls_end(); DI != DE; ++DI) {
4428 if (
const clang::FunctionTemplateDecl* FTD = dyn_cast<clang::FunctionTemplateDecl>(*DI)) {
4429 funcTempList->
Get(FTD);
4487 if (
m->fMethodArgs) {
4498 m->fMethodArgs = arglist;
4545 if (llvm::isa<clang::NamespaceDecl>(cli->
GetDecl())) {
4554 Error(
"GenerateTClass",
4555 "Cannot find %s::Class_Version()! Class version might be wrong.",
4562 if (newvers == -1) {
4570 newvers = callfunc.
ExecInt(0);
4572 Error(
"GenerateTClass",
4573 "Cannot invoke %s::Class_Version()! Class version might be wrong.",
4577 if (newvers != oldvers) {
4594static void GenerateTClass_GatherInnerIncludes(cling::Interpreter *interp,
TString &includes,
TClingClassInfo *info)
4598 const clang::ClassTemplateSpecializationDecl *templateCl
4599 = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(info->
GetDecl());
4601 for(
unsigned int i=0; i < templateCl->getTemplateArgs().
size(); ++i) {
4602 const clang::TemplateArgument &arg( templateCl->getTemplateArgs().get(i) );
4603 if (arg.getKind() == clang::TemplateArgument::Type) {
4606 if (!uType->isFundamentalType() && !uType->isEnumeralType()) {
4608 const clang::CXXRecordDecl *argdecl = uType->getAsCXXRecordDecl();
4611 TClingClassInfo subinfo(interp,*(argdecl->getASTContext().getRecordType(argdecl).getTypePtr()));
4612 GenerateTClass_GatherInnerIncludes(interp, includes, &subinfo);
4615 llvm::raw_string_ostream OS(Result);
4616 arg.print(argdecl->getASTContext().getPrintingPolicy(),OS);
4617 Warning(
"TCling::GenerateTClass",
"Missing header file for %s",OS.str().c_str());
4632 if (!info || !info->
IsValid()) {
4633 Fatal(
"GenerateTClass",
"Requires a valid ClassInfo object");
4638 std::string classname;
4642 Info(
"GenerateTClass",
"Will (try to) generate the compiled TClass for %s.",classname.c_str());
4646 GenerateTClass_GatherInnerIncludes(
fInterpreter,includes,info);
4652 Error(
"GenerateTClass",
"Even though the dictionary generation for %s seemed successful we can't find the TClass bootstrap!",classname.c_str());
4658 cl =
new TClass(classinfo, version, 0, 0, -1, -1, silent);
4664 cl =
new TClass(classinfo, 1, 0, 0, -1, -1, silent);
4689 if (classes == 0 || classes[0] == 0) {
4690 Error(
"TCling::GenerateDictionary",
"Cannot generate dictionary without passing classes.");
4694 std::vector<std::string> listClasses;
4696 const char* current = classes, *prev = classes;
4700 if (*current ==
';') {
4701 listClasses.push_back(std::string(prev, current - prev));
4704 else if (*(current + 1) == 0) {
4705 listClasses.push_back(std::string(prev, current + 1 - prev));
4709 std::vector<std::string> listIncludes;
4713 const char* current = includes, *prev = includes;
4717 if (*current ==
';') {
4718 listIncludes.push_back(std::string(prev, current - prev));
4721 else if (*(current + 1) == 0) {
4722 listIncludes.push_back(std::string(prev, current + 1 - prev));
4728 std::vector<std::string>(), std::vector<std::string>());
4752 if (
const ValueDecl* decl = (
const ValueDecl*)
d){
4755 if (hasIoName && ioName !=
name)
return 0;
4767 using namespace clang;
4769 DeclarationName DName = &SemaR.Context.Idents.get(
name);
4771 LookupResult
R(SemaR, DName, SourceLocation(), Sema::LookupOrdinaryName,
4772 Sema::ForExternalRedeclaration);
4774 cling::utils::Lookup::Named(&SemaR,
R);
4776 LookupResult::Filter
F =
R.makeFilter();
4778 while (
F.hasNext()) {
4779 NamedDecl *D =
F.next();
4780 if (isa<VarDecl>(D) || isa<FieldDecl>(D) || isa<EnumConstantDecl>(D) ||
4781 isa<IndirectFieldDecl>(D))
4787 if (
R.isSingleResult())
4788 return R.getFoundDecl();
4800 const clang::Decl* possibleEnum = 0;
4805 const clang::DeclContext* dc = 0;
4806 if (
const clang::Decl* D = cci->
GetDecl()) {
4807 if (!(dc = dyn_cast<clang::NamespaceDecl>(D))) {
4808 dc = dyn_cast<clang::RecordDecl>(D);
4815 possibleEnum = cling::utils::Lookup::Tag(&
fInterpreter->getSema(),
name, dc);
4817 Error(
"TCling::GetEnum",
"DeclContext not found for %s .\n",
name);
4826 if (possibleEnum && (possibleEnum != (clang::Decl*)-1)
4827 && isa<clang::EnumDecl>(possibleEnum)) {
4828 return possibleEnum;
4840 llvm::StringRef mangled_name = gv->getName();
4855 std::string scopename(demangled_name_c);
4856 free(demangled_name_c);
4862 std::string dataname;
4864 if (!strncmp(scopename.c_str(),
"typeinfo for ",
sizeof(
"typeinfo for ")-1)) {
4865 scopename.erase(0,
sizeof(
"typeinfo for ")-1);
4866 }
else if (!strncmp(scopename.c_str(),
"vtable for ",
sizeof(
"vtable for ")-1)) {
4867 scopename.erase(0,
sizeof(
"vtable for ")-1);
4870 std::string::size_type pos = scopename.rfind(
'(');
4871 if (pos != std::string::npos) {
4875 pos = scopename.rfind(
':');
4876 if (pos != std::string::npos) {
4877 if ((pos != 0) && (scopename[pos-1] ==
':')) {
4878 dataname = scopename.substr(pos+1);
4879 scopename.erase(pos-1);
4883 dataname = scopename;
4891 if (scopename.size()) {
4907 Error(
"GetDataMemberWithValue()",
"not implemented");
4917 Error(
"GetDataMemberAtAddr()",
"not implemented");
4927 const char* params,
Bool_t objectIsConst )
4945 return mangled_name;
4960 GetMethod(method,
proto, objectIsConst, 0 ,
mode).GetMangledName();
4972 const char* params,
Bool_t objectIsConst )
5013 std::vector<DeclId_t>& res)
const
5016 clang::ASTContext& Ctx = S.Context;
5017 const clang::Decl* CtxDecl
5019 Ctx.getTranslationUnitDecl();
5020 auto RecDecl = llvm::dyn_cast<const clang::RecordDecl>(CtxDecl);
5021 const clang::DeclContext* DeclCtx = RecDecl;
5024 DeclCtx = dyn_cast<clang::NamespaceDecl>(CtxDecl);
5025 if (!DeclCtx)
return;
5027 clang::DeclarationName DName;
5032 if (RecDecl->getNameAsString() == funcname) {
5033 clang::QualType QT = Ctx.getTypeDeclType(RecDecl);
5034 DName = Ctx.DeclarationNames.getCXXConstructorName(Ctx.getCanonicalType(QT));
5035 }
else if (funcname[0] ==
'~' && RecDecl->getNameAsString() == funcname + 1) {
5036 clang::QualType QT = Ctx.getTypeDeclType(RecDecl);
5037 DName = Ctx.DeclarationNames.getCXXDestructorName(Ctx.getCanonicalType(QT));
5039 DName = &Ctx.Idents.get(funcname);
5042 DName = &Ctx.Idents.get(funcname);
5046 clang::LookupResult
R(S, DName, clang::SourceLocation(),
5047 Sema::LookupOrdinaryName, clang::Sema::NotForRedeclaration);
5048 R.suppressDiagnostics();
5049 S.LookupQualifiedName(
R,
const_cast<DeclContext*
>(DeclCtx));
5050 if (
R.empty())
return;
5052 res.reserve(res.size() + (
R.end() -
R.begin()));
5053 for (clang::LookupResult::iterator IR =
R.begin(), ER =
R.end();
5055 if (
const clang::FunctionDecl* FD
5056 = llvm::dyn_cast<const clang::FunctionDecl>(*IR)) {
5057 if (!FD->getDescribedFunctionTemplate()) {
5060 }
else if (
const auto *USD = llvm::dyn_cast<const clang::UsingShadowDecl>(*IR)) {
5062 if (llvm::isa<clang::FunctionDecl>(USD->getTargetDecl())) {
5083 GetMethod(method,
proto, objectIsConst, 0 ,
mode).InterfaceMethod();
5222 const char* params,
Bool_t objectIsConst,
int* error)
5242 const char* params,
int* error)
5244 Execute(obj,cl,method,params,
false,error);
5259 Error(
"Execute",
"No method was defined");
5268 if (argc > nparms) {
5269 Error(
"Execute",
"Too many parameters to call %s, got %d but expected at most %d.",method->
GetName(),argc,nparms);
5272 if (nparms != argc) {
5282 Int_t firstDefault = -1;
5283 for (
Int_t i = 0; i < nparms; i ++) {
5290 if (firstDefault >= 0) {
5291 Error(
"Execute",
"Too few arguments to call %s, got only %d but expected at least %d and at most %d.",method->
GetName(),argc,firstDefault,nparms);
5293 Error(
"Execute",
"Too few arguments to call %s, got only %d but expected %d.",method->
GetName(),argc,nparms);
5299 const char* listpar =
"";
5304 for (
Int_t i = 0; i < argc; i ++) {
5313 chpar += (nxtpar->
String()).ReplaceAll(
"\"",
"\\\"");
5320 complete += nxtpar->
String();
5323 listpar = complete.
Data();
5350 const void* args[] ,
5355 Error(
"ExecuteWithArgsAndReturn",
"No method was defined");
5382 Warning(
"GetTopLevelMacroName",
"Must change return type!");
5429#if defined(R__MUST_REVISIT)
5430#if R__MUST_REVISIT(6,0)
5431 Warning(
"GetCurrentMacroName",
"Must change return type!");
5444 TTHREAD_TLS_DECL(std::string,t);
5446 if (!strstr(typeDesc,
"(*)(")) {
5447 const char *s = strchr(typeDesc,
' ');
5448 const char *template_start = strchr(typeDesc,
'<');
5449 if (!strcmp(typeDesc,
"long long")) {
5452 else if (!strncmp(typeDesc,
"unsigned ", s + 1 - typeDesc)) {
5459 else if (s && (template_start == 0 || (s < template_start))) {
5469 auto l = t.length();
5470 while (
l > 0 && (t[
l - 1] ==
'*' || t[
l - 1] ==
'&'))
5478 assert(rootmapfile && *rootmapfile);
5480 llvm::StringRef libName = llvm::sys::path::filename(rootmapfile);
5481 libName.consume_back(
".rootmap");
5483 return !
gInterpreter->HasPCMForLibrary(libName.str().c_str());
5494 if (!(rootmapfile && *rootmapfile))
5501 const std::map<char, unsigned int> keyLenMap = {{
'c',6},{
'n',10},{
't',8},{
'h',7},{
'e',5},{
'v',4}};
5503 std::string rootmapfileNoBackslash(rootmapfile);
5505 std::replace(rootmapfileNoBackslash.begin(), rootmapfileNoBackslash.end(),
'\\',
'/');
5512 std::string lineDirective = std::string(
"\n#line 2 \"Forward declarations from ") + rootmapfileNoBackslash +
"\"\n";
5514 std::ifstream
file(rootmapfileNoBackslash);
5517 std::string lib_name;
5519 bool newFormat =
false;
5520 while (getline(
file,
line,
'\n')) {
5521 if (!newFormat && (
line.compare(0, 8,
"Library.") == 0 ||
line.compare(0, 8,
"Declare.") == 0)) {
5527 if (
line.compare(0, 9,
"{ decls }") == 0) {
5530 while (getline(
file,
line,
'\n')) {
5533 if (!uniqueString) {
5534 Error(
"ReadRootmapFile",
"Cannot handle \"{ decls }\" sections in custom rootmap file %s",
5535 rootmapfileNoBackslash.c_str());
5538 if (!lineDirective.empty())
5539 uniqueString->
Append(lineDirective);
5543 const char firstChar =
line[0];
5544 if (firstChar ==
'[') {
5546 auto brpos =
line.find(
']');
5547 if (brpos == string::npos)
5549 lib_name =
line.substr(1, brpos - 1);
5551 while (lib_name[nspaces] ==
' ')
5554 lib_name.replace(0, nspaces,
"");
5556 TString lib_nameTstr(lib_name.c_str());
5561 Info(
"ReadRootmapFile",
"new section for %s", lib_nameTstr.
Data());
5563 Info(
"ReadRootmapFile",
"section for %s (library does not exist)", lib_nameTstr.
Data());
5569 auto keyLenIt = keyLenMap.find(firstChar);
5570 if (keyLenIt == keyLenMap.end())
5572 unsigned int keyLen = keyLenIt->second;
5574 const char *keyname =
line.c_str() + keyLen;
5576 Info(
"ReadRootmapFile",
"class %s in %s", keyname, lib_name.c_str());
5579 if (lib_name != isThere->
GetValue()) {
5580 if (firstChar ==
'n') {
5582 Info(
"ReadRootmapFile",
"namespace %s found in %s is already in %s", keyname, lib_name.c_str(),
5584 }
else if (firstChar ==
'h') {
5589 Warning(
"ReadRootmapFile",
"%s %s found in %s is already in %s",
line.substr(0, keyLen).c_str(),
5590 keyname, lib_name.c_str(), isThere->
GetValue());
5594 Info(
"ReadRootmapFile",
"Key %s was already defined for %s", keyname, lib_name.c_str());
5655 using namespace clang;
5657 class ExtVisibleStorageAdder:
public RecursiveASTVisitor<ExtVisibleStorageAdder>{
5663 ExtVisibleStorageAdder(std::unordered_set<const NamespaceDecl*>& nsSet): fNSSet(nsSet) {};
5664 bool VisitNamespaceDecl(NamespaceDecl* nsDecl) {
5669 nsDecl->setHasExternalVisibleStorage();
5670 fNSSet.insert(nsDecl);
5673 bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl* specDecl) {
5676 if (specDecl->getTemplateSpecializationKind() == TSK_ExplicitSpecialization)
5678 specDecl->setHasExternalLexicalStorage();
5690 std::unordered_set<const NamespaceDecl*>& fNSSet;
5737 for (
Int_t j = 0; j < i; j++) {
5748 Info(
"LoadLibraryMap",
"%s",
d.Data());
5753 if (
f.EndsWith(
".rootmap")) {
5759 Info(
"LoadLibraryMap",
" rootmap file: %s",
p.Data());
5777 if (
f.BeginsWith(
"rootmap")) {
5782 Warning(
"LoadLibraryMap",
"please rename %s to end with \".rootmap\"",
p.Data());
5795 if (rootmapfile && *rootmapfile) {
5802 else if (res == -3) {
5812 while ((rec = (
TEnvRec*) next())) {
5814 if (!strncmp(cls.
Data(),
"Library.", 8) && cls.
Length() > 8) {
5833 Info(
"LoadLibraryMap",
"class %s in %s", cls.
Data(), wlib);
5836 Info(
"LoadLibraryMap",
"class %s in %s (library does not exist)", cls.
Data(), lib);
5842 else if (!strncmp(cls.
Data(),
"Declare.", 8) && cls.
Length() > 8) {
5852 cling::Transaction* T =
nullptr;
5854 assert(cling::Interpreter::kSuccess == compRes &&
"A declaration in a rootmap could not be compiled");
5856 if (compRes!=cling::Interpreter::kSuccess){
5858 "Problems in %s declaring '%s' were encountered.", rootmapfile, uniqueString.
Data()) ;
5863 for (
auto declIt = T->decls_begin(); declIt < T->decls_end(); ++declIt) {
5864 if (declIt->m_DGR.isSingleDecl()) {
5865 if (Decl* D = declIt->m_DGR.getSingleDecl()) {
5866 if (clang::isa<TagDecl>(D) || clang::isa<NamespaceDecl>(D)) {
5867 evsAdder.TraverseDecl(D);
5902 for (
Int_t ilib = 0; ilib < nrSharedLibs; ilib++) {
5909 TString rootMapBaseStr = sharedLibBaseStr;
5910 if (sharedLibBaseStr.
EndsWith(
".dll")) {
5913 else if (sharedLibBaseStr.
EndsWith(
".DLL")) {
5916 else if (sharedLibBaseStr.
EndsWith(
".so")) {
5919 else if (sharedLibBaseStr.
EndsWith(
".sl")) {
5922 else if (sharedLibBaseStr.
EndsWith(
".dl")) {
5925 else if (sharedLibBaseStr.
EndsWith(
".a")) {
5929 Error(
"ReloadAllSharedLibraryMaps",
"Unknown library type %s", sharedLibBaseStr.
Data());
5933 rootMapBaseStr +=
".rootmap";
5936 Error(
"ReloadAllSharedLibraryMaps",
"Could not find rootmap %s in path", rootMapBaseStr.
Data());
5943 Error(
"ReloadAllSharedLibraryMaps",
"Error loading map %s", rootMap);
5978 if (!
fMapfile || !library || !*library) {
5991 while ((rec = (
TEnvRec *) next())) {
6002 if (!strncmp(cls.
Data(),
"Library.", 8) && cls.
Length() > 8) {
6011 if (!strncmp(lib, libname.
Data(),
len)) {
6013 Error(
"UnloadLibraryMap",
"entry for <%s, %s> not found in library map table", cls.
Data(), lib);
6021 TString library_rootmap(library);
6022 if (!library_rootmap.
EndsWith(
".rootmap"))
6023 library_rootmap.
Append(
".rootmap");
6076 free(demangled_name);
6094 std::string demangled_name(demangled_name_c);
6095 free(demangled_name_c);
6127 if (
gROOT->LoadClass(cls, deplib) == 0) {
6130 "loaded dependent library %s for %s", deplib, cls);
6135 "failure loading dependent library %s for %s",
6140 if (lib && lib[0]) {
6141 if (
gROOT->LoadClass(cls, lib) == 0) {
6144 "loaded library %s for %s", lib, cls);
6150 "failure loading library %s for %s", lib, cls);
6165 bool nameIsNormalized)
6171 if (!visited.insert(std::string(cls)).second)
6181 for (
auto element :
proto->GetData()) {
6182 if (element->IsBasic())
6184 const char *subtypename = element->GetTypeName();
6200 if (classinfo &&
gInterpreter->ClassInfo_IsValid(classinfo)
6204 while (
gInterpreter->DataMemberInfo_Next(memberinfo)) {
6237 Info(
"TCling::AutoLoad",
"Explicitly disabled (the class name is %s)", cls);
6257 Info(
"TCling::AutoLoad",
6258 "Trying to autoload for %s", cls);
6263 Info(
"TCling::AutoLoad",
6264 "Disabled due to gROOT or gInterpreter being invalid/not ready (the class name is %s)", cls);
6285 std::unordered_set<std::string> visited;
6294 cling::Interpreter *interpreter)
6296 std::string code = gNonInterpreterClassDef ;
6303 code += (
"#include \"");
6307 code += (
"#ifdef __ROOTCLING__\n"
6308 "#undef __ROOTCLING__\n"
6309 + gInterpreterClassDef +
6312 cling::Interpreter::CompilationResult cr;
6318 Sema &SemaR = interpreter->getSema();
6320 clangDiagSuppr diagSuppr(SemaR.getDiagnostics());
6322 #if defined(R__MUST_REVISIT)
6323 #if R__MUST_REVISIT(6,2)
6324 Warning(
"TCling::RegisterModule",
"Diagnostics suppression should be gone by now.");
6328 cr = interpreter->parseForModule(code);
6346 Int_t nHheadersParsed = 0;
6347 unsigned long offset = 0;
6348 if (strncmp(cls,
"const ", 6) == 0) {
6353 bool skipFirstEntry =
false;
6354 std::vector<std::string> autoparseKeys;
6355 if (strchr(cls,
'<')) {
6361 if (!autoparseKeys.empty() && !autoparseKeys[0].empty()) {
6366 TString templateName(autoparseKeys[0]);
6367 auto tokens = templateName.
Tokenize(
"::");
6368 clang::NamedDecl* previousScopeAsNamedDecl =
nullptr;
6369 clang::DeclContext* previousScopeAsContext =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
6371 previousScopeAsContext =
fInterpreter->getSema().getStdNamespace();
6373 for (
Int_t tk = 0; tk < nTokens; ++tk) {
6374 auto scopeObj = tokens->UncheckedAt(tk);
6375 auto scopeName = ((
TObjString*) scopeObj)->String().Data();
6376 previousScopeAsNamedDecl = cling::utils::Lookup::Named(&
fInterpreter->getSema(), scopeName, previousScopeAsContext);
6378 if ((clang::NamedDecl*)-1 == previousScopeAsNamedDecl)
break;
6379 previousScopeAsContext = llvm::dyn_cast_or_null<clang::DeclContext>(previousScopeAsNamedDecl);
6380 if (!previousScopeAsContext)
break;
6384 if ((clang::NamedDecl*)-1 != previousScopeAsNamedDecl) {
6385 if (
auto templateDecl = llvm::dyn_cast_or_null<clang::ClassTemplateDecl>(previousScopeAsNamedDecl)) {
6386 if (
auto templatedDecl = templateDecl->getTemplatedDecl()) {
6387 skipFirstEntry = templatedDecl->hasDefinition();
6394 if (topLevel) autoparseKeys.emplace_back(cls);
6396 for (
const auto & apKeyStr : autoparseKeys) {
6397 if (skipFirstEntry) {
6398 skipFirstEntry=
false;
6401 if (apKeyStr.empty())
continue;
6402 const char *apKey = apKeyStr.c_str();
6406 Info(
"TCling::AutoParse",
6407 "Starting autoparse for %s\n", apKey);
6412 const cling::Transaction *T =
fInterpreter->getCurrentTransaction();
6414 auto const &hNamesPtrs = iter->second;
6416 Info(
"TCling::AutoParse",
6417 "We can proceed for %s. We have %s headers.", apKey, std::to_string(hNamesPtrs.size()).c_str());
6419 for (
auto & hName : hNamesPtrs) {
6421 if (0 !=
fPayloads.count(normNameHash)) {
6422 float initRSSval=0.f, initVSIZEval=0.f;
6424 (void) initVSIZEval;
6427 "Parsing full payload for %s", apKey);
6434 if (cRes != cling::Interpreter::kSuccess) {
6435 if (hName[0] ==
'\n')
6436 Error(
"AutoParse",
"Error parsing payload code for class %s with content:\n%s", apKey, hName);
6445 Info(
"Autoparse",
">>> RSS key %s - before %.3f MB - after %.3f MB - delta %.3f MB", apKey, initRSSval, endRSSval, endRSSval-initRSSval);
6446 Info(
"Autoparse",
">>> VSIZE key %s - before %.3f MB - after %.3f MB - delta %.3f MB", apKey, initVSIZEval, endVSIZEval, endVSIZEval-initVSIZEval);
6452 "Parsing single header %s", hName);
6455 if (cRes != cling::Interpreter::kSuccess) {
6456 Error(
"AutoParse",
"Error parsing headerfile %s for class %s.", hName, apKey);
6468 if (strchr(apKey,
'<')) {
6475 return nHheadersParsed;
6485 if (llvm::StringRef(cls).contains(
"(lambda)"))
6499 Info(
"TCling::AutoParse",
6500 "Trying to autoparse for %s", cls);
6522 return nHheadersParsed > 0 ? 1 : 0;
6530 StringRef errMsg(errmessage);
6531 if (errMsg.contains(
"undefined symbol: ")) {
6533 std::string mangled_name = std::string(errMsg.split(
"undefined symbol: ").second);
6534 void* res = ((
TCling*)
gCling)->LazyFunctionCreatorAutoload(mangled_name);
6535 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
6536 if (res && DLM && (DLM->loadLibrary(libStem, permanent, resolved) == cling::DynamicLibraryManager::kLoadLibSuccess))
6555 if (
void* Addr = llvm::sys::DynamicLibrary::SearchForAddressOfSymbol(dlsym_mangled_name))
6558 const cling::DynamicLibraryManager &DLM = *
GetInterpreterImpl()->getDynamicLibraryManager();
6561 auto LibLoader = [](
const std::string& LibName) ->
bool {
6562 if (
gSystem->
Load(LibName.c_str(),
"",
false) < 0) {
6563 ::Error(
"TCling__LazyFunctionCreatorAutoloadForModule",
6564 "Failed to load library %s", LibName.c_str());
6570 std::string libName = DLM.searchLibrariesForSymbol(mangled_name,
6573 assert(!llvm::StringRef(libName).startswith(
"libNew") &&
6574 "We must not resolve symbols from libNew!");
6576 if (libName.empty())
6579 if (!LibLoader(libName))
6582 return llvm::sys::DynamicLibrary::SearchForAddressOfSymbol(dlsym_mangled_name);
6602 const NamedDecl *oldDef = llvm::dyn_cast_or_null<NamedDecl>(cci->
GetDecl());
6603 if (!oldDef || (def && def != oldDef)) {
6617 if (!alias && def !=
nullptr)
6640 const TagDecl *td = dyn_cast<TagDecl>(ND);
6641 const NamespaceDecl *ns = dyn_cast<NamespaceDecl>(ND);
6642 const NamedDecl *canon =
nullptr;
6647 canon = tdDef = td->getDefinition();
6651 if (!tdDef->isCompleteDefinition() || llvm::isa<clang::FunctionDecl>(tdDef->getDeclContext())) {
6657 auto declName = tdDef->getNameAsString();
6668 clang::QualType
type(tdDef->getTypeForDecl(), 0);
6671 canon = ns->getCanonicalDecl();
6672 name = ND->getQualifiedNameAsString();
6674 name = ND->getQualifiedNameAsString();
6723 std::set<TClass*> modifiedTClasses;
6728 bool isTUTransaction =
false;
6729 if (!T.empty() && T.decls_begin() + 1 == T.decls_end() && !T.hasNestedTransactions()) {
6730 clang::Decl* FirstDecl = *(T.decls_begin()->m_DGR.begin());
6731 if (llvm::isa<clang::TranslationUnitDecl>(FirstDecl)) {
6734 isTUTransaction =
true;
6738 std::set<const void*> TransactionDeclSet;
6739 if (!isTUTransaction && T.decls_end() - T.decls_begin()) {
6740 const clang::Decl* WrapperFD = T.getWrapperFD();
6741 for (cling::Transaction::const_iterator
I = T.decls_begin(), E = T.decls_end();
6743 if (
I->m_Call != cling::Transaction::kCCIHandleTopLevelDecl
6744 &&
I->m_Call != cling::Transaction::kCCIHandleTagDeclDefinition)
6747 for (DeclGroupRef::const_iterator DI =
I->m_DGR.begin(),
6748 DE =
I->m_DGR.end(); DI != DE; ++DI) {
6749 if (*DI == WrapperFD)
6751 TransactionDeclSet.insert(*DI);
6752 ((
TCling*)
gCling)->HandleNewDecl(*DI,
false, modifiedTClasses);
6759 for (cling::Transaction::const_iterator
I = T.deserialized_decls_begin(),
6760 E = T.deserialized_decls_end();
I != E; ++
I) {
6761 for (DeclGroupRef::const_iterator DI =
I->m_DGR.begin(),
6762 DE =
I->m_DGR.end(); DI != DE; ++DI)
6763 if (TransactionDeclSet.find(*DI) == TransactionDeclSet.end()) {
6779 std::vector<TClass*> modifiedTClassesDiff(modifiedTClasses.size());
6780 std::vector<TClass*>::iterator it;
6781 it = set_difference(modifiedTClasses.begin(), modifiedTClasses.end(),
6784 modifiedTClassesDiff.begin());
6785 modifiedTClassesDiff.resize(it - modifiedTClassesDiff.begin());
6788 ((
TCling*)
gCling)->GetModTClasses().insert(modifiedTClassesDiff.begin(),
6789 modifiedTClassesDiff.end());
6790 for (std::vector<TClass*>::const_iterator
I = modifiedTClassesDiff.begin(),
6791 E = modifiedTClassesDiff.end();
I != E; ++
I) {
6793 if (!
gROOT->GetListOfClasses()->FindObject(*
I)) {
6815 cling::Transaction::const_nested_iterator iNested = T.nested_begin();
6816 for (cling::Transaction::const_iterator
I = T.decls_begin(), E = T.decls_end();
6818 if (
I->m_Call == cling::Transaction::kCCIHandleVTable)
6820 if (
I->m_Call == cling::Transaction::kCCINone) {
6826 for (
auto &D :
I->m_DGR)
6852 if (D->isFromASTFile())
6860 if (isa<VarDecl>(D) || isa<FieldDecl>(D) || isa<EnumConstantDecl>(D)) {
6866 }
else if (isa<FunctionDecl>(D)) {
6868 }
else if (isa<FunctionTemplateDecl>(D)) {
6870 }
else if (isa<EnumDecl>(D)) {
6881 }
else if (isa<RecordDecl>(D) || isa<NamespaceDecl>(D)) {
6882 if (isa<RecordDecl>(D) && !cast<RecordDecl>(D)->isCompleteDefinition())
6885 std::vector<TClass *> Classes;
6888 for (
auto &C : Classes) {
6893 for (
auto &
I : cast<DeclContext>(D)->decls())
6897 if (D->getKind() != Decl::Namespace
6898 || cast<NamespaceDecl>(D)->isOriginalNamespace())
6899 C->ResetClassInfo();
6911 std::size_t normNameHash = triter->second;
6917 auto const &hNamesPtrs = iter->second;
6918 for (
auto &hName : hNamesPtrs) {
6920 Info(
"TransactionRollback",
6921 "Restoring ability to autoaparse: %s", hName);
6958 using namespace clang;
6959 if (
const Decl *D = LH.findScope(cls, cling::LookupHelper::NoDiagnostics,
6961 if (!D->isFromASTFile()) {
6963 Warning(
"GetClassSharedLibsForModule",
"Decl found for %s is not part of a module", cls);
6966 class ModuleCollector :
public ConstDeclVisitor<ModuleCollector> {
6967 llvm::DenseSet<Module *> &m_TopLevelModules;
6970 ModuleCollector(llvm::DenseSet<Module *> &TopLevelModules) : m_TopLevelModules(TopLevelModules) {}
6971 void Collect(
const Decl *D) { Visit(D); }
6973 void VisitDecl(
const Decl *D)
6983 if (!D->hasOwningModule())
6985 if (Module *M = D->getOwningModule()->getTopLevelModule())
6986 m_TopLevelModules.insert(M);
6989 void VisitTemplateArgument(
const TemplateArgument &
TA)
6991 switch (
TA.getKind()) {
6992 case TemplateArgument::Null:
6993 case TemplateArgument::Integral:
6994 case TemplateArgument::Pack:
6995 case TemplateArgument::NullPtr:
6996 case TemplateArgument::Expression:
6997 case TemplateArgument::Template:
6998 case TemplateArgument::TemplateExpansion:
return;
6999 case TemplateArgument::Type:
7000 if (
const TagType *TagTy = dyn_cast<TagType>(
TA.getAsType()))
7001 return Visit(TagTy->getDecl());
7003 case TemplateArgument::Declaration:
return Visit(
TA.getAsDecl());
7005 llvm_unreachable(
"Invalid TemplateArgument::Kind!");
7008 void VisitClassTemplateSpecializationDecl(
const ClassTemplateSpecializationDecl *CTSD)
7010 if (CTSD->getOwningModule())
7013 VisitDecl(CTSD->getSpecializedTemplate());
7014 const TemplateArgumentList &ArgList = CTSD->getTemplateArgs();
7015 for (
const TemplateArgument *Arg = ArgList.data(), *ArgEnd = Arg + ArgList.size(); Arg != ArgEnd; ++Arg) {
7016 VisitTemplateArgument(*Arg);
7021 llvm::DenseSet<Module *> TopLevelModules;
7022 ModuleCollector
m(TopLevelModules);
7025 for (
auto M : TopLevelModules) {
7028 if (!M->LinkLibraries.size())
7031 if (M->Name ==
"Core")
7033 assert(M->LinkLibraries.size() == 1);
7036 result += M->LinkLibraries[0].Library;
7052 llvm::StringRef className = cls;
7058 if (className.contains(
"(lambda)"))
7062 cling::LookupHelper &LH =
fInterpreter->getLookupHelper();
7064 if (!libs.empty()) {
7070 if (!cls || !*cls) {
7078 const char* libs = libs_record->
GetValue();
7079 return (*libs) ? libs : 0;
7096 const char* libs = libs_record->
GetValue();
7097 return (*libs) ? libs : 0;
7111 cling::Interpreter *interp,
7112 bool skipLoadedLibs =
true)
7115 if (!llvm::sys::path::is_absolute(lib)) {
7117 Error(
"TCling__GetSharedLibImmediateDepsSlow",
"Cannot find library '%s'", lib.c_str());
7121 assert(llvm::sys::fs::exists(lib) &&
"Must exist!");
7122 lib = llvm::sys::path::filename(lib).str();
7125 auto ObjF = llvm::object::ObjectFile::createObjectFile(LibFullPath.
Data());
7127 Warning(
"TCling__GetSharedLibImmediateDepsSlow",
"Failed to read object file %s", lib.c_str());
7131 llvm::object::ObjectFile *BinObjFile = ObjF.get().getBinary();
7133 std::set<string> DedupSet;
7134 std::string Result = lib +
' ';
7135 for (
const auto &S : BinObjFile->symbols()) {
7136 uint32_t Flags = llvm::cantFail(S.getFlags());
7138 if (!(Flags & llvm::object::SymbolRef::SF_Undefined))
7142 if (Flags & llvm::object::SymbolRef::SF_Weak)
7144 llvm::Expected<StringRef> SymNameErr = S.getName();
7146 Warning(
"GetSharedLibDepsForModule",
"Failed to read symbol");
7149 llvm::StringRef SymName = SymNameErr.get();
7150 if (SymName.empty())
7153 if (BinObjFile->isELF()) {
7157 if (SymName.contains(
"@GLIBCXX") || SymName.contains(
"@CXXABI") ||
7158 SymName.contains(
"@GLIBC") || SymName.contains(
"@GCC"))
7166 static constexpr llvm::StringRef RegisterClasses(
"_Jv_RegisterClasses");
7167 static constexpr llvm::StringRef RegisterCloneTable(
"_ITM_registerTMCloneTable");
7168 static constexpr llvm::StringRef DeregisterCloneTable(
"_ITM_deregisterTMCloneTable");
7169 if (SymName == RegisterClasses ||
7170 SymName == RegisterCloneTable ||
7171 SymName == DeregisterCloneTable)
7176 if (skipLoadedLibs) {
7178 if (llvm::sys::DynamicLibrary::SearchForAddressOfSymbol(SymNameForDlsym))
7183 std::string found = interp->getDynamicLibraryManager()->searchLibrariesForSymbol(SymName,
false);
7189 if (!found.empty()) {
7190 std::string cand = llvm::sys::path::filename(found).str();
7191 if (!DedupSet.insert(cand).second)
7194 Result += cand +
' ';
7204 llvm::SmallString<256> rootmapName;
7205 if (!lib.startswith(
"lib"))
7206 rootmapName.append(
"lib");
7208 rootmapName.append(llvm::sys::path::filename(lib));
7209 llvm::sys::path::replace_extension(rootmapName,
"rootmap");
7215 llvm::StringRef rootmapNameNoLib = rootmapName.str();
7216 if (rootmapNameNoLib.consume_front(
"lib"))
7240 if (llvm::sys::path::is_absolute(lib) && !llvm::sys::fs::exists(lib))
7244 llvm::SmallString<512> rootmapName(lib);
7245 llvm::sys::path::replace_extension(rootmapName,
"rootmap");
7246 if (llvm::sys::fs::exists(rootmapName)) {
7248 Info(
"Load",
"loading %s", rootmapName.c_str());
7255 Warning(
"TCling::GetSharedLibDeps",
"Precomputed dependencies available but scanning '%s'", lib);
7260 if (!libs.empty()) {
7266 if (!
fMapfile || !lib || !lib[0]) {
7277 while ((rec = (
TEnvRec*) next())) {
7278 const char* libs = rec->
GetValue();
7279 if (!strncmp(libs, libname.
Data(),
len) && strlen(libs) >=
len
7280 && (!libs[
len] || libs[
len] ==
' ' || libs[
len] ==
'.')) {
7293#if defined(R__MUST_REVISIT)
7294#if R__MUST_REVISIT(6,2)
7295 Warning(
"IsErrorMessagesEnabled",
"Interface not available yet.");
7307#if defined(R__MUST_REVISIT)
7308#if R__MUST_REVISIT(6,2)
7309 Warning(
"SetErrorMessages",
"Interface not available yet.");
7325 llvm::SmallVector<std::string, 10> includePaths;
7327 fInterpreter->GetIncludePaths(includePaths,
false,
true);
7328 if (
const size_t nPaths = includePaths.size()) {
7329 assert(!(nPaths & 1) &&
"GetIncludePath, number of paths and options is not equal");
7331 for (
size_t i = 0; i < nPaths; i += 2) {
7336 if (includePaths[i] !=
"-I")
7370 assert(fout != 0 &&
"DisplayIncludePath, 'fout' parameter is null");
7372 llvm::SmallVector<std::string, 10> includePaths;
7374 fInterpreter->GetIncludePaths(includePaths,
false,
true);
7375 if (
const size_t nPaths = includePaths.size()) {
7376 assert(!(nPaths & 1) &&
"DisplayIncludePath, number of paths and options is not equal");
7378 std::string allIncludes(
"include path:");
7379 for (
size_t i = 0; i < nPaths; i += 2) {
7381 allIncludes += includePaths[i];
7383 if (includePaths[i] !=
"-I")
7385 allIncludes += includePaths[i + 1];
7388 fprintf(fout,
"%s\n", allIncludes.c_str());
7407#if defined(R__MUST_REVISIT)
7408#if R__MUST_REVISIT(6,2)
7409 Warning(
"GenericError",
"Interface not available yet.");
7437#if defined(R__MUST_REVISIT)
7438#if R__MUST_REVISIT(6,2)
7439 Warning(
"GetSecurityError",
"Interface not available yet.");
7450 cling::Interpreter::CompilationResult compRes;
7452 return compRes == cling::Interpreter::kFailure;
7471 TTHREAD_TLS_DECL(std::string,buffer);
7473 return buffer.c_str();
7554#if defined(R__MUST_REVISIT)
7555#if R__MUST_REVISIT(6,2)
7556 Warning(
"SetErrmsgcallback",
"Interface not available yet.");
7565 &
fInterpreter->getDiagnostics().getDiagnosticOptions(),
7567 [] (clang::DiagnosticsEngine::Level Level,
const std::string &
Info) {
7568 if (Level == clang::DiagnosticsEngine::Warning) {
7569 ::Warning(
"cling",
"%s", Info.c_str());
7570 }
else if (Level == clang::DiagnosticsEngine::Error
7571 || Level == clang::DiagnosticsEngine::Fatal) {
7577 fInterpreter->replaceDiagnosticConsumer(consumer,
true);
7579 fInterpreter->replaceDiagnosticConsumer(
nullptr);
7596 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
7597 std::string canonical = DLM->lookupLibrary(path);
7598 if (canonical.empty()) {
7602 cling::Interpreter::CompilationResult compRes;
7604 return compRes == cling::Interpreter::kFailure;
7608 return std::unique_ptr<TInterpreterValue>(
new TClingValue);
7615 std::vector<std::string>& completions)
7624 auto V =
reinterpret_cast<cling::Value*
>(
value.GetValAddr());
7626 return compRes!=cling::Interpreter::kSuccess ? 0 : 1 ;
7633 using namespace cling;
7647 if (
value.isValid() &&
value.needsManagedAllocation()) {
7668 auto iSpecObj = iSpecObjMap->second.find(Name);
7669 if (iSpecObj != iSpecObjMap->second.end()) {
7671 return iSpecObj->second;
7678 ASTContext& C = SemaR.getASTContext();
7679 Preprocessor &PP = SemaR.getPreprocessor();
7680 Parser& P =
const_cast<Parser&
>(
fInterpreter->getParser());
7681 Preprocessor::CleanupAndRestoreCacheRAII cleanupRAII(PP);
7682 Parser::ParserCurTokRestoreRAII savedCurToken(P);
7685 Token& Tok =
const_cast<Token&
>(P.getCurToken());
7686 Tok.setKind(tok::semi);
7692 Sema::ContextAndScopeRAII pushedDCAndS(SemaR, C.getTranslationUnitDecl(),
7695 TObject* specObj =
gROOT->FindSpecialObject(Name, LookupCtx);
7698 Error(
"GetObjectAddress",
"Got a special object without LookupCtx!");
7712 clang::CXXRecordDecl* klass)
const
7714 using namespace clang;
7715 ASTContext& Ctx = klass->getASTContext();
7716 FriendDecl::FriendUnion friendUnion(function);
7719 FriendDecl* friendDecl = FriendDecl::Create(Ctx, klass, sl, friendUnion, sl);
7720 klass->pushFriendDecl(friendDecl);
7734 if (func)
return ((
TClingCallFunc*)func)->GetDecl()->getCanonicalDecl();
7805 f->
Exec(address, &val);
7819 const void* args[] ,
7986 f->SetFunc(ci, method, params,
offset);
7995 f->SetFunc(ci, method, params, objectIsConst,
offset);
8033 llvm::SmallVector<clang::QualType, 4> funcProto;
8034 for (std::vector<TypeInfo_t*>::const_iterator iter =
proto.begin(), end =
proto.end();
8035 iter != end; ++iter) {
8036 funcProto.push_back( ((
TClingTypeInfo*)(*iter))->GetQualType() );
8038 f->SetFuncProto(ci, method, funcProto,
offset,
mode);
8048 llvm::SmallVector<clang::QualType, 4> funcProto;
8049 for (std::vector<TypeInfo_t*>::const_iterator iter =
proto.begin(), end =
proto.end();
8050 iter != end; ++iter) {
8051 funcProto.push_back( ((
TClingTypeInfo*)(*iter))->GetQualType() );
8053 f->SetFuncProto(ci, method, funcProto, objectIsConst,
offset,
mode);
8059 std::string wrapper_name;
8060 std::string wrapper;
8080 const clang::DeclContext *ctxt =
nullptr;
8082 ctxt = clang::Decl::castToDeclContext(((
TClingClassInfo*)info)->GetDecl());
8084 ctxt =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
8089 const clang::Decl *decl =
reinterpret_cast<const clang::Decl*
>(declid);
8093 const clang::DeclContext *declDC = decl->getDeclContext();
8096 if (declDC->isTransparentContext()) {
8097 declDC = declDC->getParent();
8100 if (
const auto *declRD = llvm::dyn_cast<clang::RecordDecl>(declDC)) {
8101 if (declRD->isAnonymousStructOrUnion()) {
8102 declDC = declRD->getParent();
8106 if (
const auto *declNS = llvm::dyn_cast<clang::NamespaceDecl>(declDC)) {
8107 if (declNS->isAnonymousNamespace() || declNS->isInlineNamespace()) {
8108 declDC = declNS->getParent();
8115 return declDC->Equals(ctxt);
8226 TClinginfo->
Init(tagnum);
8299 return TClinginfo->
Next();
8347 return TClinginfo->
Size();
8355 return TClinginfo->
Tagnum();
8371 TTHREAD_TLS_DECL(std::string,
output);
8381 return TClinginfo->
Name();
8389 return TClinginfo->
Title();
8426 ClassInfo_t* base)
const
8439 return TClinginfo->
Next();
8447 return TClinginfo->
Next(onlyDirect);
8455 return TClinginfo->
Offset(address, isDerivedObject);
8468 return TClinginfo->
GetBaseOffset(TClinginfoBase, address, isDerivedObject);
8484 return (ClassInfo_t *)TClinginfo->
GetBase();
8492 return TClinginfo->
Tagnum();
8500 TTHREAD_TLS_DECL(std::string,
output);
8510 return TClinginfo->
Name();
8555 const clang::Decl* decl =
reinterpret_cast<const clang::Decl*
>(declid);
8556 const clang::ValueDecl* vd = llvm::dyn_cast_or_null<clang::ValueDecl>(decl);
8589 return TClinginfo->
Next();
8597 return TClinginfo->
Offset();
8645 return TClinginfo->
Name();
8653 return TClinginfo->
Title();
8660 TTHREAD_TLS_DECL(std::string,
result);
8671 Decl* decl =
static_cast<Decl*
>(
const_cast<void*
>(declId));
8672 ASTContext &C = decl->getASTContext();
8673 decl->addAttr(AnnotateAttr::CreateImplicit(C, attribute));
8684 cling::Interpreter &interp,
8687 const clang::TypeDecl* td = llvm::dyn_cast<clang::TypeDecl>(decl->getDeclContext());
8690 clang::QualType qualType(td->getTypeForDecl(),0);
8692 unsigned int level = 0;
8695 else if (
name[
cursor] ==
'<' && level) --level;
8696 else if (level == 0 &&
name[
cursor] ==
':') {
8709 const auto *FD = llvm::dyn_cast<clang::FunctionDecl>(decl);
8710 if (
const auto *USD = llvm::dyn_cast<clang::UsingShadowDecl>(decl)) {
8711 FD = llvm::dyn_cast<clang::FunctionDecl>(USD->getTargetDecl());
8714 Error(
"GetFunctionName",
"NULL Decl!");
8721 if (llvm::isa<clang::CXXConstructorDecl>(FD))
8725 }
else if (llvm::isa<clang::CXXDestructorDecl>(decl))
8730 llvm::raw_string_ostream stream(
output);
8731 auto printPolicy = decl->getASTContext().getPrintingPolicy();
8733 printPolicy.AnonymousTagLocations =
false;
8734 FD->getNameForDiagnostic(stream, printPolicy,
false);
8764 return (FuncTempInfo_t*)
const_cast<void*
>(declid);
8775 return (FuncTempInfo_t*)ft_info;
8795 if (!ft_info)
return 0;
8796 const clang::FunctionTemplateDecl *ft = (
const clang::FunctionTemplateDecl*)ft_info;
8797 return ft->getTemplateParameters()->size();
8806 if (!ft_info)
return 0;
8807 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
8808 return ft->getTemplateParameters()->getMinRequiredArguments();
8816 if (!ft_info)
return 0;
8821 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
8823 switch (ft->getAccess()) {
8824 case clang::AS_public:
8827 case clang::AS_protected:
8830 case clang::AS_private:
8833 case clang::AS_none:
8834 if (ft->getDeclContext()->isNamespace())
8842 const clang::FunctionDecl *fd = ft->getTemplatedDecl();
8843 if (
const clang::CXXMethodDecl *md =
8844 llvm::dyn_cast<clang::CXXMethodDecl>(fd)) {
8845 if (md->getMethodQualifiers().hasConst()) {
8848 if (md->isVirtual()) {
8854 if (
const clang::CXXConstructorDecl *cd =
8855 llvm::dyn_cast<clang::CXXConstructorDecl>(md)) {
8856 if (cd->isExplicit()) {
8860 else if (
const clang::CXXConversionDecl *cd =
8861 llvm::dyn_cast<clang::CXXConversionDecl>(md)) {
8862 if (cd->isExplicit()) {
8876 if (!ft_info)
return 0;
8881 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
8882 const clang::FunctionDecl *fd = ft->getTemplatedDecl();
8884 if (fd->isOverloadedOperator())
8886 if (llvm::isa<clang::CXXConversionDecl>(fd))
8888 if (llvm::isa<clang::CXXConstructorDecl>(fd))
8890 if (llvm::isa<clang::CXXDestructorDecl>(fd))
8892 if (fd->isInlined())
8903 if (!ft_info)
return;
8904 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
8916 if (!ft_info)
return;
8917 const clang::FunctionTemplateDecl *ft = (
const clang::FunctionTemplateDecl*)ft_info;
8921 if (
const RedeclarableTemplateDecl *AnnotFD
8923 if (AnnotateAttr *A = AnnotFD->getAttr<AnnotateAttr>()) {
8924 output = A->getAnnotation().str();
8928 if (!ft->isFromASTFile()) {
8978 const clang::Decl* decl =
reinterpret_cast<const clang::Decl*
>(declid);
9011 return info->
NArg();
9027 return info->
Next();
9051 return (TypeInfo_t*)info->
Type();
9059 TTHREAD_TLS_DECL(
TString, mangled_name);
9061 return mangled_name;
9077 return info->
Name();
9104 return info->
Title();
9112 return MethodInfo_MethodCallReturnType(func->fInfo);
9114 return EReturnType::kOther;
9123 if (info && info->
IsValid()) {
9125 clang::QualType QT( typeinfo->
GetQualType().getCanonicalType() );
9126 if (QT->isEnumeralType()) {
9127 return EReturnType::kLong;
9128 }
else if (QT->isPointerType()) {
9130 QT = llvm::cast<clang::PointerType>(QT)->getPointeeType();
9131 if ( QT->isCharType() ) {
9132 return EReturnType::kString;
9134 return EReturnType::kOther;
9136 }
else if ( QT->isFloatingType() ) {
9137 int sz = typeinfo->
Size();
9138 if (sz == 4 || sz == 8) {
9140 return EReturnType::kDouble;
9142 return EReturnType::kOther;
9144 }
else if ( QT->isIntegerType() ) {
9145 int sz = typeinfo->
Size();
9154 return EReturnType::kLong;
9156 return EReturnType::kOther;
9159 return EReturnType::kOther;
9162 return EReturnType::kOther;
9198 return (MethodArgInfo_t*)
9215 return info->
Next();
9239 return info->
Name();
9315 return TClinginfo->
Name();
9339 return TClinginfo->
Size();
9389 const char*
name)
const
9409 return TClinginfo->
Next();
9425 return TClinginfo->
Size();
9441 return TClinginfo->
Name();
9449 return TClinginfo->
Title();
9458 Error(
"SnapshotMutexState",
"fRecurseCount != 0 even though initial mutex state is unset!");
9474 Error(
"ForgetMutexState",
"mutex state's recurse count already 0!");
9490 std::unique_ptr<MutexStateAndRecurseCountDelta> uniqueP{typedDelta};
9504 Error(
"ApplyToInterpreterMutex",
9505 "After returning from user code that turned on thread safety support, we notice that fInitialMutex is already used ... "
9506 "so the rest of this function/stack execution might have race condition (with the other thread that thinks it has exclusive access to the interpreter state.");
9522 return uniqueP.release();
The file contains utilities which are foundational and could be used across the core component of ROO...
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
unsigned long long ULong64_t
TClass *(* DictFuncPtr_t)()
R__EXTERN TApplication * gApplication
R__EXTERN TClassTable * gClassTable
static bool IsFromRootCling()
static void indent(ostringstream &buf, int indent_level)
The file contains facilities to work with C++ module files extensions used to store rdict files.
void TCling__RestoreInterpreterMutex(void *delta)
Re-apply the lock count delta that TCling__ResetInterpreterMutex() caused.
void TCling__TransactionRollback(const cling::Transaction &T)
static void RegisterPreIncludedHeaders(cling::Interpreter &clingInterp)
static bool hasParsedRootmapForLibrary(llvm::StringRef lib)
static std::string GetClassSharedLibsForModule(const char *cls, cling::LookupHelper &LH)
void TCling__InvalidateGlobal(const clang::Decl *D)
bool TClingLookupHelper__AutoParse(const char *cname)
Allow calling autoparsing from TMetaUtils.
void * TCling__LockCompilationDuringUserCodeExecution()
Lock the interpreter.
void TCling__UpdateListsOnUnloaded(const cling::Transaction &T)
void TCling__GetNormalizedContext(const ROOT::TMetaUtils::TNormalizedCtxt *&normCtxt)
int TCling__LoadLibrary(const char *library)
Load a library.
void TCling__DEBUG__dump(clang::DeclContext *DC)
ETupleOrdering
Check in what order the member of a tuple are layout.
bool TCling__LibraryLoadingFailed(const std::string &errmessage, const std::string &libStem, bool permanent, bool resolved)
Lookup libraries in LD_LIBRARY_PATH and DYLD_LIBRARY_PATH with mangled_name, which is extracted by er...
static const std::unordered_set< std::string > gIgnoredPCMNames
List of dicts that have the PCM information already in the PCH.
static Bool_t s_IsLibraryLoaded(const char *libname, cling::Interpreter *fInterpreter)
static std::string AlternateTuple(const char *classname, const cling::LookupHelper &lh)
static GlobalModuleIndex * loadGlobalModuleIndex(cling::Interpreter &interp)
bool TClingLookupHelper__ExistingTypeCheck(const std::string &tname, std::string &result)
Try hard to avoid looking up in the Cling database as this could enduce an unwanted autoparsing.
static bool HasASTFileOnDisk(clang::Module *M, const clang::Preprocessor &PP, std::string *FullFileName=nullptr)
Checks if there is an ASTFile on disk for the given module M.
void TCling__UnlockCompilationDuringUserCodeExecution(void *)
Unlock the interpreter.
const char * TCling__GetClassSharedLibs(const char *className)
static bool R__InitStreamerInfoFactory()
Helper to initialize TVirtualStreamerInfo's factor early.
int TCling__AutoParseCallback(const char *className)
clang::RecordDecl * TCling__DEBUG__DCtoRecordDecl(clang::DeclContext *DC)
int TCling_GenerateDictionary(const std::vector< std::string > &classes, const std::vector< std::string > &headers, const std::vector< std::string > &fwdDecls, const std::vector< std::string > &unknown)
static bool HaveFullGlobalModuleIndex
bool TCling__TEST_isInvalidDecl(clang::Decl *D)
void TCling__LibraryUnloadedRTTI(const void *dyLibHandle, const char *canonicalName)
void TCling__UpdateListsOnCommitted(const cling::Transaction &T, cling::Interpreter *)
const Decl * TCling__GetObjectDecl(TObject *obj)
static ETupleOrdering IsTupleAscending()
void TCling__RegisterRdictForLoadPCM(const std::string &pcmFileNameFullPath, llvm::StringRef *pcmContent)
static void TCling__UpdateClassInfo(const NamedDecl *TD)
Update TClingClassInfo for a class (e.g. upon seeing a definition).
clang::DeclContext * TCling__DEBUG__getDeclContext(clang::Decl *D)
int TCling__CompileMacro(const char *fileName, const char *options)
void * TCling__ResetInterpreterMutex()
Reset the interpreter lock to the state it had before interpreter-related calls happened.
void TCling__DEBUG__decl_dump(void *D)
int TCling__AutoLoadCallback(const char *className)
static bool LoadModule(const std::string &ModuleName, cling::Interpreter &interp)
static void RegisterCxxModules(cling::Interpreter &clingInterp)
static void ConstructorName(std::string &name, const clang::Decl *decl, cling::Interpreter &interp, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt)
void TCling__PrintStackTrace()
Print a StackTrace!
static int HandleInterpreterException(cling::MetaProcessor *metaProcessor, const char *input_line, cling::Interpreter::CompilationResult &compRes, cling::Value *result)
Let cling process a command line.
static std::string GetSharedLibImmediateDepsSlow(std::string lib, cling::Interpreter *interp, bool skipLoadedLibs=true)
This interface returns a list of dependent libraries in the form: lib libA.so libB....
void TCling__DEBUG__printName(clang::Decl *D)
static clang::ClassTemplateDecl * FindTemplateInNamespace(clang::Decl *decl)
Find a template decl within N nested namespaces, 0<=N<inf Assumes 1 and only 1 template present and 1...
static void PrintDlError(const char *dyLibName, const char *modulename)
TInterpreter * CreateInterpreter(void *interpLibHandle, const char *argv[])
void TCling__LibraryLoadedRTTI(const void *dyLibHandle, const char *canonicalName)
static cling::Interpreter::CompilationResult ExecAutoParse(const char *what, Bool_t header, cling::Interpreter *interpreter)
Parse the payload or header.
static bool requiresRootMap(const char *rootmapfile)
clang::NamespaceDecl * TCling__DEBUG__DCtoNamespace(clang::DeclContext *DC)
TObject * TCling__GetObjectAddress(const char *Name, void *&LookupCtx)
static void LoadModules(const std::vector< std::string > &modules, cling::Interpreter &interp)
Loads the C++ modules that we require to run any ROOT program.
int TCling__IsAutoLoadNamespaceCandidate(const clang::NamespaceDecl *nsDecl)
void DestroyInterpreter(TInterpreter *interp)
static bool hasPrecomputedLibraryDeps(llvm::StringRef lib)
void TCling__SplitAclicMode(const char *fileName, string &mode, string &args, string &io, string &fname)
void Info(const char *location, const char *msgfmt,...)
Use this function for informational messages.
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
void Fatal(const char *location, const char *msgfmt,...)
Use this function in case of a fatal error. It will abort the program.
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void input
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t cursor
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h offset
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h length
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char cname
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
Option_t Option_t TPoint TPoint const char mode
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t property
Option_t Option_t TPoint TPoint const char text
R__EXTERN TVirtualMutex * gInterpreterMutex
#define R__LOCKGUARD_CLING(mutex)
R__EXTERN TInterpreter * gCling
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
Bool_t R_ISREG(Int_t mode)
R__EXTERN TSystem * gSystem
R__EXTERN TVirtualMutex * gGlobalMutex
#define R__LOCKGUARD(mutex)
#define R__WRITE_LOCKGUARD(mutex)
#define R__READ_LOCKGUARD(mutex)
virtual std::unique_ptr< StateDelta > Rewind(const State &earlierState)=0
virtual void Apply(std::unique_ptr< StateDelta > &&delta)=0
virtual std::unique_ptr< State > GetStateBefore()=0
static Longptr_t ExecuteFile(const char *file, Int_t *error=nullptr, Bool_t keep=kFALSE)
Execute a file containing a C++ macro (static method).
virtual TApplicationImp * GetApplicationImp()
virtual Bool_t IsCmdThread()
Each class (see TClass) has a linked list of its base class(es).
TClassRef is used to implement a permanent reference to a TClass object.
static DictFuncPtr_t GetDict(const char *cname)
Given the class name returns the Dictionary() function of a class (uses hash of name).
static TProtoClass * GetProtoNorm(const char *cname)
Given the class normalized name returns the TClassProto object for the class.
static DictFuncPtr_t GetDictNorm(const char *cname)
Given the normalized class name returns the Dictionary() function of a class (uses hash of name).
static TProtoClass * GetProto(const char *cname)
Given the class name returns the TClassProto object for the class.
static Bool_t Check(const char *cname, std::string &normname)
static void Add(const char *cname, Version_t id, const std::type_info &info, DictFuncPtr_t dict, Int_t pragmabits)
Add a class to the class table (this is a static function).
TClass instances represent classes, structs and namespaces in the ROOT type system.
TDataMember * GetDataMember(const char *datamember) const
Return pointer to datamember object with name "datamember".
ROOT::ESTLType GetCollectionType() const
Return the 'type' of the STL the TClass is representing.
EState fState
cached of the streaming method to use
std::atomic< TList * > fBase
static void AddClassToDeclIdMap(TDictionary::DeclId_t id, TClass *cl)
static: Add a TClass* to the map of classes.
TList * GetListOfFunctionTemplates(Bool_t load=kTRUE)
Return TListOfFunctionTemplates for a class.
void * DynamicCast(const TClass *base, void *obj, Bool_t up=kTRUE)
Cast obj of this class type up to baseclass cl if up is true.
static void RemoveClassDeclId(TDictionary::DeclId_t id)
Bool_t CallShowMembers(const void *obj, TMemberInspector &insp, Bool_t isTransient=kFALSE) const
Call ShowMembers() on the obj of this class type, passing insp and parent.
std::atomic< TListOfEnums * > fEnums
static Bool_t HasNoInfoOrEmuOrFwdDeclaredDecl(const char *)
virtual void PostLoadCheck()
Do the initialization that can only be done after the CINT dictionary has been fully populated and ca...
static TClass * LoadClass(const char *requestedname, Bool_t silent)
Helper function used by TClass::GetClass().
Int_t Size() const
Return size of object of this class.
TObjArray * fStreamerInfo
Bool_t IsLoaded() const
Return true if the shared library of this class is currently in the a process's memory.
ClassInfo_t * GetClassInfo() const
TVirtualCollectionProxy * GetCollectionProxy() const
Return the proxy describing the collection (if any).
void ResetCaches()
To clean out all caches.
Long_t Property() const override
Returns the properties of the TClass as a bit field stored as a Long_t value.
static Int_t ReadRules()
Read the class.rules files from the default location:.
Version_t GetClassVersion() const
std::atomic< Bool_t > fHasRootPcmInfo
C++ Property of the class (is abstract, has virtual table, etc.)
const char * GetDeclFileName() const
Return name of the file containing the declaration of this class.
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
Emulation of the CINT BaseClassInfo class.
const char * TmpltName() const
const char * Name() const
ptrdiff_t Offset(void *address=0, bool isDerivedObject=true) const
void FullName(std::string &output, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
TClingClassInfo * GetBase() const
Emulation of the CINT CallFunc class.
void ExecWithReturn(void *address, void *ret=nullptr)
void SetArgs(const char *args)
double ExecDouble(void *address)
void SetArgArray(Longptr_t *argArr, int narg)
Longptr_t ExecInt(void *address)
TInterpreter::CallFuncIFacePtr_t IFacePtr()
void SetFunc(const TClingClassInfo *info, const char *method, const char *arglist, Longptr_t *poffset)
void ExecWithArgsAndReturn(void *address, const void *args[]=0, int nargs=0, void *ret=0)
void Exec(void *address, TInterpreterValue *interpVal=0)
TClingMethodInfo * FactoryMethod() const
int get_wrapper_code(std::string &wrapper_name, std::string &wrapper)
void IgnoreExtraArgs(bool ignore)
long long ExecInt64(void *address)
bool IsAutoLoadingEnabled() const
void SetAutoParsingSuspended(bool val=true)
void SetAutoLoadingEnabled(bool val=true)
Emulation of the CINT ClassInfo class.
static bool IsEnum(cling::Interpreter *interp, const char *name)
long ClassProperty() const
void Init(const char *name)
void FullName(std::string &output, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
EDataType GetUnderlyingType() const
const char * TmpltName() const
const clang::Type * GetType() const
ptrdiff_t GetBaseOffset(TClingClassInfo *toBase, void *address, bool isDerivedObject)
bool IsScopedEnum() const
ROOT::TMetaUtils::EIOCtorCategory HasDefaultConstructor(bool checkio=false, std::string *type_name=nullptr) const
TClingMethodInfo GetMethodWithArgs(const char *fname, const char *arglist, Longptr_t *poffset, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch, EInheritanceMode imode=kWithInheritance) const
const clang::FunctionTemplateDecl * GetFunctionTemplate(const char *fname) const
int GetMethodNArg(const char *method, const char *proto, Bool_t objectIsConst, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch) const
bool IsValidMethod(const char *method, const char *proto, Bool_t objectIsConst, Longptr_t *offset, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch) const
bool HasMethod(const char *name) const
TDictionary::DeclId_t GetDeclId() const
void DeleteArray(void *arena, bool dtorOnly, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
void * New(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
TClingMethodInfo GetMethod(const char *fname) const
const clang::ValueDecl * GetDataMember(const char *name) const
void Destruct(void *arena, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
std::vector< std::string > GetUsingNamespaces()
bool IsBase(const char *name) const
void Delete(void *arena, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
Emulation of the CINT DataMemberInfo class.
const char * TypeName() const
const char * TypeTrueName(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
int MaxIndex(int dim) const
llvm::StringRef ValidArrayIndex() const
const char * Name() const override
long TypeProperty() const
virtual const char * Name() const
virtual bool IsValid() const
virtual const clang::Decl * GetDecl() const
Uses clang::TextDiagnosticPrinter to format diagnostics, which are then passed to a user-specified fu...
Emulation of the CINT MethodInfo class.
bool IsValid() const override
const char * DefaultValue() const
const TClingTypeInfo * Type() const
const char * TypeName() const
Emulation of the CINT MethodInfo class.
std::string GetMangledName() const
const char * TypeName() const
const char * Name() const override
const clang::FunctionDecl * GetTargetFunctionDecl() const
Get the FunctionDecl, or if this represents a UsingShadowDecl, the underlying target FunctionDecl.
const char * GetPrototype()
long ExtraProperty() const
void * InterfaceMethod() const
void CreateSignature(TString &signature) const
TDictionary::DeclId_t GetDeclId() const
TClingTypeInfo * Type() const
Emulation of the CINT TypeInfo class.
std::string NormalizedName(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
Return the normalized name of the type (i.e.
const char * Name() const override
bool IsValid() const override
clang::QualType GetQualType() const
void Init(const char *name)
const char * TrueName(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
Return the normalized name of the type (i.e.
Emulation of the CINT TypedefInfo class.
const char * TrueName(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
Get the name of the underlying type of the current typedef.
long Property() const
Return a bit mask of metadata about the current typedef.
const char * Name() const override
Get the name of the current typedef.
void Init(const char *name)
Lookup named typedef and reset the iterator to point to it.
int Next()
Increment the iterator.
int Size() const
Return the size in bytes of the underlying type of the current typedef.
Bridge between cling::Value and ROOT.
bool Append(const std::string &str)
Append string to the storage if not added already.
This class defines an interface to the cling C++ interpreter.
static Int_t DeepAutoLoadImpl(const char *cls, std::unordered_set< std::string > &visited, bool nameIsNormalized)
const char * MethodArgInfo_DefaultValue(MethodArgInfo_t *marginfo) const final
bool ClassInfo_IsScopedEnum(ClassInfo_t *info) const final
const char * TypeInfo_Name(TypeInfo_t *) const final
void * MethodInfo_InterfaceMethod(MethodInfo_t *minfo) const final
void LoadEnums(TListOfEnums &cl) const final
Create list of pointers to enums for TClass cl.
void UpdateListOfGlobals() final
No op: see TClingCallbacks (used to update the list of globals)
bool TypedefInfo_IsValid(TypedefInfo_t *tinfo) const final
Int_t AutoLoad(const char *classname, Bool_t knowDictNotLoaded=kFALSE) final
Load library containing the specified class.
void CallFunc_Init(CallFunc_t *func) const final
void SetGetline(const char *(*getlineFunc)(const char *prompt), void(*histaddFunc)(const char *line)) final
Set a getline function to call when input is needed.
bool LibraryLoadingFailed(const std::string &, const std::string &, bool, bool)
void GenericError(const char *error) const final
Let the interpreter issue a generic error, and set its error state.
std::vector< void * > fRegisterModuleDyLibs
void CallFunc_ExecWithReturn(CallFunc_t *func, void *address, void *ret) const final
TypeInfo_t * MethodInfo_Type(MethodInfo_t *minfo) const final
std::vector< std::string > fAutoLoadLibStorage
void CallFunc_Delete(CallFunc_t *func) const final
int LoadFile(const char *path) const final
Load a source file or library called path into the interpreter.
void ResetAll() final
Reset the Cling state to its initial state.
void SetDeclAttr(DeclId_t, const char *) final
void HandleNewDecl(const void *DV, bool isDeserialized, std::set< TClass * > &modifiedClasses)
void InvalidateCachedDecl(const std::tuple< TListOfDataMembers *, TListOfFunctions *, TListOfFunctionTemplates *, TListOfEnums * > &Lists, const clang::Decl *D)
Invalidate cached TCling information for the given declaration, and removed it from the appropriate o...
Long_t MethodInfo_Property(MethodInfo_t *minfo) const final
virtual void LoadFunctionTemplates(TClass *cl) const final
Create list of pointers to function templates for TClass cl.
bool ClassInfo_IsValidMethod(ClassInfo_t *info, const char *method, const char *proto, Longptr_t *offset, ROOT::EFunctionMatchMode=ROOT::kConversionMatch) const final
Long_t DataMemberInfo_Property(DataMemberInfo_t *dminfo) const final
int SetClassAutoparsing(int) final
Enable/Disable the Autoparsing of headers.
std::vector< const char * > fCurExecutingMacros
void CreateListOfDataMembers(TClass *cl) const final
Create list of pointers to data members for TClass cl.
void RewindDictionary() final
Rewind Cling dictionary to the point where it was before executing the current macro.
bool ClassInfo_IsValid(ClassInfo_t *info) const final
void UpdateListsOnCommitted(const cling::Transaction &T)
int TypeInfo_RefType(TypeInfo_t *) const final
void CreateListOfBaseClasses(TClass *cl) const final
Create list of pointers to base class(es) for TClass cl.
ClassInfo_t * ClassInfo_Factory(Bool_t all=kTRUE) const final
const char * MethodInfo_Name(MethodInfo_t *minfo) const final
BaseClassInfo_t * BaseClassInfo_Factory(ClassInfo_t *info) const final
void SetClassInfo(TClass *cl, Bool_t reload=kFALSE) final
Set pointer to the TClingClassInfo in TClass.
Bool_t LoadText(const char *text) const final
Load the declarations from text into the interpreter.
const char * GetSharedLibDeps(const char *lib, bool tryDyld=false) final
Get the list a libraries on which the specified lib depends.
EReturnType MethodInfo_MethodCallReturnType(MethodInfo_t *minfo) const final
TObject * GetObjectAddress(const char *Name, void *&LookupCtx)
If the interpreter encounters Name, check whether that is an object ROOT could retrieve.
Longptr_t ProcessLineAsynch(const char *line, EErrorCode *error=nullptr)
Let cling process a command line asynch.
bool MethodInfo_IsValid(MethodInfo_t *minfo) const final
FuncTempInfo_t * FuncTempInfo_Factory(DeclId_t declid) const final
Construct a FuncTempInfo_t.
TypeInfo_t * TypeInfo_Factory() const final
bool IsClassAutoLoadingEnabled() const
Returns if class AutoLoading is currently enabled.
void InvalidateGlobal(const clang::Decl *D)
Invalidate cached TCling information for the given global declaration.
int Evaluate(const char *, TInterpreterValue &) final
Get the interpreter value corresponding to the statement.
std::unique_ptr< TInterpreterValue > MakeInterpreterValue() const final
void UpdateListOfLoadedSharedLibraries()
const char * TypedefInfo_Title(TypedefInfo_t *tinfo) const final
void CallFunc_SetFuncProto(CallFunc_t *func, ClassInfo_t *info, const char *method, const char *proto, Longptr_t *Offset, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch) const final
Interface to cling function.
void InitRootmapFile(const char *name)
Create a resource table and read the (possibly) three resource files, i.e.
Int_t AutoParse(const char *cls) final
Parse the headers relative to the class Returns 1 in case of success, 0 in case of failure.
void LoadPCM(std::string pcmFileNameFullPath)
Tries to load a rdict PCM, issues diagnostics if it fails.
void UpdateListOfMethods(TClass *cl) const final
Update the list of pointers to method for TClass cl This is now a nop.
virtual ~TCling()
Destroy the interpreter interface.
void AddFriendToClass(clang::FunctionDecl *, clang::CXXRecordDecl *) const
Inject function as a friend into klass.
void PrintIntro() final
No-op; see TRint instead.
Bool_t fCxxModulesEnabled
int BaseClassInfo_Next(BaseClassInfo_t *bcinfo) const final
void RefreshClassInfo(TClass *cl, const clang::NamedDecl *def, bool alias)
Internal function. Actually do the update of the ClassInfo when seeing.
CallFunc_t * CallFunc_FactoryCopy(CallFunc_t *func) const final
Double_t CallFunc_ExecDouble(CallFunc_t *func, void *address) const final
void CallFunc_ResetArg(CallFunc_t *func) const final
const char * GetCurrentMacroName() const final
Return the file name of the currently interpreted file, included or not.
Bool_t IsLoaded(const char *filename) const final
Return true if the file has already been loaded by cint.
void SaveGlobalsContext() final
Save the current Cling state of global objects.
void CallFunc_IgnoreExtraArgs(CallFunc_t *func, bool ignore) const final
void ApplyToInterpreterMutex(void *delta)
Re-apply the lock count delta that TCling__ResetInterpreterMutex() caused.
void * LazyFunctionCreatorAutoload(const std::string &mangled_name)
Autoload a library based on a missing symbol.
Int_t GenerateDictionary(const char *classes, const char *includes="", const char *options=nullptr) final
Generate the dictionary for the C++ classes listed in the first argument (in a semi-colon separated l...
Bool_t ClassInfo_Contains(ClassInfo_t *info, DeclId_t declid) const final
Return true if the entity pointed to by 'declid' is declared in the context described by 'info'.
Bool_t IsLibraryLoaded(const char *libname) const final
Long_t GetExecByteCode() const final
This routines used to return the address of the internal wrapper function (of the interpreter) that w...
int DataMemberInfo_ArrayDim(DataMemberInfo_t *dminfo) const final
DataMemberInfo_t * DataMemberInfo_FactoryCopy(DataMemberInfo_t *dminfo) const final
Bool_t HandleNewTransaction(const cling::Transaction &T)
Helper function to increase the internal Cling count of transactions that change the AST.
int ReadRootmapFile(const char *rootmapfile, TUniqueString *uniqueString=nullptr)
Read and parse a rootmapfile in its new format, and return 0 in case of success, -1 if the file has a...
std::map< SpecialObjectLookupCtx_t, SpecialObjectMap_t > fSpecialObjectMaps
int ClassInfo_Next(ClassInfo_t *info) const final
void SetErrmsgcallback(void *p) const final
Set a callback to receive error messages.
bool MethodArgInfo_IsValid(MethodArgInfo_t *marginfo) const final
int TypeInfo_Size(TypeInfo_t *tinfo) const final
Int_t DeleteGlobal(void *obj) final
Delete obj from Cling symbol table so it cannot be accessed anymore.
int GetSecurityError() const final
Interface to cling function.
void SetTempLevel(int val) const final
Create / close a scope for temporaries.
std::set< size_t > fPayloads
UInt_t FuncTempInfo_TemplateNargs(FuncTempInfo_t *) const final
Return the maximum number of template arguments of the function template described by ft_info.
DeclId_t GetFunctionWithPrototype(ClassInfo_t *cl, const char *method, const char *proto, Bool_t objectIsConst=kFALSE, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch) final
Return pointer to cling interface function for a method of a class with a certain prototype,...
TypedefInfo_t * TypedefInfo_Factory() const final
TObjArray * fRootmapFiles
Longptr_t ProcessLine(const char *line, EErrorCode *error=nullptr) final
int ClassInfo_Size(ClassInfo_t *info) const final
const char * MethodArgInfo_TypeName(MethodArgInfo_t *marginfo) const final
cling::Interpreter * GetInterpreterImpl() const
Longptr_t ExecuteMacro(const char *filename, EErrorCode *error=nullptr) final
Execute a cling macro.
std::vector< std::pair< TClass *, DictFuncPtr_t > > fClassesToUpdate
int DataMemberInfo_Next(DataMemberInfo_t *dminfo) const final
const char * TypedefInfo_Name(TypedefInfo_t *tinfo) const final
void BaseClassInfo_Delete(BaseClassInfo_t *bcinfo) const final
Long_t MethodInfo_ExtraProperty(MethodInfo_t *minfo) const final
void LoadMacro(const char *filename, EErrorCode *error=nullptr) final
Load a macro file in cling's memory.
const char * GetClassSharedLibs(const char *cls) final
Get the list of shared libraries containing the code for class cls.
FuncTempInfo_t * FuncTempInfo_FactoryCopy(FuncTempInfo_t *) const final
Construct a FuncTempInfo_t.
int DataMemberInfo_MaxIndex(DataMemberInfo_t *dminfo, Int_t dim) const final
Bool_t FuncTempInfo_IsValid(FuncTempInfo_t *) const final
Check validity of a FuncTempInfo_t.
void AddIncludePath(const char *path) final
Add a directory to the list of directories in which the interpreter looks for include files.
bool ClassInfo_IsBase(ClassInfo_t *info, const char *name) const final
void RecursiveRemove(TObject *obj) final
Delete object from cling symbol table so it can not be used anymore.
const char * DataMemberInfo_TypeName(DataMemberInfo_t *dminfo) const final
DeclId_t GetDataMemberAtAddr(const void *addr) const final
Return pointer to cling DeclId for a data member with a given name.
void CallFunc_SetArgArray(CallFunc_t *func, Longptr_t *paramArr, Int_t nparam) const final
std::string CallFunc_GetWrapperCode(CallFunc_t *func) const final
void * RewindInterpreterMutex()
Reset the interpreter lock to the state it had before interpreter-related calls happened.
const char * MethodArgInfo_Name(MethodArgInfo_t *marginfo) const final
Bool_t HasPCMForLibrary(const char *libname) const final
Return true if ROOT has cxxmodules pcm for a given library name.
void TypedefInfo_Init(TypedefInfo_t *tinfo, const char *name) const final
const char * DataMemberInfo_Title(DataMemberInfo_t *dminfo) const final
Longptr_t CallFunc_ExecInt(CallFunc_t *func, void *address) const final
void ClearStack() final
Delete existing temporary values.
void SetAlloclockfunc(void(*)()) const final
[Place holder for Mutex Lock] Provide the interpreter with a way to acquire a lock used to protect cr...
Bool_t SetErrorMessages(Bool_t enable=kTRUE) final
If error messages are disabled, the interpreter should suppress its failures and warning messages fro...
MethodInfo_t * CallFunc_FactoryMethod(CallFunc_t *func) const final
TypedefInfo_t * TypedefInfo_FactoryCopy(TypedefInfo_t *tinfo) const final
void GetFunctionOverloads(ClassInfo_t *cl, const char *funcname, std::vector< DeclId_t > &res) const final
Insert overloads of name in cl to res.
void UnRegisterTClassUpdate(const TClass *oldcl) final
If the dictionary is loaded, we can remove the class from the list (otherwise the class might be load...
std::string MethodArgInfo_TypeNormalizedName(MethodArgInfo_t *marginfo) const final
DeclId_t GetEnum(TClass *cl, const char *name) const final
Return pointer to cling Decl of global/static variable that is located at the address given by addr.
Long_t MethodArgInfo_Property(MethodArgInfo_t *marginfo) const final
int TypedefInfo_Size(TypedefInfo_t *tinfo) const final
void CallFunc_ExecWithArgsAndReturn(CallFunc_t *func, void *address, const void *args[]=nullptr, int nargs=0, void *ret=nullptr) const final
void GetInterpreterTypeName(const char *name, std::string &output, Bool_t full=kFALSE) final
The 'name' is known to the interpreter, this function returns the internal version of this name (usua...
std::map< std::string, llvm::StringRef > fPendingRdicts
static void UpdateClassInfoWork(const char *name)
Int_t Load(const char *filenam, Bool_t system=kFALSE) final
Load a library file in cling's memory.
int TypedefInfo_Next(TypedefInfo_t *tinfo) const final
void * GetInterfaceMethod(TClass *cl, const char *method, const char *params, Bool_t objectIsConst=kFALSE) final
Return pointer to cling interface function for a method of a class with parameters params (params is ...
void TypeInfo_Init(TypeInfo_t *tinfo, const char *funcname) const final
Bool_t SetSuspendAutoParsing(Bool_t value) final
Suspend the Autoparsing of headers.
int DataMemberInfo_TypeSize(DataMemberInfo_t *dminfo) const final
static void * fgSetOfSpecials
const char * ClassInfo_Title(ClassInfo_t *info) const final
const char * DataMemberInfo_Name(DataMemberInfo_t *dminfo) const final
const char * TypeName(const char *typeDesc) final
Return the absolute type of typeDesc.
ROOT::TMetaUtils::TNormalizedCtxt * fNormalizedCtxt
void ForgetMutexState() final
int MethodInfo_Next(MethodInfo_t *minfo) const final
Long_t ClassInfo_ClassProperty(ClassInfo_t *info) const final
void MethodInfo_Delete(MethodInfo_t *minfo) const final
Interface to cling function.
void MethodArgInfo_Delete(MethodArgInfo_t *marginfo) const final
DataMemberInfo_t * DataMemberInfo_Factory(ClassInfo_t *clinfo, TDictionary::EMemberSelection selection) const final
void ClassInfo_Destruct(ClassInfo_t *info, void *arena) const final
TClass * GetClass(const std::type_info &typeinfo, Bool_t load) const final
Demangle the name (from the typeinfo) and then request the class via the usual name based interface (...
Int_t UnloadAllSharedLibraryMaps() final
Unload the library map entries coming from all the loaded shared libraries.
void ClassInfo_Init(ClassInfo_t *info, const char *funcname) const final
std::set< TClass * > & GetModTClasses()
ClassInfo_t * BaseClassInfo_ClassInfo(BaseClassInfo_t *) const final
TClingCallbacks * fClingCallbacks
Long64_t CallFunc_ExecInt64(CallFunc_t *func, void *address) const final
Long_t ClassInfo_Property(ClassInfo_t *info) const final
Longptr_t ClassInfo_GetBaseOffset(ClassInfo_t *fromDerived, ClassInfo_t *toBase, void *address, bool isDerivedObject) const final
void UpdateEnumConstants(TEnum *enumObj, TClass *cl) const final
void ExecuteWithArgsAndReturn(TMethod *method, void *address, const void *args[]=nullptr, int nargs=0, void *ret=nullptr) const final
Bool_t IsErrorMessagesEnabled() const final
If error messages are disabled, the interpreter should suppress its failures and warning messages fro...
int DisplayIncludePath(FILE *fout) const final
Interface to cling function.
void TransactionRollback(const cling::Transaction &T)
Long_t FuncTempInfo_Property(FuncTempInfo_t *) const final
Return the property of the function template.
TEnum * CreateEnum(void *VD, TClass *cl) const final
const char * TypeInfo_TrueName(TypeInfo_t *tinfo) const final
Int_t UnloadLibraryMap(const char *library) final
Unload library map entries coming from the specified library.
void RegisterTemporary(const TInterpreterValue &value)
MutexStateAndRecurseCount fInitialMutex
const char * GetSharedLibs() final
Return the list of shared libraries loaded into the process.
int MethodArgInfo_Next(MethodArgInfo_t *marginfo) const final
void SnapshotMutexState(ROOT::TVirtualRWMutex *mtx) final
Long_t TypeInfo_Property(TypeInfo_t *tinfo) const final
const char * MethodInfo_GetPrototype(MethodInfo_t *minfo) const final
UInt_t FuncTempInfo_TemplateMinReqArgs(FuncTempInfo_t *) const final
Return the number of required template arguments of the function template described by ft_info.
std::vector< cling::Value > * fTemporaries
void RegisterModule(const char *modulename, const char **headers, const char **includePaths, const char *payloadCode, const char *fwdDeclsCode, void(*triggerFunc)(), const FwdDeclArgsToKeepCollection_t &fwdDeclsArgToSkip, const char **classesHeaders, Bool_t lateRegistration=false, Bool_t hasCxxModule=false) final
Inject the module named "modulename" into cling; load all headers.
static Int_t ShallowAutoLoadImpl(const char *cls)
void MethodInfo_CreateSignature(MethodInfo_t *minfo, TString &signature) const final
Bool_t CheckClassTemplate(const char *name) final
Return true if there is a class template by the given name ...
void LibraryLoaded(const void *dyLibHandle, const char *canonicalName)
void RegisterTClassUpdate(TClass *oldcl, DictFuncPtr_t dict) final
Register classes that already existed prior to their dictionary loading and that already had a ClassI...
TObjArray * GetRootMapFiles() const final
bool DataMemberInfo_IsValid(DataMemberInfo_t *dminfo) const final
bool ClassInfo_IsEnum(const char *name) const final
int MethodInfo_NDefaultArg(MethodInfo_t *minfo) const final
void CreateListOfMethods(TClass *cl) const final
Create list of pointers to methods for TClass cl.
Int_t RescanLibraryMap() final
Scan again along the dynamic path for library maps.
std::map< const cling::Transaction *, size_t > fTransactionHeadersMap
void ReportDiagnosticsToErrorHandler(bool enable=true) final
Report diagnostics to the ROOT error handler (see TError.h).
const char * MethodInfo_GetMangledName(MethodInfo_t *minfo) const final
Bool_t fHeaderParsingOnDemand
std::hash< std::string > fStringHashFunction
static void RemoveAndInvalidateObject(List &L, Object *O)
void * GetInterfaceMethodWithPrototype(TClass *cl, const char *method, const char *proto, Bool_t objectIsConst=kFALSE, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch) final
Return pointer to cling interface function for a method of a class with a certain prototype,...
void * ClassInfo_New(ClassInfo_t *info) const final
int DisplayClass(FILE *fout, const char *name, int base, int start) const final
virtual void GetFunctionName(const clang::Decl *decl, std::string &name) const
void CreateListOfMethodArgs(TFunction *m) const final
Create list of pointers to method arguments for TMethod m.
virtual const char * GetSTLIncludePath() const final
Return the directory containing CINT's stl cintdlls.
MethodArgInfo_t * MethodArgInfo_FactoryCopy(MethodArgInfo_t *marginfo) const final
Longptr_t BaseClassInfo_Offset(BaseClassInfo_t *toBaseClassInfo, void *address, bool isDerivedObject) const final
ECheckClassInfo CheckClassInfo(const char *name, Bool_t autoload, Bool_t isClassOrNamespaceOnly=kFALSE) final
Checks if an entity with the specified name is defined in Cling.
void * FindSym(const char *entry) const final
Interface to cling function.
void RegisterLoadedSharedLibrary(const char *name)
Register a new shared library name with the interpreter; add it to fSharedLibs.
void TypeInfo_Delete(TypeInfo_t *tinfo) const final
int MethodInfo_NArg(MethodInfo_t *minfo) const final
DeclId_t GetDataMemberWithValue(const void *ptrvalue) const final
NOT IMPLEMENTED.
std::unordered_set< const clang::NamespaceDecl * > fNSFromRootmaps
EReturnType MethodCallReturnType(TFunction *func) const final
void ProcessClassesToUpdate()
DeclId_t GetFunctionWithValues(ClassInfo_t *cl, const char *method, const char *params, Bool_t objectIsConst=kFALSE) final
Return pointer to cling DeclId for a method of a class with a certain prototype, i....
TString GetMangledName(TClass *cl, const char *method, const char *params, Bool_t objectIsConst=kFALSE) final
Return the cling mangled name for a method of a class with parameters params (params is a string of a...
const char * MethodInfo_Title(MethodInfo_t *minfo) const final
const char * BaseClassInfo_TmpltName(BaseClassInfo_t *bcinfo) const final
Bool_t Declare(const char *code) final
Declare code to the interpreter, without any of the interpreter actions that could trigger a re-inter...
const char * BaseClassInfo_FullName(BaseClassInfo_t *bcinfo) const final
void CallFunc_SetArgs(CallFunc_t *func, const char *param) const final
int UnloadFile(const char *path) const final
void CallFunc_Exec(CallFunc_t *func, void *address) const final
Long_t FuncTempInfo_ExtraProperty(FuncTempInfo_t *) const final
Return the property not already defined in Property See TDictionary's EFunctionProperty.
bool CallFunc_IsValid(CallFunc_t *func) const final
const char * BaseClassInfo_Name(BaseClassInfo_t *bcinfo) const final
ROOT::TMetaUtils::TClingLookupHelper * fLookupHelper
const char * DataMemberInfo_ValidArrayIndex(DataMemberInfo_t *dminfo) const final
Int_t GetMore() const final
Return whether we are waiting for more input either because the collected input contains unbalanced b...
Bool_t fIsAutoParsingSuspended
std::string ToString(const char *type, void *obj) final
DeclId_t GetDeclId(const llvm::GlobalValue *gv) const
Return pointer to cling DeclId for a global value.
void Execute(const char *function, const char *params, int *error=nullptr) final
Execute a global function with arguments params.
bool ClassInfo_IsLoaded(ClassInfo_t *info) const final
Longptr_t ClassInfo_Tagnum(ClassInfo_t *info) const final
Long_t BaseClassInfo_Property(BaseClassInfo_t *bcinfo) const final
void CallFunc_SetFunc(CallFunc_t *func, ClassInfo_t *info, const char *method, const char *params, Longptr_t *Offset) const final
std::vector< std::string > GetUsingNamespaces(ClassInfo_t *cl) const final
Get the scopes representing using declarations of namespace.
const char * ClassInfo_FileName(ClassInfo_t *info) const final
void FuncTempInfo_Title(FuncTempInfo_t *, TString &name) const final
Return the comments associates with this function template.
const char * ClassInfo_TmpltName(ClassInfo_t *info) const final
void SaveContext() final
Save the current Cling state.
void LoadPCMImpl(TFile &pcmFile)
Tries to load a PCM from TFile; returns true on success.
Bool_t IsAutoLoadNamespaceCandidate(const clang::NamespaceDecl *nsDecl)
void ResetGlobals() final
Reset in Cling the list of global variables to the state saved by the last call to TCling::SaveGlobal...
void CodeComplete(const std::string &, size_t &, std::vector< std::string > &) final
The call to Cling's tab complition.
void ResetGlobalVar(void *obj) final
Reset the Cling 'user' global objects/variables state to the state saved by the last call to TCling::...
const char * MapCppName(const char *) const final
Interface to cling function.
Longptr_t Calc(const char *line, EErrorCode *error=nullptr) final
Directly execute an executable statement (e.g.
Int_t ReloadAllSharedLibraryMaps() final
Reload the library map entries coming from all the loaded shared libraries, after first unloading the...
void UpdateListOfGlobalFunctions() final
No op: see TClingCallbacks (used to update the list of global functions)
void DataMemberInfo_Delete(DataMemberInfo_t *dminfo) const final
const char * GetTopLevelMacroName() const final
Return the file name of the current un-included interpreted file.
void * fPrevLoadedDynLibInfo
void UpdateListOfDataMembers(TClass *cl) const
Update the list of pointers to data members for TClass cl This is now a nop.
void InspectMembers(TMemberInspector &, const void *obj, const TClass *cl, Bool_t isTransient) final
Visit all members over members, recursing over base classes.
Int_t SetClassSharedLibs(const char *cls, const char *libs) final
Register the AutoLoading information for a class.
MethodInfo_t * MethodInfo_FactoryCopy(MethodInfo_t *minfo) const final
std::set< const char * > fParsedPayloadsAddresses
CallFuncIFacePtr_t CallFunc_IFacePtr(CallFunc_t *func) const final
MethodArgInfo_t * MethodArgInfo_Factory() const final
static void UpdateClassInfo(char *name, Long_t tagnum)
No op: see TClingCallbacks.
DeclId_t GetFunction(ClassInfo_t *cl, const char *funcname) final
Return pointer to cling interface function for a method of a class with a certain name.
void ClassInfo_Delete(ClassInfo_t *info) const final
std::unique_ptr< cling::Interpreter > fInterpreter
EDataType ClassInfo_GetUnderlyingType(ClassInfo_t *info) const final
void FuncTempInfo_Delete(FuncTempInfo_t *) const final
Delete the FuncTempInfo_t.
DeclId_t GetFunctionTemplate(ClassInfo_t *cl, const char *funcname) final
Return pointer to cling interface function for a method of a class with a certain name.
Int_t DeleteVariable(const char *name) final
Undeclare obj called name.
Longptr_t DataMemberInfo_Offset(DataMemberInfo_t *dminfo) const final
CallFunc_t * CallFunc_Factory() const final
MethodInfo_t * MethodInfo_Factory() const final
Long_t DataMemberInfo_TypeProperty(DataMemberInfo_t *dminfo) const final
void ClearFileBusy() final
Reset the interpreter internal state in case a previous action was not correctly terminated.
cling::MetaProcessor * GetMetaProcessorImpl() const
bool DiagnoseIfInterpreterException(const std::exception &e) const final
void SetAllocunlockfunc(void(*)()) const final
[Place holder for Mutex Unlock] Provide the interpreter with a way to release a lock used to protect ...
std::set< size_t > fLookedUpClasses
virtual void AddAvailableIndentifiers(TSeqCollection &Idents) final
void TypedefInfo_Delete(TypedefInfo_t *tinfo) const final
void Reset() final
Pressing Ctrl+C should forward here.
const char * TypedefInfo_TrueName(TypedefInfo_t *tinfo) const final
int SetClassAutoLoading(int) const final
Enable/Disable the AutoLoading of libraries.
const char * ClassInfo_FullName(ClassInfo_t *info) const final
UInt_t AutoParseImplRecurse(const char *cls, bool topLevel)
Helper routine for TCling::AutoParse implementing the actual call to the parser and looping over temp...
const char * MethodInfo_TypeName(MethodInfo_t *minfo) const final
void CallFunc_SetArg(CallFunc_t *func, Long_t param) const final
const char * GetIncludePath() final
Refresh the list of include paths known to the interpreter and return it with -I prepended.
void UpdateListsOnUnloaded(const cling::Transaction &T)
Invalidate stored TCling state for declarations included in transaction ‘T’.
void UpdateClassInfoWithDecl(const clang::NamedDecl *ND)
Internal function. Inform a TClass about its new TagDecl or NamespaceDecl.
virtual void Initialize() final
Initialize the interpreter, once TROOT::fInterpreter is set.
int ClassInfo_GetMethodNArg(ClassInfo_t *info, const char *method, const char *proto, Bool_t objectIsConst=false, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch) const final
DeclId_t GetDataMember(ClassInfo_t *cl, const char *name) const final
Return pointer to cling Decl of global/static variable that is located at the address given by addr.
void FuncTempInfo_Name(FuncTempInfo_t *, TString &name) const final
Return the name of this function template.
std::unique_ptr< cling::MetaProcessor > fMetaProcessor
bool TypeInfo_IsValid(TypeInfo_t *tinfo) const final
bool RegisterPrebuiltModulePath(const std::string &FullPath, const std::string &ModuleMapName="module.modulemap") const final
std::string MethodInfo_TypeNormalizedName(MethodInfo_t *minfo) const final
const char * ClassInfo_Name(ClassInfo_t *info) const final
TClass * GenerateTClass(const char *classname, Bool_t emulation, Bool_t silent=kFALSE) final
Generate a TClass for the given class.
ULong64_t fTransactionCount
bool ClassInfo_HasDefaultConstructor(ClassInfo_t *info, Bool_t testio=kFALSE) const final
void EndOfLineAction() final
It calls a "fantom" method to synchronize user keyboard input and ROOT prompt line.
TypeInfo_t * TypeInfo_FactoryCopy(TypeInfo_t *) const final
bool ClassInfo_HasMethod(ClassInfo_t *info, const char *name) const final
void ClassInfo_DeleteArray(ClassInfo_t *info, void *arena, bool dtorOnly) const final
std::map< size_t, std::vector< const char * > > fClassesHeadersMap
const char * DataMemberInfo_TypeTrueName(DataMemberInfo_t *dminfo) const final
virtual void ShutDown() final
void UpdateListOfTypes() final
No op: see TClingCallbacks (used to update the list of types)
Long_t TypedefInfo_Property(TypedefInfo_t *tinfo) const final
void RegisterRdictForLoadPCM(const std::string &pcmFileNameFullPath, llvm::StringRef *pcmContent)
Register Rdict data for future loading by LoadPCM;.
Longptr_t ProcessLineSynch(const char *line, EErrorCode *error=nullptr) final
Let cling process a command line synchronously, i.e we are waiting it will be finished.
TString GetMangledNameWithPrototype(TClass *cl, const char *method, const char *proto, Bool_t objectIsConst=kFALSE, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch) final
Return the cling mangled name for a method of a class with a certain prototype, i....
static void UpdateAllCanvases()
Update all canvases at end the terminal input command.
Int_t LoadLibraryMap(const char *rootmapfile=nullptr) final
Load map between class and library.
Longptr_t BaseClassInfo_Tagnum(BaseClassInfo_t *bcinfo) const final
void LibraryUnloaded(const void *dyLibHandle, const char *canonicalName)
Collection abstract base class.
virtual Int_t GetEntries() const
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
virtual void Add(TObject *obj)=0
TObject * FindObject(const char *name) const override
Find an object in this collection using its name.
Bool_t Contains(const char *name) const
All ROOT classes may have RTTI (run time type identification) support added.
Bool_t IsPersistent() const
Basic data type descriptor (datatype information is obtained from CINT).
EMemberSelection
Kinds of members to include in lists.
TList * GetListOfKeys() const override
TDirectory::TContext keeps track and restore the current directory.
void GetObject(const char *namecycle, T *&ptr)
Get an object with proper type checking.
The TEnumConstant class implements the constants of the enum type.
The TEnum class implements the enum type.
const TSeqCollection * GetConstants() const
static TEnum * GetEnum(const std::type_info &ti, ESearchAction sa=kALoadAndInterpLookup)
DeclId_t GetDeclId() const
const char * GetValue() const
const char * GetName() const override
Returns name of object.
The TEnv class reads config files, by default named .rootrc.
THashList * GetTable() const
Bool_t IgnoreDuplicates(Bool_t ignore)
If set to true, no warnings in case of duplicates are issued.
virtual void SetRcName(const char *name)
virtual Int_t ReadFile(const char *fname, EEnvLevel level)
Read and parse the resource file for a certain level.
virtual void SetValue(const char *name, const char *value, EEnvLevel level=kEnvChange, const char *type=nullptr)
Set the value of a resource or create a new resource.
virtual TEnvRec * Lookup(const char *n) const
Loop over all resource records and return the one with name.
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format.
Global functions class (global functions are obtained from CINT).
Global variables class (global variables are obtained from CINT).
THashList implements a hybrid collection class consisting of a hash table and a list to store TObject...
TObject * Remove(TObject *obj) override
Remove object from the list.
THashTable implements a hash table to store TObject's.
This class defines an abstract interface to a generic command line interpreter.
virtual bool RegisterPrebuiltModulePath(const std::string &FullPath, const std::string &ModuleMapName="module.modulemap") const =0
virtual Bool_t HasPCMForLibrary(const char *libname) const =0
virtual Int_t AutoParse(const char *cls)=0
int(* AutoLoadCallBack_t)(const char *)
virtual const char * GetClassSharedLibs(const char *cls)=0
virtual Bool_t Declare(const char *code)=0
std::vector< std::pair< std::string, int > > FwdDeclArgsToKeepCollection_t
TDictionary::DeclId_t DeclId_t
virtual TObjArray * GetRootMapFiles() const =0
Book space in a file, create I/O buffers, to fill them, (un)compress them.
A collection of TDataMember objects designed for fast access given a DeclId_t and for keep track of T...
TObject * FindObject(const char *name) const override
Specialize FindObject to do search for the a data member just by name or create it if its not already...
TDictionary * Find(DeclId_t id) const
Return (after creating it if necessary) the TDataMember describing the data member corresponding to t...
TClass * GetClass() const
A collection of TEnum objects designed for fast access given a DeclId_t and for keep track of TEnum t...
A collection of TEnum objects designed for fast access given a DeclId_t and for keep track of TEnum t...
TEnum * Find(DeclId_t id) const
Return the TEnum corresponding to the Decl 'id' or NULL if it does not exist.
TEnum * Get(DeclId_t id, const char *name)
Return (after creating it if necessary) the TEnum describing the enum corresponding to the Decl 'id'.
TClass * GetClass() const
A collection of TFunction objects designed for fast access given a DeclId_t and for keep track of TFu...
TFunctionTemplate * Get(DeclId_t id)
Return (after creating it if necessary) the TMethod or TFunction describing the function correspondin...
A collection of TFunction objects designed for fast access given a DeclId_t and for keep track of TFu...
TFunction * Find(DeclId_t id) const
Return the TMethod or TFunction describing the function corresponding to the Decl 'id'.
void Add(TObject *obj) override
TObject * At(Int_t idx) const override
Returns the object at position idx. Returns 0 if idx is out of range.
A TMemFile is like a normal TFile except that it reads and writes only from memory.
Abstract base class for accessing the data-members of a class.
const char * GetParent() const
virtual void Inspect(TClass *cl, const char *parent, const char *name, const void *addr)
EObjectPointerState GetObjectValidity() const
virtual Bool_t IsTreatingNonAccessibleTypes()
void SetObjectValidity(EObjectPointerState val)
void InspectMember(const T &obj, const char *name, Bool_t isTransient)
Each ROOT method (see TMethod) has a linked list of its arguments.
const char * GetFullTypeName() const
Get full type description of method argument, e.g.: "class TDirectory*".
const char * GetDefault() const
Get default value of method argument.
Each ROOT class (see TClass) has a linked list of methods.
virtual TList * GetListOfMethodArgs()
Returns methodarg list and additionally updates fDataMember in TMethod by calling FindDataMember();.
The TNamed class is the base class for all named ROOT classes.
const char * GetName() const override
Returns name of object.
Int_t GetEntriesFast() const
virtual void Expand(Int_t newSize)
Expand or shrink the array to newSize elements.
void Clear(Option_t *option="") override
Remove all objects from the array.
virtual void Compress()
Remove empty slots from array.
Int_t GetEntries() const override
Return the number of objects in array (i.e.
TObject * At(Int_t idx) const override
TObject * Remove(TObject *obj) override
Remove object from array.
TObject * FindObject(const char *name) const override
Find an object in this collection using its name.
void Add(TObject *obj) override
Collectable string class.
Mother of all ROOT objects.
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
R__ALWAYS_INLINE Bool_t IsOnHeap() const
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual TObject * FindObject(const char *name) const
Must be redefined in derived classes.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message.
virtual const char * GetTitle() const
Returns title of object.
virtual TClass * IsA() const
@ kInvalidObject
if object ctor succeeded but object should not be used
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
Persistent version of a TClass.
static const TString & GetBinDir()
Get the binary directory in the installation. Static utility function.
static const TString & GetIncludeDir()
Get the include directory in the installation. Static utility function.
static const char * GetMacroPath()
Get macro search path. Static utility function.
static const std::vector< std::string > & AddExtraInterpreterArgs(const std::vector< std::string > &args)
Provide command line arguments to the interpreter construction.
static const TString & GetEtcDir()
Get the sysconfig directory in the installation. Static utility function.
static const char **& GetExtraInterpreterArgs()
INTERNAL function! Used by rootcling to inject interpreter arguments through a C-interface layer.
static const TString & GetLibDir()
Get the library directory in the installation. Static utility function.
Sequenceable collection abstract base class.
void Add(TObject *obj) override
Describes a persistent version of a class.
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
const char * Data() const
TString & ReplaceAll(const TString &s1, const TString &s2)
Ssiz_t Last(char c) const
Find last occurrence of a character c.
TObjArray * Tokenize(const TString &delim) const
This function is used to isolate sequential tokens in a TString.
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
TString & Prepend(const char *cs)
TString & Remove(Ssiz_t pos)
TString & Append(const char *cs)
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
virtual void FreeDirectory(void *dirp)
Free a directory.
virtual void * OpenDirectory(const char *name)
Open a directory. Returns 0 if directory does not exist.
virtual const char * Getenv(const char *env)
Get environment variable.
virtual const char * GetIncludePath()
Get the list of include path.
virtual TString SplitAclicMode(const char *filename, TString &mode, TString &args, TString &io) const
This method split a filename of the form:
virtual char * ConcatFileName(const char *dir, const char *name)
Concatenate a directory and a file name. User must delete returned string.
virtual const char * FindFile(const char *search, TString &file, EAccessMode mode=kFileExists)
Find location of file in a search path.
virtual int Load(const char *module, const char *entry="", Bool_t system=kFALSE)
Load a shared library.
int GetPathInfo(const char *path, Long_t *id, Long_t *size, Long_t *flags, Long_t *modtime)
Get info about a file: id, size, flags, modification time.
virtual const char * PrependPathName(const char *dir, TString &name)
Concatenate a directory and a file name.
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
virtual const char * GetDirEntry(void *dirp)
Get a directory entry. Returns 0 if no more entries.
virtual int GetProcInfo(ProcInfo_t *info) const
Returns cpu and memory used by this process into the ProcInfo_t structure.
virtual const char * BaseName(const char *pathname)
Base name of a file name. Base name of /user/root is root.
virtual const char * GetDynamicPath()
Return the dynamic path (used to find shared libraries).
virtual const char * FindDynamicLibrary(TString &lib, Bool_t quiet=kFALSE)
Find a dynamic library using the system search paths.
virtual void Sleep(UInt_t milliSec)
Sleep milliSec milli seconds.
virtual int CompileMacro(const char *filename, Option_t *opt="", const char *library_name="", const char *build_dir="", UInt_t dirmode=0)
This method compiles and loads a shared library containing the code from the file "filename".
virtual const char * WorkingDirectory()
Return working directory.
virtual char * Which(const char *search, const char *file, EAccessMode mode=kFileExists)
Find location of file in a search path.
virtual void Setenv(const char *name, const char *value)
Set environment variable.
virtual const char * HomeDirectory(const char *userName=nullptr)
Return the user's home directory.
virtual TString GetDirName(const char *pathname)
Return the directory name in pathname.
virtual void StackTrace()
Print a stack trace.
char * DynamicPathName(const char *lib, Bool_t quiet=kFALSE)
Find a dynamic library called lib using the system search paths.
virtual TVirtualMutex * Factory(Bool_t=kFALSE)=0
TVirtualPad is an abstract base class for the Pad and Canvas classes.
static void SetFactory(TVirtualStreamerInfo *factory)
static function: Set the StreamerInfo factory
@ kNeedObjectForVirtualBaseClass
const std::string & GetPathSeparator()
const char & GetEnvPathSeparator()
bool CanConvertEnvValueToBool(const std::string &value)
bool ConvertEnvValueToBool(const std::string &value)
This file contains a specialised ROOT message handler to test for diagnostic in unit tests.
R__EXTERN TVirtualRWMutex * gCoreMutex
bool IsStdPairBase(std::string_view name)
bool IsStdArray(std::string_view name)
bool IsStdClass(const char *type)
return true if the class belongs to the std namespace
bool IsStdPair(std::string_view name)
std::string InsertStd(const char *tname)
std::string GetLong64_Name(const char *original)
Replace 'long long' and 'unsigned long long' by 'Long64_t' and 'ULong64_t'.
char * DemangleTypeIdName(const std::type_info &ti, int &errorCode)
Demangle in a portable way the type id name.
const char * GetUnqualifiedName(const char *name)
Return the start of the unqualified name include in 'original'.
void Init(TClassEdit::TInterpreterLookupHelper *helper)
ROOT::ESTLType IsSTLCont(std::string_view type)
type : type name: vector<list<classA,allocator>,allocator> result: 0 : not stl container code of cont...
char * DemangleName(const char *mangled_name, int &errorCode)
int GetSplit(const char *type, std::vector< std::string > &output, int &nestedLoc, EModType mode=TClassEdit::kNone)
Stores in output (after emptying it) the split type.
EComplexType GetComplexType(const char *)
RAII used to store Parser, Sema, Preprocessor state for recursive parsing.
std::vector< std::string > fElements
void ShortType(std::string &answer, int mode)
Return the absolute type of typeDesc into the string answ.
std::unique_ptr< ROOT::TVirtualRWMutex::State > fState
State of gCoreMutex when the first interpreter-related function was invoked.
Int_t fRecurseCount
Interpreter-related functions will push the "entry" lock state to *this.
A read-only memory range which we do not control.