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>
151#define R__DLLEXPORT __attribute__ ((visibility ("default")))
159#include <mach-o/dyld.h>
160#include <mach-o/loader.h>
167#if defined(R__LINUX) || defined(R__FBSD)
174#if defined(__CYGWIN__)
175#include <sys/cygwin.h>
176#define HMODULE void *
178 __declspec(dllimport)
void * __stdcall GetCurrentProcess();
179 __declspec(dllimport)
bool __stdcall EnumProcessModules(
void *,
void **,
unsigned long,
unsigned long *);
180 __declspec(dllimport)
unsigned long __stdcall GetModuleFileNameExW(
void *,
void *,
wchar_t *,
unsigned long);
187# define STDIN_FILENO 0
190# define STDOUT_FILENO 1
193# define STDERR_FILENO 2
203#undef GetModuleFileName
204#define RTLD_DEFAULT ((void *)::GetModuleHandle(NULL))
205#define dlsym(library, function_name) ::GetProcAddress((HMODULE)library, function_name)
206#define dlopen(library_name, flags) ::LoadLibraryA(library_name)
207#define dlclose(library) ::FreeLibrary((HMODULE)library)
208#define R__DLLEXPORT __declspec(dllexport)
216 return D->getDeclContext();
219 return llvm::dyn_cast<clang::NamespaceDecl>(DC);
222 return llvm::dyn_cast<clang::RecordDecl>(DC);
225 return DC->dumpDeclContext();
234 return ((clang::Decl*)D)->dump();
237 if (clang::NamedDecl* ND = llvm::dyn_cast<clang::NamedDecl>(D)) {
240 llvm::raw_string_ostream OS(
name);
241 ND->getNameForDiagnostic(OS, D->getASTContext().getPrintingPolicy(),
244 printf(
"%s\n",
name.c_str());
252 return D->isInvalidDecl();
256 assert(info && info->
IsValid());
257 return info->
GetDecl()->isInvalidDecl();
260using std::string, std::vector;
261using namespace clang;
265 static const std::string gInterpreterClassDef = R
"ICF(
267#define ClassDef(name, id) \
268_ClassDefInterp_(name,id,virtual,) \
269static int DeclFileLine() { return __LINE__; }
271#define ClassDefNV(name, id) \
272_ClassDefInterp_(name,id,,) \
273static int DeclFileLine() { return __LINE__; }
274#undef ClassDefOverride
275#define ClassDefOverride(name, id) \
276_ClassDefInterp_(name,id,,override) \
277static int DeclFileLine() { return __LINE__; }
280 static const std::string gNonInterpreterClassDef = R
"ICF(
281#define __ROOTCLING__ 1
283#define ClassDef(name,id) \
284_ClassDefOutline_(name,id,virtual,) \
285static int DeclFileLine() { return __LINE__; }
287#define ClassDefNV(name, id)\
288_ClassDefOutline_(name,id,,)\
289static int DeclFileLine() { return __LINE__; }
290#undef ClassDefOverride
291#define ClassDefOverride(name, id)\
292_ClassDefOutline_(name,id,,override)\
293static int DeclFileLine() { return __LINE__; }
297 static const std::string gClassDefInterpMacro = R
"ICF(
300#define _ClassDefInterp_(name,id,virtual_keyword, overrd) \
303 static TClass *Class() { static TClass* sIsA = 0; if (!sIsA) sIsA = TClass::GetClass(#name); return sIsA; } \
304 static const char *Class_Name() { return #name; } \
305 virtual_keyword Bool_t CheckTObjectHashConsistency() const overrd { return true; } \
306 static Version_t Class_Version() { return id; } \
307 static TClass *Dictionary() { return 0; } \
308 virtual_keyword TClass *IsA() const overrd { return name::Class(); } \
309 virtual_keyword void ShowMembers(TMemberInspector&insp) const overrd { ::ROOT::Class_ShowMembers(name::Class(), this, insp); } \
310 virtual_keyword void Streamer(TBuffer&) overrd { ::Error("Streamer", "Cannot stream interpreted class."); } \
311 void StreamerNVirtual(TBuffer&ClassDef_StreamerNVirtual_b) { name::Streamer(ClassDef_StreamerNVirtual_b); } \
312 static const char *DeclFileName() { return __FILE__; } \
313 static int ImplFileLine() { return 0; } \
314 static const char *ImplFileName() { return __FILE__; }
335 return gSystem->Load(library,
"",
false);
353 return ((
TCling*)
gCling)->LibraryLoadingFailed(errmessage, libStem, permanent, resolved);
392 static vector<const NamedDecl*> updateList;
395 if (entered) topLevel =
kFALSE;
410 updateList.push_back(TD);
413 while (!updateList.empty()) {
415 updateList.pop_back();
422 const clang::Decl* D =
static_cast<const clang::Decl*
>(enumObj->
GetDeclId());
423 if(
const clang::EnumDecl* ED = dyn_cast<clang::EnumDecl>(D)) {
425 for (EnumDecl::enumerator_iterator EDI = ED->enumerator_begin(),
426 EDE = ED->enumerator_end(); EDI != EDE; ++EDI) {
428 std::string constbuf;
429 if (
const NamedDecl* END = llvm::dyn_cast<NamedDecl>(*EDI)) {
430 PrintingPolicy Policy((*EDI)->getASTContext().getPrintingPolicy());
431 llvm::raw_string_ostream stream(constbuf);
433 Policy.AnonymousTagLocations =
false;
434 (END)->getNameForDiagnostic(stream, Policy,
false);
436 const char* constantName = constbuf.c_str();
440 const llvm::APSInt valAPSInt = (*EDI)->getInitVal();
441 if (valAPSInt.isSigned()) {
442 value = valAPSInt.getSExtValue();
444 value = valAPSInt.getZExtValue();
451 DataMemberInfo_t* dmInfo = (DataMemberInfo_t*) tcDmInfo;
462 globals->
Add(enumConstant);
474 TEnum* enumType =
nullptr;
475 const clang::Decl* D =
static_cast<const clang::Decl*
>(VD);
477 if (
const EnumDecl* ED = llvm::dyn_cast<EnumDecl>(D)) {
479 PrintingPolicy Policy(ED->getASTContext().getPrintingPolicy());
480 llvm::raw_string_ostream stream(buf);
482 Policy.AnonymousTagLocations =
false;
483 ED->getNameForDiagnostic(stream, Policy,
false);
489 const char*
name = buf.c_str();
500 const clang::Decl* D =
static_cast<const clang::Decl*
>(DV);
502 if (!D->isCanonicalDecl() && !isa<clang::NamespaceDecl>(D)
503 && !dyn_cast<clang::RecordDecl>(D))
return;
505 if (isa<clang::FunctionDecl>(D->getDeclContext())
506 || isa<clang::TagDecl>(D->getDeclContext()))
510 if (
const clang::CXXRecordDecl* RD = dyn_cast<clang::CXXRecordDecl>(D)) {
511 if (RD->getDescribedClassTemplate())
513 }
else if (
const clang::FunctionDecl* FD = dyn_cast<clang::FunctionDecl>(D)) {
514 if (FD->getDescribedFunctionTemplate())
518 if (
const RecordDecl *TD = dyn_cast<RecordDecl>(D)) {
519 if (TD->isCanonicalDecl() || TD->isThisDeclarationADefinition())
522 else if (
const NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
524 if (
const TagDecl *TD = dyn_cast<TagDecl>(D)) {
528 }
else if (
const NamespaceDecl* NSD = dyn_cast<NamespaceDecl>(D)) {
533 if (!isa<TranslationUnitDecl>(ND->getDeclContext()))
537 if (isa<EnumDecl>(ND))
542 if (!(isa<VarDecl>(ND)))
546 if (
gROOT->GetListOfGlobals()->FindObject(ND->getNameAsString().c_str()))
550 gROOT->GetListOfGlobals()->Add(
new TGlobal((DataMemberInfo_t *)
552 cast<ValueDecl>(ND),
nullptr)));
584 const char* canonicalName) {
585 ((
TCling*)
gCling)->LibraryLoaded(dyLibHandle, canonicalName);
590 ((
TCling *)
gCling)->RegisterRdictForLoadPCM(pcmFileNameFullPath, pcmContent);
594 const char* canonicalName) {
595 ((
TCling*)
gCling)->LibraryUnloaded(dyLibHandle, canonicalName);
601 return ((
TCling*)
gCling)->GetObjectAddress(Name, LookupCtx);
611 auto tcling =
new TCling(
"C++",
"cling C++ Interpreter", argv, interpLibHandle);
635 return ((
TCling*)
gCling)->GetClassSharedLibs(className);
641 return ((
TCling*)
gCling)->IsAutoLoadNamespaceCandidate(nsDecl);
646 string file(fileName);
648 return gSystem->CompileMacro(file.c_str(), opt.c_str());
652 string &args,
string &io,
string &fname)
654 string file(fileName);
655 TString f, amode, arguments, aclicio;
656 f =
gSystem->SplitAclicMode(file.c_str(), amode, arguments, aclicio);
658 io = aclicio.
Data(); fname =
f.Data();
668 char *__unDName(
char *demangled,
const char *mangled,
int out_len,
669 void * (* pAlloc )(
size_t),
void (* pFree )(
void *),
670 unsigned short int flags);
682 using namespace clang;
683 if (NamespaceDecl* nsd = llvm::dyn_cast<NamespaceDecl>(decl)){
687 if (ClassTemplateDecl* ctd = llvm::dyn_cast<ClassTemplateDecl>(decl)){
700 const std::vector<std::string> &headers,
701 const std::vector<std::string> &fwdDecls,
702 const std::vector<std::string> &unknown)
708 if (classes.empty()) {
712 const std::string& className = classes[0];
714 TString fileName =
"AutoDict_";
715 std::string::const_iterator sIt;
716 for (sIt = className.begin(); sIt != className.end(); ++sIt) {
717 if (*sIt ==
'<' || *sIt ==
'>' ||
718 *sIt ==
' ' || *sIt ==
'*' ||
719 *sIt ==
',' || *sIt ==
'&' ||
727 if (classes.size() > 1) {
729 std::vector<std::string>::const_iterator it = classes.begin();
730 while ((++it) != classes.end()) {
732 chk = chk * 3 + it->at(
cursor);
738 if (
gSystem->AccessPathName(fileName) != 0) {
745 static const std::set<std::string> sSTLTypes {
746 "vector",
"list",
"forward_list",
"deque",
"map",
"unordered_map",
"multimap",
747 "unordered_multimap",
"set",
"unordered_set",
"multiset",
"unordered_multiset",
748 "queue",
"priority_queue",
"stack",
"iterator"};
749 std::vector<std::string>::const_iterator it;
750 std::string fileContent(
"");
751 for (it = headers.begin(); it != headers.end(); ++it) {
752 fileContent +=
"#include \"" + *it +
"\"\n";
754 for (it = unknown.begin(); it != unknown.end(); ++it) {
760 while (dirbase.
Length() && dirbase !=
"."
761 && dirbase !=
"include" && dirbase !=
"inc"
762 && dirbase !=
"prec_stl") {
763 gSystem->PrependPathName(dirbase, header);
764 dir =
gSystem->GetDirName(dir);
766 fileContent +=
TString(
"#include \"") + header +
"\"\n";
769 for (it = fwdDecls.begin(); it != fwdDecls.end(); ++it) {
770 fileContent +=
"class " + *it +
";\n";
772 fileContent +=
"#ifdef __CLING__ \n";
773 fileContent +=
"#pragma link C++ nestedclasses;\n";
774 fileContent +=
"#pragma link C++ nestedtypedefs;\n";
775 for (it = classes.begin(); it != classes.end(); ++it) {
777 size_t posTemplate =
n.find(
'<');
778 std::set<std::string>::const_iterator iSTLType = sSTLTypes.end();
779 if (posTemplate != std::string::npos) {
780 n.erase(posTemplate, std::string::npos);
781 if (
n.compare(0, 5,
"std::") == 0) {
784 iSTLType = sSTLTypes.find(
n);
786 fileContent +=
"#pragma link C++ class ";
787 fileContent += *it +
"+;\n" ;
788 fileContent +=
"#pragma link C++ class ";
789 if (iSTLType != sSTLTypes.end()) {
793 fileContent += *it +
"::*;\n" ;
798 fileContent += *it +
"::*+;\n" ;
801 fileContent +=
"#endif\n";
805 filePointer = fopen(fileName,
"w");
806 if (filePointer ==
nullptr) {
812 fprintf(filePointer,
"%s", fileContent.c_str());
828 const std::vector<std::string> &headers,
829 const std::vector<std::string> &fwdDecls,
830 const std::vector<std::string> &unknown)
836 std::vector<std::string> classes;
837 classes.push_back(className);
865 void exceptionErrorHandler(
void * ,
868 throw std::runtime_error(std::string(
">>> Interpreter compilation error:\n") + reason);
882 class clangDiagSuppr {
884 clangDiagSuppr(clang::DiagnosticsEngine& diag): fDiagEngine(diag){
885 fOldDiagValue = fDiagEngine.getIgnoreAllWarnings();
886 fDiagEngine.setIgnoreAllWarnings(
true);
890 fDiagEngine.setIgnoreAllWarnings(fOldDiagValue);
893 clang::DiagnosticsEngine& fDiagEngine;
916 if (strncmp(tname.c_str(),
"const ", 6) == 0) {
919 unsigned long end = tname.length();
920 while( end && (tname[end-1]==
'&' || tname[end-1]==
'*' || tname[end-1]==
']') ) {
921 if ( tname[end-1]==
']' ) {
923 while ( end && tname[end-1]!=
'[' ) --end;
927 std::string innerbuf;
929 if (end != tname.length()) {
931 inner = innerbuf.c_str();
933 inner = tname.c_str()+
offset;
937 if (
gROOT->GetListOfClasses()->FindObject(inner)
947 const char *newname =
type->GetFullTypeName();
949 newname =
"Long64_t";
951 newname =
"ULong64_t";
953 if (strcmp(inner,newname) == 0) {
958 if ( end != tname.length() ) {
959 result += tname.substr(end,tname.length()-end);
967 if (lastPos != inner)
971 const auto enName = lastPos;
972 const auto scopeNameSize = ((
Long64_t)lastPos - (
Long64_t)inner) /
sizeof(
decltype(*lastPos)) - 2;
973 char *scopeName =
new char[scopeNameSize + 1];
974 strncpy(scopeName, inner, scopeNameSize);
975 scopeName[scopeNameSize] =
'\0';
977 if (
auto scope =
static_cast<TClass *
>(
gROOT->GetListOfClasses()->FindObject(scopeName))) {
978 auto enumTable =
dynamic_cast<const THashList *
>(scope->GetListOfEnums(
false));
979 if (enumTable && enumTable->THashList::FindObject(enName)) {
delete [] scopeName;
return true; }
983 auto listOfEnums = scope->GetListOfEnums();
985 auto enumTable =
dynamic_cast<const THashList *
>(listOfEnums);
986 if (enumTable && enumTable->THashList::FindObject(enName)) {
delete [] scopeName;
return true; }
993 auto enumTable =
dynamic_cast<const THashList *
>(
gROOT->GetListOfEnums());
994 if (enumTable && enumTable->THashList::FindObject(inner))
return true;
997 if (
gCling->GetClassSharedLibs(inner))
1039static bool LoadModule(
const std::string &ModuleName, cling::Interpreter &interp)
1048 std::string currentDir =
gSystem->WorkingDirectory();
1049 assert(!currentDir.empty());
1050 gCling->RegisterPrebuiltModulePath(currentDir);
1052 ::Info(
"TCling::__LoadModule",
"Preloading module %s. \n",
1053 ModuleName.c_str());
1055 return interp.loadModule(ModuleName,
true);
1061static void LoadModules(
const std::vector<std::string> &modules, cling::Interpreter &interp)
1063 for (
const auto &modName : modules)
1069 const static bool foundSymbol = dlsym(RTLD_DEFAULT,
"usedToIdentifyRootClingByDlSym");
1074static bool HasASTFileOnDisk(clang::Module *M,
const clang::Preprocessor &PP, std::string *FullFileName =
nullptr)
1076 const HeaderSearchOptions &HSOpts = PP.getHeaderSearchInfo().getHeaderSearchOpts();
1078 std::string ModuleFileName;
1079 if (!HSOpts.PrebuiltModulePaths.empty())
1081 ModuleFileName = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(M->Name);
1083 *FullFileName = ModuleFileName;
1085 return !ModuleFileName.empty();
1091 CompilerInstance &CI = *interp.getCI();
1092 Preprocessor &PP = CI.getPreprocessor();
1093 auto ModuleManager = CI.getASTReader();
1094 assert(ModuleManager);
1099 if (ModuleIndexPath.empty())
1102 ModuleManager->resetForReload();
1103 ModuleManager->loadGlobalIndex();
1104 GlobalModuleIndex *GlobalIndex = ModuleManager->getGlobalIndex();
1109 ModuleMap &MMap = PP.getHeaderSearchInfo().getModuleMap();
1110 bool RecreateIndex =
false;
1111 for (ModuleMap::module_iterator
I = MMap.module_begin(), E = MMap.module_end();
I != E; ++
I) {
1112 Module *TheModule =
I->second;
1117 RecreateIndex =
true;
1119 if (RecreateIndex) {
1120 cling::Interpreter::PushTransactionRAII deserRAII(&interp);
1121 clang::GlobalModuleIndex::UserDefinedInterestingIDs IDs;
1123 struct DefinitionFinder :
public RecursiveASTVisitor<DefinitionFinder> {
1124 DefinitionFinder(clang::GlobalModuleIndex::UserDefinedInterestingIDs& IDs,
1125 clang::TranslationUnitDecl* TU) : DefinitionIDs(IDs) {
1128 bool VisitNamedDecl(NamedDecl *ND) {
1129 if (!ND->isFromASTFile())
1131 if (!ND->getIdentifier())
1134 if (ND->getAccess() == AS_protected || ND->getAccess() == AS_private)
1137 if (TagDecl *TD = llvm::dyn_cast<TagDecl>(ND)) {
1138 if (TD->isCompleteDefinition())
1140 }
else if (NamespaceDecl *NSD = llvm::dyn_cast<NamespaceDecl>(ND)) {
1141 Register(NSD,
false);
1143 else if (TypedefNameDecl *TND = dyn_cast<TypedefNameDecl>(ND))
1149 clang::GlobalModuleIndex::UserDefinedInterestingIDs &DefinitionIDs;
1150 void Register(
const NamedDecl* ND,
bool AddSingleEntry =
true) {
1151 assert(ND->isFromASTFile());
1154 if (!ND->hasOwningModule()) {
1156 SourceManager &SM = ND->getASTContext().getSourceManager();
1157 SourceLocation Loc = ND->getLocation();
1158 const FileEntry *FE = SM.getFileEntryForID(SM.getFileID(Loc));
1160 assert(FE->getName().contains(
"input_line_"));
1165 Module *OwningModule = ND->getOwningModule()->getTopLevelModule();
1166 assert(OwningModule);
1167 assert(!ND->getName().empty() &&
"Empty name");
1168 if (AddSingleEntry && DefinitionIDs.count(ND->getName()))
1174 DefinitionIDs[ND->getName()].push_back(OwningModule->getASTFile());
1177 DefinitionFinder defFinder(IDs, CI.getASTContext().getTranslationUnitDecl());
1179 llvm::cantFail(GlobalModuleIndex::writeIndex(CI.getFileManager(),
1180 CI.getPCHContainerReader(),
1183 ModuleManager->resetForReload();
1184 ModuleManager->loadGlobalIndex();
1185 GlobalIndex = ModuleManager->getGlobalIndex();
1194 if (!clingInterp.getCI()->getLangOpts().Modules)
1198 cling::Interpreter::PushTransactionRAII deserRAII(&clingInterp);
1216 LoadModule(
"_Builtin_intrinsics", clingInterp);
1220 std::vector<std::string> CoreModules = {
"ROOT_Foundation_C",
1223 "ROOT_Foundation_Stage1_NoRTTI",
1232 std::vector<std::string> CommonModules = {
"MathCore"};
1238 std::vector<std::string> FIXMEModules = {
"Hist"};
1239 clang::CompilerInstance &CI = *clingInterp.getCI();
1240 clang::Preprocessor &PP = CI.getPreprocessor();
1241 ModuleMap &MMap = PP.getHeaderSearchInfo().getModuleMap();
1242 if (MMap.findModule(
"RInterface"))
1243 FIXMEModules.push_back(
"RInterface");
1247 GlobalModuleIndex *GlobalIndex =
nullptr;
1251 GlobalIndex = CI.getASTReader()->getGlobalIndex();
1253 llvm::StringSet<> KnownModuleFileNames;
1255 GlobalIndex->getKnownModuleFileNames(KnownModuleFileNames);
1257 std::vector<std::string> PendingModules;
1258 PendingModules.reserve(256);
1259 for (
auto I = MMap.module_begin(), E = MMap.module_end();
I != E; ++
I) {
1260 clang::Module *M =
I->second;
1264 std::string FullASTFilePath;
1268 if (GlobalIndex && KnownModuleFileNames.count(FullASTFilePath))
1271 if (M->IsUnimportable)
1279 if (std::find(CoreModules.begin(), CoreModules.end(), M->Name) != CoreModules.end())
1287 PendingModules.push_back(M->Name);
1294 assert(clingInterp.getMacro(
"gROOT") &&
"Couldn't load gROOT macro?");
1298 clingInterp.declare(R
"CODE(
1310 std::string PreIncludes;
1311 bool hasCxxModules = clingInterp.getCI()->getLangOpts().Modules;
1317 PreIncludes +=
"#include \"RtypesCore.h\"\n";
1320 PreIncludes +=
"#include \"Rtypes.h\"\n";
1322 PreIncludes += gClassDefInterpMacro +
"\n"
1323 + gInterpreterClassDef +
"\n"
1325 "#define ClassImp(X);\n";
1328 PreIncludes +=
"#include <string>\n";
1333 PreIncludes +=
"#include <cassert>\n";
1335 PreIncludes +=
"using namespace std;\n";
1336 clingInterp.declare(PreIncludes);
1356#ifdef R__USE_CXXMODULES
1360 llvm::install_fatal_error_handler(&exceptionErrorHandler);
1364 std::vector<std::string> clingArgsStorage;
1365 clingArgsStorage.push_back(
"cling4root");
1366 for (
const char*
const* arg = argv; *arg; ++arg)
1367 clingArgsStorage.push_back(*arg);
1370 if (!fromRootCling) {
1375 clingArgsStorage.push_back(
"-I" + interpInclude);
1378 clingArgsStorage.push_back(
"-I" + interpInclude +
"/cling");
1381 clingArgsStorage.push_back(
"-I" + interpInclude +
"/cling/plugins/include");
1392 std::string pchFilename = interpInclude +
"/allDict.cxx.pch";
1393 if (
gSystem->Getenv(
"ROOT_PCH")) {
1394 pchFilename =
gSystem->Getenv(
"ROOT_PCH");
1397 clingArgsStorage.push_back(
"-include-pch");
1398 clingArgsStorage.push_back(pchFilename);
1401 clingArgsStorage.push_back(
"-Wno-undefined-inline");
1402 clingArgsStorage.push_back(
"-fsigned-char");
1403 clingArgsStorage.push_back(
"-fsized-deallocation");
1408 clingArgsStorage.push_back(
"-O1");
1411 clingArgsStorage.push_back(
"-mllvm");
1412 clingArgsStorage.push_back(
"-optimize-regalloc=0");
1417 std::optional<std::string> EnvOpt = llvm::sys::Process::GetEnv(
"EXTRA_CLING_ARGS");
1418 if (EnvOpt.has_value()) {
1419 StringRef Env(*EnvOpt);
1420 while (!Env.empty()) {
1422 std::tie(Arg, Env) = Env.split(
' ');
1423 clingArgsStorage.push_back(Arg.str());
1427 auto GetEnvVarPath = [](
const std::string &EnvVar, std::vector<std::string> &Paths) {
1428 std::optional<std::string> EnvOpt = llvm::sys::Process::GetEnv(EnvVar);
1429 if (EnvOpt.has_value()) {
1430 StringRef Env(*EnvOpt);
1431 while (!Env.empty()) {
1434 if (std::find(Paths.begin(), Paths.end(), Arg.str()) == Paths.end())
1435 Paths.push_back(Arg.str());
1441 std::vector<std::string> Paths;
1446 GetEnvVarPath(
"CLING_PREBUILT_MODULE_PATH", Paths);
1447 std::string EnvVarPath;
1448 for (
const std::string& P : Paths)
1451 gSystem->Setenv(
"CLING_PREBUILT_MODULE_PATH", EnvVarPath.c_str());
1455 EnvOpt = llvm::sys::Process::GetEnv(
"ROOT_CLING_TIMING");
1456 if (EnvOpt.has_value())
1457 clingArgsStorage.push_back(
"-ftime-report");
1464 std::vector<std::string> ModuleMaps;
1467 GetEnvVarPath(
"CLING_MODULEMAP_FILES", ModuleMaps);
1469 std::string cwd =
gSystem->WorkingDirectory();
1471 if (llvm::sys::fs::exists(cwd + ModuleMapSuffix))
1472 ModuleMaps.push_back(cwd + ModuleMapSuffix);
1474 for (
const std::string& M : ModuleMaps)
1475 clingArgsStorage.push_back(
"-fmodule-map-file=" + M);
1477 std::string ModulesCachePath;
1478 EnvOpt = llvm::sys::Process::GetEnv(
"CLING_MODULES_CACHE_PATH");
1479 if (EnvOpt.has_value()){
1480 StringRef Env(*EnvOpt);
1481 assert(llvm::sys::fs::exists(Env) &&
"Path does not exist!");
1482 ModulesCachePath = Env.str();
1487 clingArgsStorage.push_back(
"-fmodules-cache-path=" + ModulesCachePath);
1490 std::vector<const char*> interpArgs;
1491 for (std::vector<std::string>::const_iterator iArg = clingArgsStorage.begin(),
1492 eArg = clingArgsStorage.end(); iArg != eArg; ++iArg)
1493 interpArgs.push_back(iArg->c_str());
1500 if (!fromRootCling) {
1502 interpArgs.push_back(
"-fmodules");
1503 interpArgs.push_back(
"-fno-implicit-module-maps");
1507 interpArgs.push_back(
"-Rmodule-build");
1513 interpArgs.push_back(
"-fno-autolink");
1518 interpArgs.push_back(
"-ffast-math");
1524 extraArgs && *extraArgs; ++extraArgs) {
1525 if (!strcmp(*extraArgs,
"-resource-dir")) {
1527 llvmResourceDir = *(++extraArgs);
1529 interpArgs.push_back(*extraArgs);
1533 std::vector<std::string> _empty;
1535 for (
const auto &arg: args)
1536 interpArgs.emplace_back(arg.c_str());
1539 cling::Interpreter::ModuleFileExtensions extensions;
1540 EnvOpt = llvm::sys::Process::GetEnv(
"ROOTDEBUG_RDICT");
1541 if (!EnvOpt.has_value())
1542 extensions.push_back(std::make_shared<TClingRdictModuleFileExtension>());
1544 fInterpreter = std::make_unique<cling::Interpreter>(interpArgs.size(),
1546 llvmResourceDir, extensions,
1550 fInterpreter->getCI()->getPreprocessorOpts().DisablePCHOrModuleValidation =
1551 DisableValidationForModuleKind::All;
1555 fInterpreter->getCI()->getLangOpts().SpellChecking =
false;
1558 auto isModulesArg = [](
const char* arg) {
return !strcmp(arg,
"-fmodules"); };
1559 bool hasModulesArg = std::find_if(interpArgs.begin(), interpArgs.end(), isModulesArg) != interpArgs.end();
1560 fInterpreter->getCI()->getLangOpts().Modules = hasModulesArg;
1565 static llvm::raw_fd_ostream fMPOuts (STDOUT_FILENO,
false);
1585 if (!fromRootCling) {
1590 fInterpreter->getRuntimeOptions().AllowRedefinition = 1;
1591 auto &Policy =
const_cast<clang::PrintingPolicy &
>(
fInterpreter->getCI()->getASTContext().getPrintingPolicy());
1595 Policy.SplitTemplateClosers =
true;
1597 Policy.SuppressDefaultTemplateArgs =
false;
1603 std::unique_ptr<TClingCallbacks>
1609 if (!fromRootCling) {
1610 cling::DynamicLibraryManager& DLM = *
fInterpreter->getDynamicLibraryManager();
1615 auto ShouldPermanentlyIgnore = [](llvm::StringRef FileName) ->
bool{
1616 llvm::StringRef stem = llvm::sys::path::stem(FileName);
1617 return stem.startswith(
"libNew") || stem.startswith(
"libcppyy_backend");
1620 DLM.initializeDyld(ShouldPermanentlyIgnore);
1658 assert(
GetRootMapFiles() ==
nullptr &&
"Must be called before LoadLibraryMap!");
1677 auto setFactory = []() {
1681 static bool doneFactory = setFactory();
1693 if (llvm::sys::fs::exists(pcmFileNameFullPath)) {
1694 ::Error(
"TCling::RegisterRdictForLoadPCM",
"Rdict '%s' is both in Module extension and in File system.", pcmFileNameFullPath.c_str());
1712 if (listOfKeys && ((listOfKeys->GetSize() == 0) ||
1713 ((listOfKeys->GetSize() == 1) &&
1714 !strcmp(((
TKey *)listOfKeys->At(0))->GetName(),
"EMPTY")
1721 ::Info(
"TCling::LoadPCMImpl",
"reading protoclasses for %s \n", pcmFile.
GetName());
1727 auto listOfGlobals =
gROOT->GetListOfGlobals();
1728 auto listOfEnums =
dynamic_cast<THashList *
>(
gROOT->GetListOfEnums());
1730 for (
auto selEnum : *enums) {
1731 const char *enumScope = selEnum->GetTitle();
1732 const char *enumName = selEnum->GetName();
1733 if (strcmp(enumScope,
"") == 0) {
1736 if (!listOfEnums->THashList::FindObject(enumName)) {
1737 ((
TEnum *)selEnum)->SetClass(
nullptr);
1738 listOfEnums->Add(selEnum);
1740 for (
auto enumConstant : *
static_cast<TEnum *
>(selEnum)->GetConstants()) {
1741 if (!listOfGlobals->FindObject(enumConstant)) {
1742 listOfGlobals->Add(enumConstant);
1749 if (!nsTClassEntry) {
1752 auto listOfEnums = nsTClassEntry->
fEnums.load();
1763 if (listOfEnums && !listOfEnums->THashList::FindObject(enumName)) {
1764 ((
TEnum *)selEnum)->SetClass(nsTClassEntry);
1765 listOfEnums->Add(selEnum);
1773 pcmFile.
GetObject(
"__ProtoClasses", protoClasses);
1776 for (
auto obj : *protoClasses) {
1786 for (
auto proto : *protoClasses) {
1794 ::Error(
"TCling::LoadPCM",
"Inconsistent TClassTable for %s",
proto->GetName());
1805 protoClasses->Clear();
1806 delete protoClasses;
1810 pcmFile.
GetObject(
"__Typedefs", dataTypes);
1812 for (
auto typedf : *dataTypes)
1813 gROOT->GetListOfTypes()->Add(typedf);
1827 assert(!pcmFileNameFullPath.empty());
1828 assert(llvm::sys::path::is_absolute(pcmFileNameFullPath));
1831 TString pcmFileName = pcmFileNameFullPath;
1839 llvm::SaveAndRestore<Int_t> SaveGDebug(
gDebug);
1842 ::Info(
"TCling::LoadPCM",
"Loading ROOT PCM %s", pcmFileName.
Data());
1847 if (llvm::sys::fs::is_symlink_file(pcmFileNameFullPath))
1852 llvm::StringRef pcmContent = pendingRdict->second;
1854 std::string RDictFileOpts = pcmFileNameFullPath +
"?filetype=pcm";
1855 TMemFile pcmMemFile(RDictFileOpts.c_str(), range);
1870 if (!llvm::sys::fs::exists(pcmFileNameFullPath)) {
1871 ::Error(
"TCling::LoadPCM",
"ROOT PCM %s file does not exist",
1872 pcmFileNameFullPath.data());
1875 ::Info(
"TCling::LoadPCM",
"In-memory ROOT PCM candidate %s\n",
1876 rdict.first.c_str());
1880 if (!
gROOT->IsRootFile(pcmFileName)) {
1881 Fatal(
"LoadPCM",
"The file %s is not a ROOT as was expected\n", pcmFileName.
Data());
1884 TFile pcmFile(pcmFileName +
"?filetype=pcm",
"READ");
1891 using namespace clang;
1893 class ExtLexicalStorageAdder:
public RecursiveASTVisitor<ExtLexicalStorageAdder>{
1898 bool VisitRecordDecl(clang::RecordDecl* rcd){
1900 Info(
"ExtLexicalStorageAdder",
1901 "Adding external lexical storage to class %s",
1902 rcd->getNameAsString().c_str());
1903 auto reDeclPtr = rcd->getMostRecentDecl();
1905 reDeclPtr->setHasExternalLexicalStorage();
1906 }
while ((reDeclPtr = reDeclPtr->getPreviousDecl()));
1919 const std::string &ModuleMapName )
const
1921 assert(llvm::sys::path::is_absolute(FullPath));
1922 Preprocessor &PP =
fInterpreter->getCI()->getPreprocessor();
1923 FileManager &FM = PP.getFileManager();
1926 if (
auto DE = FM.getOptionalDirectoryRef(FullPath)) {
1927 HeaderSearch &HS = PP.getHeaderSearchInfo();
1928 HeaderSearchOptions &HSOpts = HS.getHeaderSearchOpts();
1929 const auto &ModPaths = HSOpts.PrebuiltModulePaths;
1930 bool pathExists = std::find(ModPaths.begin(), ModPaths.end(), FullPath) != ModPaths.end();
1932 HSOpts.AddPrebuiltModulePath(FullPath);
1937 llvm::SmallString<256> ModuleMapFileName(DE->getName());
1938 llvm::sys::path::append(ModuleMapFileName, ModuleMapName);
1939 if (
auto FE = FM.getOptionalFileRef(ModuleMapFileName,
false,
1941 if (!HS.loadModuleMapFile(*FE,
false))
1943 Error(
"RegisterPrebuiltModulePath",
"Could not load modulemap in %s", ModuleMapFileName.c_str());
1960 "libforward_listDict",
1968 "libunordered_setDict",
1969 "libunordered_multisetDict",
1970 "libunordered_mapDict",
1971 "libunordered_multimapDict",
1979 char dyLibError[1000];
1980 FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
1981 dyLibError,
sizeof(dyLibError), NULL);
1983 const char *dyLibError = dlerror();
1985 ::Error(
"TCling::RegisterModule",
"Cannot open shared library %s for dictionary %s:\n %s", dyLibName, modulename,
1986 (dyLibError) ? dyLibError :
"");
2024 const char** headers,
2025 const char** includePaths,
2026 const char* payloadCode,
2027 const char* fwdDeclsCode,
2028 void (*triggerFunc)(),
2030 const char** classesHeaders,
2031 Bool_t lateRegistration ,
2038 if (fromRootCling)
return;
2047 bool isACLiC = strstr(modulename,
"_ACLiC_dict") !=
nullptr;
2048 if (hasHeaderParsingOnDemand && isACLiC) {
2050 Info(
"TCling::RegisterModule",
2051 "Header parsing on demand is active but this is an Aclic library. Disabling it for this library.");
2052 hasHeaderParsingOnDemand =
false;
2066 for (
const char** inclPath = includePaths; *inclPath; ++inclPath) {
2069 cling::Transaction* T =
nullptr;
2071 for (
auto& fwdDeclArgToSkipPair : fwdDeclsArgToSkip){
2072 const std::string& fwdDecl = fwdDeclArgToSkipPair.first;
2073 const int nArgsToSkip = fwdDeclArgToSkipPair.second;
2074 auto compRes =
fInterpreter->declare(fwdDecl.c_str(), &T);
2075 assert(cling::Interpreter::kSuccess == compRes &&
2076 "A fwd declaration could not be compiled");
2077 if (compRes!=cling::Interpreter::kSuccess){
2078 Warning(
"TCling::RegisterModule",
2079 "Problems in declaring string '%s' were encountered.",
2086 fNormalizedCtxt->AddTemplAndNargsToKeep(TD->getCanonicalDecl(), nArgsToSkip);
2094 TString code = gNonInterpreterClassDef;
2096 code += payloadCode;
2098 std::string dyLibName = cling::DynamicLibraryManager::getSymbolLocation(triggerFunc);
2099 assert(!llvm::sys::fs::is_symlink_file(dyLibName));
2101 if (dyLibName.empty()) {
2102 ::Error(
"TCling::RegisterModule",
"Dictionary trigger function for %s not found", modulename);
2107 bool isSharedLib = cling::DynamicLibraryManager::isSharedLibrary(dyLibName);
2109 bool wasDlopened =
false;
2114 if (!lateRegistration) {
2121 void* dyLibHandle = dlopen(dyLibName.c_str(), RTLD_LAZY | RTLD_GLOBAL);
2131 if (hasHeaderParsingOnDemand && fwdDeclsCode){
2134 std::string fwdDeclsCodeLessEnums;
2138 std::string fwdDeclsLine;
2139 std::istringstream fwdDeclsCodeStr(fwdDeclsCode);
2140 std::vector<std::string> scopes;
2141 while (std::getline(fwdDeclsCodeStr, fwdDeclsLine)) {
2142 const auto enumPos = fwdDeclsLine.find(
"enum __attribute__((annotate(\"");
2144 if (enumPos != std::string::npos) {
2151 auto nsPos = fwdDeclsLine.find(
"namespace");
2152 R__ASSERT(nsPos < enumPos &&
"Inconsistent enum and enclosing scope parsing!");
2153 while (nsPos < enumPos && nsPos != std::string::npos) {
2155 const auto nsNameStart = nsPos + 10;
2156 const auto nsNameEnd = fwdDeclsLine.find(
'{', nsNameStart);
2157 const auto nsName = fwdDeclsLine.substr(nsNameStart, nsNameEnd - nsNameStart);
2158 scopes.push_back(nsName);
2159 nsPos = fwdDeclsLine.find(
"namespace", nsNameEnd);
2162 clang::DeclContext* DC =
nullptr;
2163 for (
auto &&aScope: scopes) {
2164 DC = cling::utils::Lookup::Namespace(&
fInterpreter->getSema(), aScope.c_str(), DC);
2170 if (scopes.empty() || DC) {
2174 size_t posEnumName = fwdDeclsLine.rfind(
"\"))) ");
2175 R__ASSERT(posEnumName != std::string::npos &&
"Inconsistent enum fwd decl!");
2177 while (isspace(fwdDeclsLine[posEnumName]))
2179 size_t posEnumNameEnd = fwdDeclsLine.find(
" : ", posEnumName);
2180 R__ASSERT(posEnumNameEnd != std::string::npos &&
"Inconsistent enum fwd decl (end)!");
2181 while (isspace(fwdDeclsLine[posEnumNameEnd]))
2185 std::string enumName = fwdDeclsLine.substr(posEnumName,
2186 posEnumNameEnd - posEnumName + 1);
2188 if (clang::NamedDecl* enumDecl
2189 = cling::utils::Lookup::Named(&
fInterpreter->getSema(),
2190 enumName.c_str(), DC)) {
2193 R__ASSERT(llvm::dyn_cast<clang::EnumDecl>(enumDecl) &&
"not an enum decl!");
2200 fwdDeclsCodeLessEnums += fwdDeclsLine +
"\n";
2204 if (!fwdDeclsCodeLessEnums.empty()){
2205 auto compRes =
fInterpreter->declare(fwdDeclsCodeLessEnums, &T);
2206 assert(cling::Interpreter::kSuccess == compRes &&
2207 "The forward declarations could not be compiled");
2208 if (compRes!=cling::Interpreter::kSuccess){
2209 Warning(
"TCling::RegisterModule",
2210 "Problems in compiling forward declarations for module %s: '%s'",
2211 modulename, fwdDeclsCodeLessEnums.c_str()) ;
2219 ExtLexicalStorageAdder elsa;
2220 for (
auto dciIt = T->decls_begin();dciIt!=T->decls_end();dciIt++){
2221 cling::Transaction::DelayCallInfo& dci = *dciIt;
2222 for(
auto dit = dci.m_DGR.begin(); dit != dci.m_DGR.end(); ++dit) {
2223 clang::Decl* declPtr = *dit;
2224 elsa.TraverseDecl(declPtr);
2238 for (
const char** classesHeader = classesHeaders; *classesHeader; ++classesHeader) {
2239 temp=*classesHeader;
2241 size_t theTemplateHash = 0;
2242 bool addTemplate =
false;
2243 size_t posTemplate = temp.find(
'<');
2244 if (posTemplate != std::string::npos) {
2246 std::string templateName = temp.substr(0, posTemplate);
2252 for (
const char** classesHeader_inner = classesHeader; 0!=strcmp(*classesHeader_inner,
"@"); ++classesHeader_inner,++classesHeader){
2254 if (payloadCode == *classesHeader_inner ){
2256 if (addTemplate)
fPayloads.insert(theTemplateHash);
2259 Info(
"TCling::RegisterModule",
2260 "Adding a header for %s", temp.c_str());
2266 addTemplate =
false;
2274 bool ModuleWasSuccessfullyLoaded =
false;
2276 std::string ModuleName = modulename;
2277 if (llvm::StringRef(modulename).startswith(
"lib"))
2278 ModuleName = llvm::StringRef(modulename).substr(3).str();
2283 clang::Preprocessor &PP = TheSema.getPreprocessor();
2284 std::string ModuleMapName;
2286 ModuleMapName = ModuleName +
".modulemap";
2288 ModuleMapName =
"module.modulemap";
2296 if (!ModuleWasSuccessfullyLoaded) {
2298 clang::HeaderSearch &headerSearch = PP.getHeaderSearchInfo();
2299 clang::ModuleMap &moduleMap = headerSearch.getModuleMap();
2300 if (moduleMap.findModule(ModuleName))
2301 Info(
"TCling::RegisterModule",
"Module %s in modulemap failed to load.", ModuleName.c_str());
2306 llvm::SmallString<256> pcmFileNameFullPath(dyLibName);
2309 llvm::sys::fs::make_absolute(pcmFileNameFullPath);
2310 llvm::sys::path::remove_filename(pcmFileNameFullPath);
2311 llvm::sys::path::append(pcmFileNameFullPath,
2313 LoadPCM(pcmFileNameFullPath.str().str());
2320 clangDiagSuppr diagSuppr(TheSema.getDiagnostics());
2322#if defined(R__MUST_REVISIT)
2323#if R__MUST_REVISIT(6,2)
2324 Warning(
"TCling::RegisterModule",
"Diagnostics suppression should be gone by now.");
2328 if (!ModuleWasSuccessfullyLoaded && !hasHeaderParsingOnDemand){
2331 const cling::Transaction* watermark =
fInterpreter->getLastTransaction();
2332 cling::Interpreter::CompilationResult compRes =
fInterpreter->parseForModule(code.
Data());
2338 assert(cling::Interpreter::kSuccess == compRes &&
2339 "Payload code of a dictionary could not be parsed correctly.");
2340 if (compRes!=cling::Interpreter::kSuccess) {
2341 Warning(
"TCling::RegisterModule",
2342 "Problems declaring payload for module %s.", modulename) ;
2355 if (!ModuleWasSuccessfullyLoaded && !hasHeaderParsingOnDemand) {
2358 "#undef __ROOTCLING__\n"
2359 + gInterpreterClassDef +
2364 assert(isSharedLib);
2367 dlclose(dyLibHandle);
2373 ASTContext &C = CI.getASTContext();
2381 if (IdentifierInfoLookup *External = C.Idents.getExternalIdentifierLookup()) {
2382 std::unique_ptr<IdentifierIterator> Iter(External->getIdentifiers());
2383 for (llvm::StringRef Ident = Iter->Next(); !Ident.empty(); Ident = Iter->Next()) {
2384 std::string
I = Ident.str();
2408 typedef std::vector<std::pair<TClass*,DictFuncPtr_t> >::iterator iterator;
2414 if (
i->first == oldcl ) {
2437 const char* input_line,
2438 cling::Interpreter::CompilationResult& compRes,
2442 return metaProcessor->process(input_line, compRes,
result);
2444 catch (cling::InterpreterException&
ex)
2446 Error(
"HandleInterpreterException",
"%s\n%s",
ex.what(),
"Execution of your code was aborted.");
2448 compRes = cling::Interpreter::kFailure;
2457 if (
auto ie =
dynamic_cast<const cling::InterpreterException*
>(&
e)) {
2483 gROOT->SetLineIsProcessing();
2487 gROOT->SetLineHasBeenProcessed();
2500 gROOT->SetLineIsProcessing();
2502 struct InterpreterFlagsRAII {
2504 bool fWasDynamicLookupEnabled;
2506 InterpreterFlagsRAII(cling::Interpreter* interp):
2508 fWasDynamicLookupEnabled(interp->isDynamicLookupEnabled())
2512 ~InterpreterFlagsRAII() {
2513 fInterpreter->enableDynamicLookup(fWasDynamicLookupEnabled);
2514 gROOT->SetLineHasBeenProcessed();
2523 cling::Interpreter::CompilationResult compRes = cling::Interpreter::kSuccess;
2524 if (!strncmp(sLine.
Data(),
".L", 2) || !strncmp(sLine.
Data(),
".x", 2) ||
2525 !strncmp(sLine.
Data(),
".X", 2)) {
2533 aclicMode, arguments, io);
2534 if (aclicMode.
Length()) {
2536 R__ASSERT(aclicMode[0]==
'+' &&
"ACLiC mode must start with a +");
2538 if (aclicMode[1]==
'+') {
2542 if (!
gSystem->CompileMacro(fname,aclicMode)) {
2544 compRes = cling::Interpreter::kFailure;
2546 if (strncmp(sLine.
Data(),
".L", 2) != 0) {
2549 if (arguments.
Length() == 0) {
2558 mod_line =
function + arguments + io;
2562 }
else if (cling::DynamicLibraryManager::isSharedLibrary(fname.
Data()) &&
2563 strncmp(sLine.
Data(),
".L", 2) != 0) {
2564 if (
gSystem->Load(fname) < 0) {
2566 compRes = cling::Interpreter::kFailure;
2568 if (arguments.
Length() == 0) {
2582 ext = fname.
Last(
'_');
2588 mod_line =
function + arguments + io;
2593 size_t unnamedMacroOpenCurly;
2596 std::string codeline;
2599 std::ifstream in(fname, std::ifstream::binary);
2601 std::getline(in, codeline);
2602 code += codeline +
"\n";
2604 unnamedMacroOpenCurly
2605 = cling::utils::isUnnamedMacro(code,
fInterpreter->getCI()->getLangOpts());
2609 if (unnamedMacroOpenCurly != std::string::npos) {
2611 unnamedMacroOpenCurly);
2621 if (0!=strncmp(sLine.
Data(),
".autodict ",10) && sLine !=
".autodict") {
2626 bool isInclusionDirective = sLine.
Contains(
"\n#include") || sLine.
BeginsWith(
"#include");
2627 if (isInclusionDirective) {
2644 case cling::Interpreter::kSuccess: *error =
kNoError;
break;
2645 case cling::Interpreter::kFailure: *error =
kRecoverable;
break;
2646 case cling::Interpreter::kMoreInputExpected: *error =
kProcessing;
break;
2649 if (compRes == cling::Interpreter::kSuccess
2680 if (path[0] ==
'-' && path[1] ==
'I')
2683 gSystem->ExpandPathName(sPath);
2687 snprintf(drive, 3,
"%c:", _getdrive() +
'A' - 1);
2712 static const TClassRef clRefString(
"std::string");
2713 if (clRefString == cl) {
2723 const char* cobj = (
const char*) obj;
2730 auto inspInspect = [&] (ptrdiff_t
offset){
2736 switch(complexType) {
2743 inspInspect(
sizeof(
float));
2748 inspInspect(
sizeof(
double));
2753 inspInspect(
sizeof(
int));
2758 inspInspect(
sizeof(
long));
2763 static clang::PrintingPolicy
2765 if (printPol.Indentation) {
2767 printPol.Indentation = 0;
2768 printPol.SuppressInitializers =
true;
2771 const char* clname = cl->
GetName();
2774 const clang::ASTContext& astContext =
fInterpreter->getCI()->getASTContext();
2775 const clang::Decl *scopeDecl =
nullptr;
2776 const clang::Type *recordType =
nullptr;
2780 scopeDecl = clingCI->
GetDecl();
2781 recordType = clingCI->
GetType();
2783 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
2785 scopeDecl = lh.findScope(clname, cling::LookupHelper::NoDiagnostics,
2789 Error(
"InspectMembers",
"Cannot find Decl for class %s", clname);
2792 const clang::CXXRecordDecl* recordDecl
2793 = llvm::dyn_cast<const clang::CXXRecordDecl>(scopeDecl);
2795 Error(
"InspectMembers",
"Cannot find Decl for class %s is not a CXXRecordDecl.", clname);
2804 astContext.getASTRecordLayout(recordDecl);
2806 for (clang::RecordDecl::field_iterator iField = recordDecl->field_begin(),
2807 eField = recordDecl->field_end(); iField != eField; ++iField) {}
2810 const clang::ASTRecordLayout& recLayout
2811 = astContext.getASTRecordLayout(recordDecl);
2818 if (cl->
Size() != recLayout.getSize().getQuantity()) {
2819 Error(
"InspectMembers",
"TClass and cling disagree on the size of the class %s, respectively %d %lld\n",
2823 unsigned iNField = 0;
2826 for (clang::RecordDecl::field_iterator iField = recordDecl->field_begin(),
2827 eField = recordDecl->field_end(); iField != eField;
2828 ++iField, ++iNField) {
2831 clang::QualType memberQT = iField->getType();
2836 memberQT = cling::utils::Transform::GetPartiallyDesugaredType(astContext, memberQT,
fNormalizedCtxt->GetConfig(),
false );
2837 if (memberQT.isNull()) {
2838 std::string memberName;
2839 llvm::raw_string_ostream stream(memberName);
2841 printPol.AnonymousTagLocations =
false;
2842 iField->getNameForDiagnostic(stream, printPol,
true );
2844 Error(
"InspectMembers",
2845 "Cannot retrieve QualType for member %s while inspecting class %s",
2846 memberName.c_str(), clname);
2849 const clang::Type* memType = memberQT.getTypePtr();
2851 std::string memberName;
2852 llvm::raw_string_ostream stream(memberName);
2854 printPol.AnonymousTagLocations =
false;
2855 iField->getNameForDiagnostic(stream, printPol,
true );
2857 Error(
"InspectMembers",
2858 "Cannot retrieve Type for member %s while inspecting class %s",
2859 memberName.c_str(), clname);
2863 const clang::Type* memNonPtrType = memType;
2864 Bool_t ispointer =
false;
2865 if (memNonPtrType->isPointerType()) {
2867 clang::QualType ptrQT
2868 = memNonPtrType->getAs<clang::PointerType>()->getPointeeType();
2873 ptrQT = cling::utils::Transform::GetPartiallyDesugaredType(astContext, ptrQT,
fNormalizedCtxt->GetConfig(),
false );
2874 if (ptrQT.isNull()) {
2875 std::string memberName;
2876 llvm::raw_string_ostream stream(memberName);
2878 printPol.AnonymousTagLocations =
false;
2879 iField->getNameForDiagnostic(stream, printPol,
true );
2881 Error(
"InspectMembers",
2882 "Cannot retrieve pointee Type for member %s while inspecting class %s",
2883 memberName.c_str(), clname);
2886 memNonPtrType = ptrQT.getTypePtr();
2890 llvm::SmallString<8> arraySize;
2891 const clang::ArrayType* arrType = memNonPtrType->getAsArrayTypeUnsafe();
2892 unsigned arrLevel = 0;
2893 bool haveErrorDueToArray =
false;
2897 const clang::ConstantArrayType* constArrType =
2898 clang::dyn_cast<clang::ConstantArrayType>(arrType);
2900 constArrType->getSize().toStringUnsigned(arraySize);
2903 clang::QualType subArrQT = arrType->getElementType();
2904 if (subArrQT.isNull()) {
2905 std::string memberName;
2906 llvm::raw_string_ostream stream(memberName);
2908 printPol.AnonymousTagLocations =
false;
2909 iField->getNameForDiagnostic(stream, printPol,
true );
2911 Error(
"InspectMembers",
2912 "Cannot retrieve QualType for array level %d (i.e. element type of %s) for member %s while inspecting class %s",
2913 arrLevel, subArrQT.getAsString(printPol).c_str(),
2914 memberName.c_str(), clname);
2915 haveErrorDueToArray =
true;
2918 arrType = subArrQT.getTypePtr()->getAsArrayTypeUnsafe();
2920 if (haveErrorDueToArray) {
2925 std::string fieldName;
2926 if (memType->isPointerType()) {
2931 std::string ioname(iField->getName());
2933 fieldName += ioname;
2934 fieldName += arraySize;
2939 clang::CharUnits
offset(astContext.toCharUnitsFromBits(recLayout.getFieldOffset(iNField)));
2940 ptrdiff_t fieldOffset =
offset.getQuantity();
2950 auto iFiledQtype = iField->getType();
2951 if (
auto tagDecl = iFiledQtype->getAsTagDecl()){
2952 auto declAccess = tagDecl->getAccess();
2953 if (declAccess == AS_private || declAccess == AS_protected) {
2959 insp.
Inspect(
const_cast<TClass*
>(cl), insp.
GetParent(), fieldName.c_str(), cobj + fieldOffset, isTransient);
2962 const clang::CXXRecordDecl* fieldRecDecl = memNonPtrType->getAsCXXRecordDecl();
2963 if (fieldRecDecl && !fieldRecDecl->isAnonymousStructOrUnion()) {
2966 std::string sFieldRecName;
2969 clang::QualType(memNonPtrType,0),
2979 insp.
InspectMember(sFieldRecName.c_str(), cobj + fieldOffset,
2980 (fieldName +
'.').c_str(), transient);
2988 unsigned iNBase = 0;
2989 for (clang::CXXRecordDecl::base_class_const_iterator iBase
2990 = recordDecl->bases_begin(), eBase = recordDecl->bases_end();
2991 iBase != eBase; ++iBase, ++iNBase) {
2992 clang::QualType baseQT = iBase->getType();
2993 if (baseQT.isNull()) {
2994 Error(
"InspectMembers",
2995 "Cannot find QualType for base number %d while inspecting class %s",
2999 const clang::CXXRecordDecl* baseDecl
3000 = baseQT->getAsCXXRecordDecl();
3002 Error(
"InspectMembers",
3003 "Cannot find CXXRecordDecl for base number %d while inspecting class %s",
3008 std::string sBaseName;
3010 std::vector<TClass*> foundClasses;
3012 if (foundClasses.size()==1){
3013 baseCl=foundClasses[0];
3026 std::string qualNameForDiag;
3028 Error(
"InspectMembers",
3029 "Cannot find TClass for base class %s", qualNameForDiag.c_str() );
3034 if (iBase->isVirtual()) {
3037 Error(
"InspectMembers",
3038 "Base %s of class %s is virtual but no object provided",
3039 sBaseName.c_str(), clname);
3047 baseOffset = ci->
GetBaseOffset(baseCi,
const_cast<void*
>(obj),
3049 if (baseOffset == -1) {
3050 Error(
"InspectMembers",
3051 "Error calculating offset of virtual base %s of class %s",
3052 sBaseName.c_str(), clname);
3055 Error(
"InspectMembers",
3056 "Cannot calculate offset of virtual base %s of class %s",
3057 sBaseName.c_str(), clname);
3062 baseOffset = recLayout.getBaseClassOffset(baseDecl).getQuantity();
3109 bool oldDynLookup =
fInterpreter->isDynamicLookupEnabled();
3138 return fInterpreter->getDynamicLibraryManager()->isLibraryLoaded(tLibName.
Data());
3153 llvm::StringRef ModuleName(libname);
3154 ModuleName = llvm::sys::path::stem(ModuleName);
3155 ModuleName.consume_front(
"lib");
3163 clang::ModuleMap &moduleMap =
fInterpreter->getCI()->getPreprocessor().getHeaderSearchInfo().getModuleMap();
3164 clang::Module *M = moduleMap.findModule(ModuleName);
3165 return M && !M->IsUnimportable && M->getASTFile();
3184 size_t at = std::string::npos;
3185 while ((at = file_name.find(
"/./")) != std::string::npos)
3186 file_name.replace(at, 3,
"/");
3188 std::string filesStr =
"";
3189 llvm::raw_string_ostream filesOS(filesStr);
3190 clang::SourceManager &SM =
fInterpreter->getCI()->getSourceManager();
3191 cling::ClangInternalState::printIncludedFiles(filesOS, SM);
3194 llvm::SmallVector<llvm::StringRef, 100> files;
3195 llvm::StringRef(filesStr).split(files,
"\n");
3197 std::set<std::string> fileMap;
3198 llvm::StringRef file_name_ref(file_name);
3200 for (llvm::SmallVector<llvm::StringRef, 100>::const_iterator
3201 iF = files.begin(), iE = files.end(); iF != iE; ++iF) {
3202 if ((*iF) == file_name_ref)
return kTRUE;
3203 fileMap.insert(iF->str());
3206 if (fileMap.empty())
return kFALSE;
3209 TString sFilename(file_name.c_str());
3211 && fileMap.count(sFilename.
Data())) {
3219 while (incPath.
Index(
" :") != -1) {
3223 sFilename = file_name.c_str();
3225 && fileMap.count(sFilename.
Data())) {
3234 clang::ConstSearchDirIterator *CurDir =
nullptr;
3235 clang::Preprocessor &PP =
fInterpreter->getCI()->getPreprocessor();
3236 clang::HeaderSearch &HS = PP.getHeaderSearchInfo();
3237 auto FE = HS.LookupFile(file_name.c_str(),
3238 clang::SourceLocation(),
3241 clang::ArrayRef<std::pair<
const clang::FileEntry *,
3242 const clang::DirectoryEntry *>>(),
3255 clang::SourceManager &SM =
fInterpreter->getCI()->getSourceManager();
3257 clang::FileID FID = SM.translateFile(*FE);
3258 if (!FID.isInvalid() && FID.getHashValue() == 0)
3261 clang::SrcMgr::SLocEntry SLocE = SM.getSLocEntry(FID);
3262 if (SLocE.isFile() && !SLocE.getFile().getContentCache().getBufferIfLoaded())
3264 if (!FID.isInvalid())
3268 sFilename = FE->getName().str();
3270 && fileMap.count(sFilename.
Data())) {
3278#if defined(R__MACOSX)
3286static bool R__UpdateLibFileForLinking(
TString &lib)
3288 const char *mapfile =
nullptr;
3290 mapfile =
"/System/Library/dyld/dyld_shared_cache_x86_64.map";
3292 mapfile =
"/System/Library/dyld/dyld_shared_cache_arm64e.map";
3294 #error unsupported architecture
3296 if (std::ifstream cacheMap{mapfile}) {
3298 while (getline(cacheMap,
line)) {
3299 if (
line.find(lib) != std::string::npos) {
3311#if defined (R__LINUX) || defined (R__FBSD)
3317static int callback_for_dl_iterate_phdr(
struct dl_phdr_info *info,
size_t size,
void *
data)
3320 static std::unordered_set<
decltype(info->dlpi_addr)> sKnownLoadedLibBaseAddrs;
3322 auto newLibs =
static_cast<std::vector<std::string>*
>(
data);
3323 if (!sKnownLoadedLibBaseAddrs.count(info->dlpi_addr)) {
3325 if (info->dlpi_name && info->dlpi_name[0]
3330 && strncmp(info->dlpi_name,
"[vdso]", 6)
3334 && strncmp(info->dlpi_name,
"/libexec/ld-elf.so.1", 20)
3336 && strncmp(info->dlpi_name,
"linux-vdso.so", 13)
3337 && strncmp(info->dlpi_name,
"linux-vdso32.so", 15)
3338 && strncmp(info->dlpi_name,
"linux-vdso64.so", 15)
3339 && strncmp(info->dlpi_name,
"linux-gate.so", 13))
3340 newLibs->emplace_back(info->dlpi_name);
3341 sKnownLoadedLibBaseAddrs.insert(info->dlpi_addr);
3354#if defined(R__WIN32) || defined(__CYGWIN__)
3355 HMODULE hModules[1024];
3357 unsigned long cbModules;
3359 hProcess = (
void *)::GetCurrentProcess();
3360 ::EnumProcessModules(hProcess, hModules,
sizeof(hModules), &cbModules);
3362 for (
i = 1;
i < (cbModules /
sizeof(
void *));
i++) {
3363 static const int bufsize = 260;
3364 wchar_t winname[bufsize];
3365 char posixname[bufsize];
3366 ::GetModuleFileNameExW(hProcess, hModules[
i], winname, bufsize);
3367#if defined(__CYGWIN__)
3368 cygwin_conv_path(CCP_WIN_W_TO_POSIX, winname, posixname, bufsize);
3370 std::wstring wpath = winname;
3371 std::replace(wpath.begin(), wpath.end(),
'\\',
'/');
3372 string path(wpath.begin(), wpath.end());
3373 strncpy(posixname, path.c_str(), bufsize);
3379#elif defined(R__MACOSX)
3383 while (
const mach_header* mh = _dyld_get_image_header(imageIndex)) {
3385 if (mh->filetype == MH_DYLIB) {
3386 if (
const char* imageName = _dyld_get_image_name(imageIndex)) {
3394#elif defined(R__LINUX) || defined(R__FBSD)
3398 std::vector<std::string> newLibs;
3399 dl_iterate_phdr(callback_for_dl_iterate_phdr, &newLibs);
3400 for (
auto &&lib: newLibs)
3403 Error(
"TCling::UpdateListOfLoadedSharedLibraries",
3404 "Platform not supported!");
3410static bool StartsWithStrLit(
const char *haystack,
const char (&needle)[
N]) {
3411 return !strncmp(haystack, needle,
N - 1);
3426 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
3427 if (!DLM->isLibraryLoaded(
filename)) {
3428 DLM->loadLibrary(
filename,
true ,
true );
3431#if defined(R__MACOSX)
3433 auto lenFilename = strlen(
filename);
3434 auto isInMacOSSystemDir = [](
const char *fn) {
3435 return StartsWithStrLit(fn,
"/usr/lib/") || StartsWithStrLit(fn,
"/System/Library/");
3437 if (!strcmp(
filename,
"cl_kernels")
3440 || StartsWithStrLit(
filename,
"/usr/lib/system/")
3441 || StartsWithStrLit(
filename,
"/usr/lib/libc++")
3442 || StartsWithStrLit(
filename,
"/System/Library/Frameworks/")
3443 || StartsWithStrLit(
filename,
"/System/Library/PrivateFrameworks/")
3444 || StartsWithStrLit(
filename,
"/System/Library/CoreServices/")
3445 || StartsWithStrLit(
filename,
"/usr/lib/libSystem")
3446 || StartsWithStrLit(
filename,
"/usr/lib/libstdc++")
3447 || StartsWithStrLit(
filename,
"/usr/lib/libicucore")
3448 || StartsWithStrLit(
filename,
"/usr/lib/libbsm")
3449 || StartsWithStrLit(
filename,
"/usr/lib/libobjc")
3450 || StartsWithStrLit(
filename,
"/usr/lib/libresolv")
3451 || StartsWithStrLit(
filename,
"/usr/lib/libauto")
3452 || StartsWithStrLit(
filename,
"/usr/lib/libcups")
3453 || StartsWithStrLit(
filename,
"/usr/lib/libDiagnosticMessagesClient")
3454 || StartsWithStrLit(
filename,
"/usr/lib/liblangid")
3455 || StartsWithStrLit(
filename,
"/usr/lib/libCRFSuite")
3456 || StartsWithStrLit(
filename,
"/usr/lib/libpam")
3457 || StartsWithStrLit(
filename,
"/usr/lib/libOpenScriptingUtil")
3458 || StartsWithStrLit(
filename,
"/usr/lib/libextension")
3459 || StartsWithStrLit(
filename,
"/usr/lib/libAudioToolboxUtility")
3460 || StartsWithStrLit(
filename,
"/usr/lib/liboah")
3461 || StartsWithStrLit(
filename,
"/usr/lib/libRosetta")
3462 || StartsWithStrLit(
filename,
"/usr/lib/libCoreEntitlements")
3463 || StartsWithStrLit(
filename,
"/usr/lib/libssl.")
3464 || StartsWithStrLit(
filename,
"/usr/lib/libcrypto.")
3470 || StartsWithStrLit(
filename,
"/usr/lib/system/libsystem_kernel")
3471 || StartsWithStrLit(
filename,
"/usr/lib/system/libsystem_platform")
3472 || StartsWithStrLit(
filename,
"/usr/lib/system/libsystem_pthread")
3477 || (lenFilename > 4 && !strcmp(
filename + lenFilename - 4,
".tbd")))
3480 R__UpdateLibFileForLinking(sFileName);
3482#elif defined(__CYGWIN__)
3484 static const int bufsize = 260;
3485 char posixwindir[bufsize];
3486 char *windir = getenv(
"WINDIR");
3488 cygwin_conv_path(CCP_WIN_A_TO_POSIX, windir, posixwindir, bufsize);
3490 snprintf(posixwindir,
sizeof(posixwindir),
"/Windows/");
3491 if (strstr(
filename, posixwindir) ||
3494#elif defined(R__WIN32)
3497#elif defined (R__LINUX)
3521 assert(!
IsFromRootCling() &&
"Trying to load library from rootcling!");
3525 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
3526 std::string canonLib = DLM->lookupLibrary(
filename);
3527 cling::DynamicLibraryManager::LoadLibResult res
3528 = cling::DynamicLibraryManager::kLoadLibNotFound;
3529 if (!canonLib.empty()) {
3531 res = DLM->loadLibrary(
filename, system,
true);
3535 cling::Interpreter::CompilationResult compRes;
3537 if (compRes == cling::Interpreter::kSuccess)
3538 res = cling::DynamicLibraryManager::kLoadLibSuccess;
3542 if (res == cling::DynamicLibraryManager::kLoadLibSuccess) {
3546 case cling::DynamicLibraryManager::kLoadLibSuccess:
return 0;
3547 case cling::DynamicLibraryManager::kLoadLibAlreadyLoaded:
return 1;
3597 Warning(
"Calc",
"waiting for cling thread to free");
3600 gROOT->SetLineIsProcessing();
3607 cling::Value valRef;
3608 cling::Interpreter::CompilationResult cr = cling::Interpreter::kFailure;
3612 catch (cling::InterpreterException&
ex)
3614 Error(
"Calc",
"%s.\n%s",
ex.what(),
"Evaluation of your expression was aborted.");
3616 cr = cling::Interpreter::kFailure;
3619 if (cr != cling::Interpreter::kSuccess) {
3627 if (!valRef.isValid()) {
3636 if (valRef.isVoid()) {
3643 gROOT->SetLineHasBeenProcessed();
3653 void (*histaddFunc)(
const char*
line))
3658#if defined(R__MUST_REVISIT)
3659#if R__MUST_REVISIT(6,2)
3660 Warning(
"SetGetline",
"Cling should support the equivalent of SetGetlineFunc(getlineFunc, histaddFunc)");
3673 if ((std::distance(T.decls_begin(), T.decls_end()) != 1)
3674 || T.deserialized_decls_begin() != T.deserialized_decls_end()
3675 || T.macros_begin() != T.macros_end()
3676 || ((!T.getFirstDecl().isNull()) && ((*T.getFirstDecl().begin()) != T.getWrapperFD()))) {
3699 std::set<TObject*>::iterator iSpecial = ((std::set<TObject*>*)
fgSetOfSpecials)->find(obj);
3717#if defined(R__MUST_REVISIT)
3718#if R__MUST_REVISIT(6,2)
3720 Warning(
"Reset",
"Cling should support the equivalent of scratch_upto(&fDictPos)");
3730#if defined(R__MUST_REVISIT)
3731#if R__MUST_REVISIT(6,2)
3733 Warning(
"ResetAll",
"Cling should support the equivalent of complete reset (unload everything but the startup decls.");
3760#if defined(R__MUST_REVISIT)
3761#if R__MUST_REVISIT(6,2)
3763 Warning(
"ResetGlobalVar",
"Cling should support the equivalent of resetglobalvar(obj)");
3775#if defined(R__MUST_REVISIT)
3776#if R__MUST_REVISIT(6,2)
3778 Warning(
"RewindDictionary",
"Cling should provide a way to revert transaction similar to rewinddictionary()");
3789#if defined(R__MUST_REVISIT)
3790#if R__MUST_REVISIT(6,2)
3792 Warning(
"DeleteGlobal",
"Cling should provide the equivalent of deleteglobal(obj), see also DeleteVariable.");
3804#if defined(R__MUST_REVISIT)
3805#if R__MUST_REVISIT(6,2)
3806 Warning(
"DeleteVariable",
"should do more that just reseting the value to zero");
3811 llvm::StringRef srName(
name);
3812 const char* unscopedName =
name;
3813 llvm::StringRef::size_type posScope = srName.rfind(
"::");
3814 const clang::DeclContext* declCtx =
nullptr;
3815 if (posScope != llvm::StringRef::npos) {
3816 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
3817 const clang::Decl* scopeDecl
3818 = lh.findScope(srName.substr(0, posScope),
3819 cling::LookupHelper::WithDiagnostics);
3821 Error(
"DeleteVariable",
"Cannot find enclosing scope for variable %s",
3825 declCtx = llvm::dyn_cast<clang::DeclContext>(scopeDecl);
3827 Error(
"DeleteVariable",
3828 "Enclosing scope for variable %s is not a declaration context",
3832 unscopedName += posScope + 2;
3836 clang::NamedDecl* nVarDecl
3837 = cling::utils::Lookup::Named(&
fInterpreter->getSema(), unscopedName, declCtx);
3839 Error(
"DeleteVariable",
"Unknown variable %s",
name);
3842 clang::VarDecl* varDecl = llvm::dyn_cast<clang::VarDecl>(nVarDecl);
3844 Error(
"DeleteVariable",
"Entity %s is not a variable",
name);
3848 clang::QualType qType = varDecl->getType();
3849 const clang::Type*
type = qType->getUnqualifiedDesugaredType();
3852 if (
type->isPointerType()) {
3853 int** ppInt = (
int**)
fInterpreter->getAddressOfGlobal(GlobalDecl(varDecl));
3855 if (ppInt) *ppInt =
nullptr;
3865#if defined(R__MUST_REVISIT)
3866#if R__MUST_REVISIT(6,2)
3868 Warning(
"SaveContext",
"Cling should provide a way to record a state watermark similar to store_dictposition(&fDictPos)");
3878#if defined(R__MUST_REVISIT)
3879#if R__MUST_REVISIT(6,2)
3881 Warning(
"SaveGlobalsContext",
"Cling should provide a way to record a watermark for the list of global variable similar to store_dictposition(&fDictPosGlobals)");
3929 std::tuple<int,double>
value;
3933 size_t offset0 = ((
char*)&(std::get<0>(
value))) - ((
char*)&
value);
3934 size_t offset1 = ((
char*)&(std::get<1>(
value))) - ((
char*)&
value);
3936 size_t ascOffset0 = ((
char*)&(asc.
_0)) - ((
char*)&asc);
3937 size_t ascOffset1 = ((
char*)&(asc.
_1)) - ((
char*)&asc);
3939 size_t desOffset0 = ((
char*)&(des.
_0)) - ((
char*)&des);
3940 size_t desOffset1 = ((
char*)&(des.
_1)) - ((
char*)&des);
3942 if (offset0 == ascOffset0 && offset1 == ascOffset1) {
3944 }
else if (offset0 == desOffset0 && offset1 == desOffset1) {
3954 std::string alternateName =
"TEmulatedTuple";
3955 alternateName.append( classname + 5 );
3957 std::string fullname =
"ROOT::Internal::" + alternateName;
3958 if (lh.findScope(fullname, cling::LookupHelper::NoDiagnostics,
3964 auto iter = tupleContent.
fElements.begin() + 1;
3965 auto theEnd = tupleContent.
fElements.end() - 1;
3966 auto deleter = [](TypeInfo_t *
type) {
3969 std::unique_ptr<TypeInfo_t,
decltype(deleter)>
type{
gInterpreter->TypeInfo_Factory(), deleter };
3970 while (iter != theEnd) {
3974 Error(
"Load",
"Could not declare alternate type for %s since %s (or one of its context) is private or protected",
3975 classname, iter->c_str());
3982 std::string guard_name;
3984 std::ostringstream guard;
3985 guard <<
"ROOT_INTERNAL_TEmulated_";
3986 guard << guard_name;
3988 std::ostringstream alternateTuple;
3989 alternateTuple <<
"#ifndef " << guard.str() <<
"\n";
3990 alternateTuple <<
"#define " << guard.str() <<
"\n";
3991 alternateTuple <<
"namespace ROOT { namespace Internal {\n";
3992 alternateTuple <<
"template <class... Types> struct TEmulatedTuple;\n";
3993 alternateTuple <<
"template <> struct " << alternateName <<
" {\n";
3998 unsigned int nMember = 0;
3999 auto iter = tupleContent.
fElements.begin() + 1;
4000 auto theEnd = tupleContent.
fElements.end() - 1;
4001 while (iter != theEnd) {
4002 alternateTuple <<
" " << *iter <<
" _" << nMember <<
";\n";
4009 unsigned int nMember = tupleContent.
fElements.size() - 3;
4010 auto iter = tupleContent.
fElements.rbegin() + 1;
4011 auto theEnd = tupleContent.
fElements.rend() - 1;
4012 while (iter != theEnd) {
4013 alternateTuple <<
" " << *iter <<
" _" << nMember <<
";\n";
4020 Fatal(
"TCling::SetClassInfo::AlternateTuple",
4021 "Layout of std::tuple on this platform is unexpected.");
4026 alternateTuple <<
"};\n";
4027 alternateTuple <<
"}}\n";
4028 alternateTuple <<
"#endif\n";
4029 if (!
gCling->Declare(alternateTuple.str().c_str()))
4033 Error(
"Load",
"Could not declare %s",alternateName.c_str());
4036 alternateName =
"ROOT::Internal::" + alternateName;
4037 return alternateName;
4077 auto SetWithoutClassInfoState = [](
TClass *cl)
4090 if (strncmp(cl->
GetName(),
"tuple<",strlen(
"tuple<"))==0) {
4093 if (reload ||
name.empty()) {
4095 SetWithoutClassInfoState(cl);
4107 SetWithoutClassInfoState(cl);
4124 zombieCandidate =
kTRUE;
4131 zombieCandidate =
kTRUE;
4184 static const char *anonEnum =
"anonymous enum ";
4185 static const int cmplen = strlen(anonEnum);
4212 const char *classname =
name;
4215 class MaybeSuspendAutoLoadParse {
4216 int fStoreAutoLoad = 0;
4217 int fStoreAutoParse = 0;
4218 bool fSuspendedAutoParse =
false;
4220 MaybeSuspendAutoLoadParse(
int autoload) {
4221 fStoreAutoLoad = ((
TCling*)
gCling)->SetClassAutoLoading(autoload);
4225 fSuspendedAutoParse =
true;
4226 fStoreAutoParse = ((
TCling*)
gCling)->SetSuspendAutoParsing(
true);
4229 ~MaybeSuspendAutoLoadParse() {
4230 if (fSuspendedAutoParse)
4231 ((
TCling*)
gCling)->SetSuspendAutoParsing(fStoreAutoParse);
4232 ((
TCling*)
gCling)->SetClassAutoLoading(fStoreAutoLoad);
4236 MaybeSuspendAutoLoadParse autoLoadParseRAII( autoload );
4238 autoLoadParseRAII.SuspendAutoParsing();
4247 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
4248 const clang::Type *
type =
nullptr;
4249 const clang::Decl *decl
4250 = lh.findScope(classname,
4251 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
4252 : cling::LookupHelper::NoDiagnostics,
4256 decl = lh.findScope(buf,
4257 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
4258 : cling::LookupHelper::NoDiagnostics,
4275 clang::ClassTemplateSpecializationDecl *tmpltDecl =
4276 llvm::dyn_cast_or_null<clang::ClassTemplateSpecializationDecl>
4277 (
type->getAsCXXRecordDecl());
4278 if (tmpltDecl && !tmpltDecl->getPointOfInstantiation().isValid()) {
4295 if (tci.
Property() & propertiesMask) {
4296 bool hasClassDefInline =
false;
4297 if (isClassOrNamespaceOnly) {
4303 if (hasDictionary.IsValid() && implLineFunc.IsValid()) {
4305 bool success =
false;
4306 std::tie(success, lineNumber) =
4308 hasClassDefInline = success && (lineNumber == -1);
4316 if (hasClassDefInline)
4355 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
4358 const clang::Decl *decl
4359 = lh.findClassTemplate(
name,
4360 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
4361 : cling::LookupHelper::NoDiagnostics);
4363 std::string strname =
"std::";
4365 decl = lh.findClassTemplate(strname,
4366 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
4367 : cling::LookupHelper::NoDiagnostics);
4369 return nullptr != decl;
4393 cl->
fBase = listOfBase;
4409 D =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
4412 if (
const clang::DeclContext* DC = dyn_cast<clang::DeclContext>(D)) {
4415 llvm::SmallVector< DeclContext *, 4> allDeclContexts;
4416 const_cast< clang::DeclContext *
>(DC)->collectAllContexts(allDeclContexts);
4417 for (llvm::SmallVector<DeclContext*, 4>::iterator declIter = allDeclContexts.begin(), declEnd = allDeclContexts.end();
4418 declIter != declEnd; ++declIter) {
4420 for (clang::DeclContext::decl_iterator DI = (*declIter)->decls_begin(),
4421 DE = (*declIter)->decls_end(); DI != DE; ++DI) {
4422 if (
const clang::EnumDecl* ED = dyn_cast<clang::EnumDecl>(*DI)) {
4425 PrintingPolicy Policy(ED->getASTContext().getPrintingPolicy());
4426 llvm::raw_string_ostream stream(buf);
4428 Policy.AnonymousTagLocations =
false;
4429 ED->getNameForDiagnostic(stream, Policy,
false);
4433 const char*
name = buf.c_str();
4457 D =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
4461 if (
const clang::DeclContext* DC = dyn_cast<clang::DeclContext>(D)) {
4464 llvm::SmallVector< DeclContext *, 4> allDeclContexts;
4465 const_cast< clang::DeclContext *
>(DC)->collectAllContexts(allDeclContexts);
4466 for (llvm::SmallVector<DeclContext*, 4>::iterator declIter = allDeclContexts.begin(),
4467 declEnd = allDeclContexts.end(); declIter != declEnd; ++declIter) {
4469 for (clang::DeclContext::decl_iterator DI = (*declIter)->decls_begin(),
4470 DE = (*declIter)->decls_end(); DI != DE; ++DI) {
4471 if (
const clang::FunctionTemplateDecl* FTD = dyn_cast<clang::FunctionTemplateDecl>(*DI)) {
4472 funcTempList->
Get(FTD);
4530 if (
m->fMethodArgs) {
4541 m->fMethodArgs = arglist;
4586 if (llvm::isa<clang::NamespaceDecl>(cli->
GetDecl())) {
4595 Error(
"GenerateTClass",
4596 "Cannot find %s::Class_Version()! Class version might be wrong.",
4603 if (newvers == -1) {
4611 newvers = callfunc.
ExecInt(
nullptr);
4613 Error(
"GenerateTClass",
4614 "Cannot invoke %s::Class_Version()! Class version might be wrong.",
4618 if (newvers != oldvers) {
4635static void GenerateTClass_GatherInnerIncludes(cling::Interpreter *interp,
TString &includes,
TClingClassInfo *info)
4639 const clang::ClassTemplateSpecializationDecl *templateCl
4640 = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(info->
GetDecl());
4642 for(
unsigned int i=0;
i < templateCl->getTemplateArgs().
size(); ++
i) {
4643 const clang::TemplateArgument &arg( templateCl->getTemplateArgs().get(
i) );
4644 if (arg.getKind() == clang::TemplateArgument::Type) {
4647 if (!uType->isFundamentalType() && !uType->isEnumeralType()) {
4649 const clang::CXXRecordDecl *argdecl = uType->getAsCXXRecordDecl();
4652 TClingClassInfo subinfo(interp,*(argdecl->getASTContext().getRecordType(argdecl).getTypePtr()));
4653 GenerateTClass_GatherInnerIncludes(interp, includes, &subinfo);
4656 llvm::raw_string_ostream OS(Result);
4657 arg.print(argdecl->getASTContext().getPrintingPolicy(),OS);
4658 Warning(
"TCling::GenerateTClass",
"Missing header file for %s",OS.str().c_str());
4673 if (!info || !info->
IsValid()) {
4674 Fatal(
"GenerateTClass",
"Requires a valid ClassInfo object");
4679 std::string classname;
4683 Info(
"GenerateTClass",
"Will (try to) generate the compiled TClass for %s.",classname.c_str());
4687 GenerateTClass_GatherInnerIncludes(
fInterpreter,includes,info);
4693 Error(
"GenerateTClass",
"Even though the dictionary generation for %s seemed successful we can't find the TClass bootstrap!",classname.c_str());
4697 if (cl ==
nullptr) {
4699 cl =
new TClass(classinfo, version,
nullptr,
nullptr, -1, -1, silent);
4704 cl =
new TClass(classinfo, 1,
nullptr,
nullptr, -1, -1, silent);
4729 if (classes ==
nullptr || classes[0] == 0) {
4730 Error(
"TCling::GenerateDictionary",
"Cannot generate dictionary without passing classes.");
4734 std::vector<std::string> listClasses;
4736 const char* current = classes, *prev = classes;
4740 if (*current ==
';') {
4741 listClasses.push_back(std::string(prev, current - prev));
4744 else if (*(current + 1) == 0) {
4745 listClasses.push_back(std::string(prev, current + 1 - prev));
4749 std::vector<std::string> listIncludes;
4753 const char* current = includes, *prev = includes;
4757 if (*current ==
';') {
4758 listIncludes.push_back(std::string(prev, current - prev));
4761 else if (*(current + 1) == 0) {
4762 listIncludes.push_back(std::string(prev, current + 1 - prev));
4768 std::vector<std::string>(), std::vector<std::string>());
4792 if (
const ValueDecl* decl = (
const ValueDecl*)
d){
4795 if (hasIoName && ioName !=
name)
return nullptr;
4807 using namespace clang;
4809 DeclarationName DName = &SemaR.Context.Idents.get(
name);
4811 LookupResult
R(SemaR, DName, SourceLocation(), Sema::LookupOrdinaryName,
4812 Sema::ForExternalRedeclaration);
4814 cling::utils::Lookup::Named(&SemaR,
R);
4816 LookupResult::Filter F =
R.makeFilter();
4818 while (F.hasNext()) {
4819 NamedDecl *D = F.next();
4820 if (isa<VarDecl>(D) || isa<FieldDecl>(D) || isa<EnumConstantDecl>(D) ||
4821 isa<IndirectFieldDecl>(D))
4827 if (
R.isSingleResult())
4828 return R.getFoundDecl();
4840 const clang::Decl* possibleEnum =
nullptr;
4845 const clang::DeclContext* dc =
nullptr;
4846 if (
const clang::Decl* D = cci->
GetDecl()) {
4847 if (!(dc = dyn_cast<clang::NamespaceDecl>(D))) {
4848 dc = dyn_cast<clang::RecordDecl>(D);
4855 possibleEnum = cling::utils::Lookup::Tag(&
fInterpreter->getSema(),
name, dc);
4857 Error(
"TCling::GetEnum",
"DeclContext not found for %s .\n",
name);
4866 if (possibleEnum && (possibleEnum != (clang::Decl*)-1)
4867 && isa<clang::EnumDecl>(possibleEnum)) {
4868 return possibleEnum;
4878 if (!gv)
return nullptr;
4880 llvm::StringRef mangled_name = gv->getName();
4895 std::string scopename(demangled_name_c);
4896 free(demangled_name_c);
4902 std::string dataname;
4904 if (!strncmp(scopename.c_str(),
"typeinfo for ",
sizeof(
"typeinfo for ")-1)) {
4905 scopename.erase(0,
sizeof(
"typeinfo for ")-1);
4906 }
else if (!strncmp(scopename.c_str(),
"vtable for ",
sizeof(
"vtable for ")-1)) {
4907 scopename.erase(0,
sizeof(
"vtable for ")-1);
4910 std::string::size_type pos = scopename.rfind(
'(');
4911 if (pos != std::string::npos) {
4915 pos = scopename.rfind(
':');
4916 if (pos != std::string::npos) {
4917 if ((pos != 0) && (scopename[pos-1] ==
':')) {
4918 dataname = scopename.substr(pos+1);
4919 scopename.erase(pos-1);
4923 dataname = scopename;
4931 if (scopename.size()) {
4947 Error(
"GetDataMemberWithValue()",
"not implemented");
4957 Error(
"GetDataMemberAtAddr()",
"not implemented");
4967 const char* params,
Bool_t objectIsConst )
4985 return mangled_name;
5000 GetMethod(method,
proto, objectIsConst,
nullptr ,
mode).GetMangledName();
5012 const char* params,
Bool_t objectIsConst )
5053 std::vector<DeclId_t>& res)
const
5056 clang::ASTContext& Ctx = S.Context;
5057 const clang::Decl* CtxDecl
5059 Ctx.getTranslationUnitDecl();
5060 auto RecDecl = llvm::dyn_cast<const clang::RecordDecl>(CtxDecl);
5061 const clang::DeclContext* DeclCtx = RecDecl;
5064 DeclCtx = dyn_cast<clang::NamespaceDecl>(CtxDecl);
5065 if (!DeclCtx)
return;
5067 clang::DeclarationName DName;
5072 if (RecDecl->getNameAsString() == funcname) {
5073 clang::QualType QT = Ctx.getTypeDeclType(RecDecl);
5074 DName = Ctx.DeclarationNames.getCXXConstructorName(Ctx.getCanonicalType(QT));
5075 }
else if (funcname[0] ==
'~' && RecDecl->getNameAsString() == funcname + 1) {
5076 clang::QualType QT = Ctx.getTypeDeclType(RecDecl);
5077 DName = Ctx.DeclarationNames.getCXXDestructorName(Ctx.getCanonicalType(QT));
5079 DName = &Ctx.Idents.get(funcname);
5082 DName = &Ctx.Idents.get(funcname);
5086 clang::LookupResult
R(S, DName, clang::SourceLocation(),
5087 Sema::LookupOrdinaryName, clang::Sema::NotForRedeclaration);
5088 R.suppressDiagnostics();
5089 S.LookupQualifiedName(
R,
const_cast<DeclContext*
>(DeclCtx));
5090 if (
R.empty())
return;
5092 res.reserve(res.size() + (
R.end() -
R.begin()));
5093 for (clang::LookupResult::iterator IR =
R.begin(), ER =
R.end();
5095 if (
const clang::FunctionDecl* FD
5096 = llvm::dyn_cast<const clang::FunctionDecl>(*IR)) {
5097 if (!FD->getDescribedFunctionTemplate()) {
5100 }
else if (
const auto *USD = llvm::dyn_cast<const clang::UsingShadowDecl>(*IR)) {
5102 if (llvm::isa<clang::FunctionDecl>(USD->getTargetDecl())) {
5123 GetMethod(method,
proto, objectIsConst,
nullptr ,
mode).InterfaceMethod();
5262 const char* params,
Bool_t objectIsConst,
int* error)
5282 const char* params,
int* error)
5284 Execute(obj,cl,method,params,
false,error);
5299 Error(
"Execute",
"No method was defined");
5308 if (argc > nparms) {
5309 Error(
"Execute",
"Too many parameters to call %s, got %d but expected at most %d.",method->
GetName(),argc,nparms);
5312 if (nparms != argc) {
5322 Int_t firstDefault = -1;
5323 for (
Int_t i = 0;
i < nparms;
i ++) {
5330 if (firstDefault >= 0) {
5331 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);
5333 Error(
"Execute",
"Too few arguments to call %s, got only %d but expected %d.",method->
GetName(),argc,nparms);
5339 const char* listpar =
"";
5344 for (
Int_t i = 0;
i < argc;
i ++) {
5360 complete += nxtpar->
String();
5363 listpar = complete.
Data();
5390 const void* args[] ,
5395 Error(
"ExecuteWithArgsAndReturn",
"No method was defined");
5422 Warning(
"GetTopLevelMacroName",
"Must change return type!");
5469#if defined(R__MUST_REVISIT)
5470#if R__MUST_REVISIT(6,0)
5471 Warning(
"GetCurrentMacroName",
"Must change return type!");
5484 TTHREAD_TLS_DECL(std::string,t);
5486 if (!strstr(typeDesc,
"(*)(")) {
5487 const char *s = strchr(typeDesc,
' ');
5488 const char *template_start = strchr(typeDesc,
'<');
5489 if (!strcmp(typeDesc,
"long long")) {
5492 else if (!strncmp(typeDesc,
"unsigned ", s + 1 - typeDesc)) {
5499 else if (s && (template_start ==
nullptr || (s < template_start))) {
5509 auto l = t.length();
5510 while (
l > 0 && (t[
l - 1] ==
'*' || t[
l - 1] ==
'&'))
5518 assert(rootmapfile && *rootmapfile);
5520 llvm::StringRef libName = llvm::sys::path::filename(rootmapfile);
5521 libName.consume_back(
".rootmap");
5523 return !
gInterpreter->HasPCMForLibrary(libName.str().c_str());
5534 if (!(rootmapfile && *rootmapfile))
5541 const std::map<char, unsigned int> keyLenMap = {{
'c',6},{
'n',10},{
't',8},{
'h',7},{
'e',5},{
'v',4}};
5543 std::string rootmapfileNoBackslash(rootmapfile);
5545 std::replace(rootmapfileNoBackslash.begin(), rootmapfileNoBackslash.end(),
'\\',
'/');
5548 if (
fRootmapFiles->FindObject(rootmapfileNoBackslash.c_str()))
5552 std::string lineDirective = std::string(
"\n#line 2 \"Forward declarations from ") + rootmapfileNoBackslash +
"\"\n";
5554 std::ifstream file(rootmapfileNoBackslash);
5557 std::string lib_name;
5559 bool newFormat =
false;
5560 while (getline(file,
line,
'\n')) {
5561 if (!newFormat && (
line.compare(0, 8,
"Library.") == 0 ||
line.compare(0, 8,
"Declare.") == 0)) {
5567 if (
line.compare(0, 9,
"{ decls }") == 0) {
5570 while (getline(file,
line,
'\n')) {
5573 if (!uniqueString) {
5574 Error(
"ReadRootmapFile",
"Cannot handle \"{ decls }\" sections in custom rootmap file %s",
5575 rootmapfileNoBackslash.c_str());
5578 if (!lineDirective.empty())
5579 uniqueString->
Append(lineDirective);
5583 const char firstChar =
line[0];
5584 if (firstChar ==
'[') {
5586 auto brpos =
line.find(
']');
5587 if (brpos == string::npos)
5589 lib_name =
line.substr(1, brpos - 1);
5591 lib_name.erase(lib_name.find_last_not_of(
' ') + 1);
5592 lib_name.erase(0, lib_name.find_first_not_of(
' '));
5594 TString lib_nameTstr(lib_name.c_str());
5596 const char *lib = ((
TObjString *)tokens->
At(0))->GetName();
5597 const char *wlib =
gSystem->DynamicPathName(lib,
kTRUE);
5599 Info(
"ReadRootmapFile",
"%s: New section for %s", rootmapfile, lib_nameTstr.
Data());
5601 Info(
"ReadRootmapFile",
"%s: Section for %s (library does not exist)", rootmapfile, lib_nameTstr.
Data());
5607 auto keyLenIt = keyLenMap.find(firstChar);
5608 if (keyLenIt == keyLenMap.end())
5610 unsigned int keyLen = keyLenIt->second;
5612 const char *keyname =
line.c_str() + keyLen;
5614 Info(
"ReadRootmapFile",
"%s: class %s in %s", rootmapfile, keyname, lib_name.c_str());
5617 if (lib_name != isThere->
GetValue()) {
5618 if (firstChar ==
'n') {
5620 Info(
"ReadRootmapFile",
5621 "While processing %s, namespace %s was found to be associated to %s although it is already "
5623 rootmapfile, keyname, lib_name.c_str(), isThere->
GetValue());
5624 }
else if (firstChar ==
'h') {
5627 fMapfile->SetValue(keyname, lib_name.c_str());
5630 "While processing %s, %s %s was found to be associated to %s although it is already "
5632 rootmapfile,
line.substr(0, keyLen - 1).c_str(), keyname, lib_name.c_str(),
5637 Info(
"ReadRootmapFile",
"While processing %s, key %s was found to be already defined for %s",
5638 rootmapfile, keyname, lib_name.c_str());
5641 fMapfile->SetValue(keyname, lib_name.c_str());
5678 if (!
gSystem->Getenv(
"ROOTENV_NO_HOME")) {
5684 if (strcmp(
gSystem->HomeDirectory(),
gSystem->WorkingDirectory())) {
5694 fMapfile->IgnoreDuplicates(ignore);
5699 using namespace clang;
5701 class ExtVisibleStorageAdder:
public RecursiveASTVisitor<ExtVisibleStorageAdder>{
5707 ExtVisibleStorageAdder(std::unordered_set<const NamespaceDecl*>& nsSet): fNSSet(nsSet) {};
5708 bool VisitNamespaceDecl(NamespaceDecl* nsDecl) {
5713 nsDecl->setHasExternalVisibleStorage();
5714 fNSSet.insert(nsDecl);
5717 bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl* specDecl) {
5720 if (specDecl->getTemplateSpecializationKind() == TSK_ExplicitSpecialization)
5722 specDecl->setHasExternalLexicalStorage();
5734 std::unordered_set<const NamespaceDecl*>& fNSSet;
5781 for (
Int_t j = 0; j <
i; j++) {
5789 void* dirp =
gSystem->OpenDirectory(
d);
5792 Info(
"LoadLibraryMap",
"%s",
d.Data());
5795 while ((
f1 =
gSystem->GetDirEntry(dirp))) {
5797 if (
f.EndsWith(
".rootmap")) {
5803 Info(
"LoadLibraryMap",
" rootmap file: %s", p.
Data());
5821 if (
f.BeginsWith(
"rootmap")) {
5826 Warning(
"LoadLibraryMap",
"please rename %s to end with \".rootmap\"", p.
Data());
5839 if (rootmapfile && *rootmapfile) {
5846 else if (res == -3) {
5851 fMapfile->IgnoreDuplicates(ignore);
5856 while ((rec = (
TEnvRec*) next())) {
5858 if (!strncmp(cls.
Data(),
"Library.", 8) && cls.
Length() > 8) {
5860 TString libs = rec->GetValue();
5866 const char* lib = ((
TObjString*)tokens->
At(0))->GetName();
5875 const char* wlib =
gSystem->DynamicPathName(lib,
kTRUE);
5877 Info(
"LoadLibraryMap",
"class %s in %s", cls.
Data(), wlib);
5880 Info(
"LoadLibraryMap",
"class %s in %s (library does not exist)", cls.
Data(), lib);
5886 else if (!strncmp(cls.
Data(),
"Declare.", 8) && cls.
Length() > 8) {
5896 cling::Transaction* T =
nullptr;
5898 assert(cling::Interpreter::kSuccess == compRes &&
"A declaration in a rootmap could not be compiled");
5900 if (compRes!=cling::Interpreter::kSuccess){
5902 "Problems in %s declaring '%s' were encountered.", rootmapfile, uniqueString.
Data()) ;
5907 for (
auto declIt = T->decls_begin(); declIt < T->decls_end(); ++declIt) {
5908 if (declIt->m_DGR.isSingleDecl()) {
5909 if (Decl* D = declIt->m_DGR.getSingleDecl()) {
5910 if (clang::isa<TagDecl>(D) || clang::isa<NamespaceDecl>(D)) {
5911 evsAdder.TraverseDecl(D);
5946 for (
Int_t ilib = 0; ilib < nrSharedLibs; ilib++) {
5948 const TString sharedLibBaseStr =
gSystem->BaseName(sharedLibStr);
5953 TString rootMapBaseStr = sharedLibBaseStr;
5954 if (sharedLibBaseStr.
EndsWith(
".dll")) {
5957 else if (sharedLibBaseStr.
EndsWith(
".DLL")) {
5960 else if (sharedLibBaseStr.
EndsWith(
".so")) {
5963 else if (sharedLibBaseStr.
EndsWith(
".sl")) {
5966 else if (sharedLibBaseStr.
EndsWith(
".dl")) {
5969 else if (sharedLibBaseStr.
EndsWith(
".a")) {
5973 Error(
"ReloadAllSharedLibraryMaps",
"Unknown library type %s", sharedLibBaseStr.
Data());
5977 rootMapBaseStr +=
".rootmap";
5978 const char* rootMap =
gSystem->Which(
gSystem->GetDynamicPath(), rootMapBaseStr);
5980 Error(
"ReloadAllSharedLibraryMaps",
"Could not find rootmap %s in path", rootMapBaseStr.
Data());
5987 Error(
"ReloadAllSharedLibraryMaps",
"Error loading map %s", rootMap);
6008 const TString sharedLibBaseStr =
gSystem->BaseName(sharedLibStr);
6022 if (!
fMapfile || !library || !*library) {
6035 while ((rec = (
TEnvRec *) next())) {
6039 TString libs = rec->GetValue();
6045 const char* lib = ((
TObjString *)tokens->
At(0))->GetName();
6046 if (!strncmp(cls.
Data(),
"Library.", 8) && cls.
Length() > 8) {
6055 if (!strncmp(lib, libname.
Data(),
len)) {
6056 if (
fMapfile->GetTable()->Remove(rec) ==
nullptr) {
6057 Error(
"UnloadLibraryMap",
"entry for <%s, %s> not found in library map table", cls.
Data(), lib);
6065 TString library_rootmap(library);
6066 if (!library_rootmap.
EndsWith(
".rootmap"))
6067 library_rootmap.
Append(
".rootmap");
6118 if (err)
return nullptr;
6120 free(demangled_name);
6138 std::string demangled_name(demangled_name_c);
6139 free(demangled_name_c);
6170 const char* deplib = ((
TObjString*)tokens->
At(
i))->GetName();
6171 if (
gROOT->LoadClass(cls, deplib) == 0) {
6173 gCling->Info(
"TCling::AutoLoad",
6174 "loaded dependent library %s for %s", deplib, cls);
6178 gCling->Error(
"TCling::AutoLoad",
6179 "failure loading dependent library %s for %s",
6183 const char* lib = ((
TObjString*)tokens->
At(0))->GetName();
6184 if (lib && lib[0]) {
6185 if (
gROOT->LoadClass(cls, lib) == 0) {
6187 gCling->Info(
"TCling::AutoLoad",
6188 "loaded library %s for %s", lib, cls);
6193 gCling->Error(
"TCling::AutoLoad",
6194 "failure loading library %s for %s", lib, cls);
6209 bool nameIsNormalized)
6215 if (!visited.insert(std::string(cls)).second)
6225 for (
auto element :
proto->GetData()) {
6226 if (element->IsBasic())
6228 const char *subtypename = element->GetTypeName();
6244 if (classinfo &&
gInterpreter->ClassInfo_IsValid(classinfo)
6248 while (
gInterpreter->DataMemberInfo_Next(memberinfo)) {
6281 Info(
"TCling::AutoLoad",
"Explicitly disabled (the class name is %s)", cls);
6290 if (!knowDictNotLoaded &&
gClassTable->GetDictNorm(cls)) {
6301 Info(
"TCling::AutoLoad",
6302 "Trying to autoload for %s", cls);
6307 Info(
"TCling::AutoLoad",
6308 "Disabled due to gROOT or gInterpreter being invalid/not ready (the class name is %s)", cls);
6329 std::unordered_set<std::string> visited;
6338 cling::Interpreter *interpreter)
6340 std::string code = gNonInterpreterClassDef ;
6347 code += (
"#include \"");
6351 code += (
"#ifdef __ROOTCLING__\n"
6352 "#undef __ROOTCLING__\n"
6353 + gInterpreterClassDef +
6356 cling::Interpreter::CompilationResult cr;
6362 Sema &SemaR = interpreter->getSema();
6364 clangDiagSuppr diagSuppr(SemaR.getDiagnostics());
6366 #if defined(R__MUST_REVISIT)
6367 #if R__MUST_REVISIT(6,2)
6368 Warning(
"TCling::RegisterModule",
"Diagnostics suppression should be gone by now.");
6372 cr = interpreter->parseForModule(code);
6390 Int_t nHheadersParsed = 0;
6391 unsigned long offset = 0;
6392 if (strncmp(cls,
"const ", 6) == 0) {
6397 bool skipFirstEntry =
false;
6398 std::vector<std::string> autoparseKeys;
6399 if (strchr(cls,
'<')) {
6405 if (!autoparseKeys.empty() && !autoparseKeys[0].empty()) {
6410 TString templateName(autoparseKeys[0]);
6411 auto tokens = templateName.
Tokenize(
"::");
6412 clang::NamedDecl* previousScopeAsNamedDecl =
nullptr;
6413 clang::DeclContext* previousScopeAsContext =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
6415 previousScopeAsContext =
fInterpreter->getSema().getStdNamespace();
6416 auto nTokens = tokens->GetEntriesFast();
6417 for (
Int_t tk = 0; tk < nTokens; ++tk) {
6418 auto scopeObj = tokens->UncheckedAt(tk);
6419 auto scopeName = ((
TObjString*) scopeObj)->String().Data();
6420 previousScopeAsNamedDecl = cling::utils::Lookup::Named(&
fInterpreter->getSema(), scopeName, previousScopeAsContext);
6422 if ((clang::NamedDecl*)-1 == previousScopeAsNamedDecl)
break;
6423 previousScopeAsContext = llvm::dyn_cast_or_null<clang::DeclContext>(previousScopeAsNamedDecl);
6424 if (!previousScopeAsContext)
break;
6428 if ((clang::NamedDecl*)-1 != previousScopeAsNamedDecl) {
6429 if (
auto templateDecl = llvm::dyn_cast_or_null<clang::ClassTemplateDecl>(previousScopeAsNamedDecl)) {
6430 if (
auto templatedDecl = templateDecl->getTemplatedDecl()) {
6431 skipFirstEntry = templatedDecl->hasDefinition();
6438 if (topLevel) autoparseKeys.emplace_back(cls);
6440 for (
const auto & apKeyStr : autoparseKeys) {
6441 if (skipFirstEntry) {
6442 skipFirstEntry=
false;
6445 if (apKeyStr.empty())
continue;
6446 const char *apKey = apKeyStr.c_str();
6450 Info(
"TCling::AutoParse",
6451 "Starting autoparse for %s\n", apKey);
6456 const cling::Transaction *T =
fInterpreter->getCurrentTransaction();
6458 auto const &hNamesPtrs = iter->second;
6460 Info(
"TCling::AutoParse",
6461 "We can proceed for %s. We have %s headers.", apKey, std::to_string(hNamesPtrs.size()).c_str());
6463 for (
auto & hName : hNamesPtrs) {
6465 if (0 !=
fPayloads.count(normNameHash)) {
6466 float initRSSval=0.f, initVSIZEval=0.f;
6468 (void) initVSIZEval;
6471 "Parsing full payload for %s", apKey);
6478 if (cRes != cling::Interpreter::kSuccess) {
6479 if (hName[0] ==
'\n')
6480 Error(
"AutoParse",
"Error parsing payload code for class %s with content:\n%s", apKey, hName);
6489 Info(
"Autoparse",
">>> RSS key %s - before %.3f MB - after %.3f MB - delta %.3f MB", apKey, initRSSval, endRSSval, endRSSval-initRSSval);
6490 Info(
"Autoparse",
">>> VSIZE key %s - before %.3f MB - after %.3f MB - delta %.3f MB", apKey, initVSIZEval, endVSIZEval, endVSIZEval-initVSIZEval);
6496 "Parsing single header %s", hName);
6499 if (cRes != cling::Interpreter::kSuccess) {
6500 Error(
"AutoParse",
"Error parsing headerfile %s for class %s.", hName, apKey);
6512 if (strchr(apKey,
'<')) {
6519 return nHheadersParsed;
6529 if (llvm::StringRef(cls).contains(
"(lambda)"))
6543 Info(
"TCling::AutoParse",
6544 "Trying to autoparse for %s", cls);
6566 return nHheadersParsed > 0 ? 1 : 0;
6574 StringRef errMsg(errmessage);
6575 if (errMsg.contains(
"undefined symbol: ")) {
6577 std::string mangled_name = std::string(errMsg.split(
"undefined symbol: ").second);
6578 void* res = ((
TCling*)
gCling)->LazyFunctionCreatorAutoload(mangled_name);
6579 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
6580 if (res && DLM && (DLM->loadLibrary(libStem, permanent, resolved) == cling::DynamicLibraryManager::kLoadLibSuccess))
6599 if (
void* Addr = llvm::sys::DynamicLibrary::SearchForAddressOfSymbol(dlsym_mangled_name))
6602 const cling::DynamicLibraryManager &DLM = *
GetInterpreterImpl()->getDynamicLibraryManager();
6605 auto LibLoader = [](
const std::string& LibName) ->
bool {
6606 if (
gSystem->Load(LibName.c_str(),
"",
false) < 0) {
6607 ::Error(
"TCling__LazyFunctionCreatorAutoloadForModule",
6608 "Failed to load library %s", LibName.c_str());
6614 std::string libName = DLM.searchLibrariesForSymbol(mangled_name,
6617 assert(!llvm::StringRef(libName).startswith(
"libNew") &&
6618 "We must not resolve symbols from libNew!");
6620 if (libName.empty())
6623 if (!LibLoader(libName))
6626 return llvm::sys::DynamicLibrary::SearchForAddressOfSymbol(dlsym_mangled_name);
6646 const NamedDecl *oldDef = llvm::dyn_cast_or_null<NamedDecl>(cci->
GetDecl());
6647 if (!oldDef || (def && def != oldDef)) {
6661 if (!alias && def !=
nullptr)
6683 const TagDecl *td = dyn_cast<TagDecl>(ND);
6684 const NamespaceDecl *ns = dyn_cast<NamespaceDecl>(ND);
6685 const NamedDecl *canon =
nullptr;
6688 TagDecl* tdDef =
nullptr;
6690 canon = tdDef = td->getDefinition();
6694 if (!tdDef->isCompleteDefinition() || llvm::isa<clang::FunctionDecl>(tdDef->getDeclContext())) {
6700 auto declName = tdDef->getNameAsString();
6711 clang::QualType
type(tdDef->getTypeForDecl(), 0);
6714 canon = ns->getCanonicalDecl();
6715 name = ND->getQualifiedNameAsString();
6717 name = ND->getQualifiedNameAsString();
6766 std::set<TClass*> modifiedTClasses;
6771 bool isTUTransaction =
false;
6772 if (!T.empty() && T.decls_begin() + 1 == T.decls_end() && !T.hasNestedTransactions()) {
6773 clang::Decl* FirstDecl = *(T.decls_begin()->m_DGR.begin());
6774 if (llvm::isa<clang::TranslationUnitDecl>(FirstDecl)) {
6777 isTUTransaction =
true;
6781 std::set<const void*> TransactionDeclSet;
6782 if (!isTUTransaction && T.decls_end() - T.decls_begin()) {
6783 const clang::Decl* WrapperFD = T.getWrapperFD();
6784 for (cling::Transaction::const_iterator
I = T.decls_begin(), E = T.decls_end();
6786 if (
I->m_Call != cling::Transaction::kCCIHandleTopLevelDecl
6787 &&
I->m_Call != cling::Transaction::kCCIHandleTagDeclDefinition)
6790 for (DeclGroupRef::const_iterator DI =
I->m_DGR.begin(),
6791 DE =
I->m_DGR.end(); DI != DE; ++DI) {
6792 if (*DI == WrapperFD)
6794 TransactionDeclSet.insert(*DI);
6795 ((
TCling*)
gCling)->HandleNewDecl(*DI,
false, modifiedTClasses);
6802 for (cling::Transaction::const_iterator
I = T.deserialized_decls_begin(),
6803 E = T.deserialized_decls_end();
I != E; ++
I) {
6804 for (DeclGroupRef::const_iterator DI =
I->m_DGR.begin(),
6805 DE =
I->m_DGR.end(); DI != DE; ++DI)
6806 if (TransactionDeclSet.find(*DI) == TransactionDeclSet.end()) {
6822 std::vector<TClass*> modifiedTClassesDiff(modifiedTClasses.size());
6823 std::vector<TClass*>::iterator it;
6824 it = set_difference(modifiedTClasses.begin(), modifiedTClasses.end(),
6827 modifiedTClassesDiff.begin());
6828 modifiedTClassesDiff.resize(it - modifiedTClassesDiff.begin());
6831 ((
TCling*)
gCling)->GetModTClasses().insert(modifiedTClassesDiff.begin(),
6832 modifiedTClassesDiff.end());
6833 for (std::vector<TClass*>::const_iterator
I = modifiedTClassesDiff.begin(),
6834 E = modifiedTClassesDiff.end();
I != E; ++
I) {
6836 if (!
gROOT->GetListOfClasses()->FindObject(*
I)) {
6858 cling::Transaction::const_nested_iterator iNested = T.nested_begin();
6859 for (cling::Transaction::const_iterator
I = T.decls_begin(), E = T.decls_end();
6861 if (
I->m_Call == cling::Transaction::kCCIHandleVTable)
6863 if (
I->m_Call == cling::Transaction::kCCINone) {
6869 for (
auto &D :
I->m_DGR)
6877 auto Lists = std::make_tuple((TListOfDataMembers *)
gROOT->GetListOfGlobals(),
6878 (TListOfFunctions *)
gROOT->GetListOfGlobalFunctions(),
6879 (TListOfFunctionTemplates *)
gROOT->GetListOfFunctionTemplates(),
6880 (TListOfEnums *)
gROOT->GetListOfEnums());
6895 if (D->isFromASTFile())
6903 if (isa<VarDecl>(D) || isa<FieldDecl>(D) || isa<EnumConstantDecl>(D)) {
6905 if (
LODM.GetClass())
6909 }
else if (isa<FunctionDecl>(D)) {
6911 }
else if (isa<FunctionTemplateDecl>(D)) {
6913 }
else if (isa<EnumDecl>(D)) {
6919 for (TIter
I =
E->GetConstants();
auto EC = (TEnumConstant *)
I(); )
6924 }
else if (isa<RecordDecl>(D) || isa<NamespaceDecl>(D)) {
6925 if (isa<RecordDecl>(D) && !cast<RecordDecl>(D)->isCompleteDefinition())
6928 std::vector<TClass *> Classes;
6931 for (
auto &
C : Classes) {
6932 auto Lists = std::make_tuple((TListOfDataMembers *)
C->GetListOfDataMembers(),
6933 (TListOfFunctions *)
C->GetListOfMethods(),
6934 (TListOfFunctionTemplates *)
C->GetListOfFunctionTemplates(),
6935 (TListOfEnums *)
C->GetListOfEnums());
6936 for (
auto &
I : cast<DeclContext>(D)->decls())
6940 if (D->getKind() != Decl::Namespace
6941 || cast<NamespaceDecl>(D)->isOriginalNamespace())
6942 C->ResetClassInfo();
6954 std::size_t normNameHash = triter->second;
6960 auto const &hNamesPtrs = iter->second;
6961 for (
auto &hName : hNamesPtrs) {
6963 Info(
"TransactionRollback",
6964 "Restoring ability to autoaparse: %s", hName);
7001 using namespace clang;
7002 if (
const Decl *D = LH.findScope(cls, cling::LookupHelper::NoDiagnostics,
7004 if (!D->isFromASTFile()) {
7006 Warning(
"GetClassSharedLibsForModule",
"Decl found for %s is not part of a module", cls);
7009 class ModuleCollector :
public ConstDeclVisitor<ModuleCollector> {
7010 llvm::DenseSet<Module *> &m_TopLevelModules;
7013 ModuleCollector(llvm::DenseSet<Module *> &TopLevelModules) : m_TopLevelModules(TopLevelModules) {}
7014 void Collect(
const Decl *D) { Visit(D); }
7016 void VisitDecl(
const Decl *D)
7026 if (!D->hasOwningModule())
7028 if (Module *M = D->getOwningModule()->getTopLevelModule())
7029 m_TopLevelModules.insert(M);
7032 void VisitTemplateArgument(
const TemplateArgument &
TA)
7034 switch (
TA.getKind()) {
7035 case TemplateArgument::Null:
7036 case TemplateArgument::Integral:
7037 case TemplateArgument::Pack:
7038 case TemplateArgument::NullPtr:
7039 case TemplateArgument::Expression:
7040 case TemplateArgument::Template:
7041 case TemplateArgument::TemplateExpansion:
return;
7042 case TemplateArgument::Type:
7043 if (
const TagType *TagTy = dyn_cast<TagType>(
TA.getAsType()))
7044 return Visit(TagTy->getDecl());
7046 case TemplateArgument::Declaration:
return Visit(
TA.getAsDecl());
7048 llvm_unreachable(
"Invalid TemplateArgument::Kind!");
7051 void VisitClassTemplateSpecializationDecl(
const ClassTemplateSpecializationDecl *CTSD)
7053 if (CTSD->getOwningModule())
7056 VisitDecl(CTSD->getSpecializedTemplate());
7057 const TemplateArgumentList &ArgList = CTSD->getTemplateArgs();
7058 for (
const TemplateArgument *Arg = ArgList.data(), *ArgEnd = Arg + ArgList.size(); Arg != ArgEnd; ++Arg) {
7059 VisitTemplateArgument(*Arg);
7064 llvm::DenseSet<Module *> TopLevelModules;
7065 ModuleCollector
m(TopLevelModules);
7068 for (
auto M : TopLevelModules) {
7071 if (!M->LinkLibraries.size())
7074 if (M->Name ==
"Core")
7076 assert(M->LinkLibraries.size() == 1);
7079 result += M->LinkLibraries[0].Library;
7100 llvm::StringRef className = cls;
7106 if (className.contains(
"(lambda)"))
7110 cling::LookupHelper &LH =
fInterpreter->getLookupHelper();
7112 if (!libs.empty()) {
7118 if (!cls || !*cls) {
7123 TEnvRec* libs_record =
nullptr;
7124 libs_record =
fMapfile->Lookup(cls);
7126 const char* libs = libs_record->
GetValue();
7127 return (*libs) ? libs :
nullptr;
7134 c.ReplaceAll(
"::",
"@@");
7137 c.ReplaceAll(
" ",
"-");
7141 TEnvRec* libs_record =
nullptr;
7144 const char* libs = libs_record->
GetValue();
7145 return (*libs) ? libs :
nullptr;
7159 cling::Interpreter *interp,
7160 bool skipLoadedLibs =
true)
7163 if (!llvm::sys::path::is_absolute(lib)) {
7164 if (!
gSystem->FindDynamicLibrary(LibFullPath,
true)) {
7165 Error(
"TCling__GetSharedLibImmediateDepsSlow",
"Cannot find library '%s'", lib.c_str());
7169 assert(llvm::sys::fs::exists(lib) &&
"Must exist!");
7170 lib = llvm::sys::path::filename(lib).str();
7173 auto ObjF = llvm::object::ObjectFile::createObjectFile(LibFullPath.
Data());
7175 Warning(
"TCling__GetSharedLibImmediateDepsSlow",
"Failed to read object file %s", lib.c_str());
7179 llvm::object::ObjectFile *BinObjFile = ObjF.get().getBinary();
7181 std::set<string> DedupSet;
7182 std::string Result = lib +
' ';
7183 for (
const auto &S : BinObjFile->symbols()) {
7184 uint32_t Flags = llvm::cantFail(S.getFlags());
7186 if (!(Flags & llvm::object::SymbolRef::SF_Undefined))
7190 if (Flags & llvm::object::SymbolRef::SF_Weak)
7192 llvm::Expected<StringRef> SymNameErr = S.getName();
7194 Warning(
"GetSharedLibDepsForModule",
"Failed to read symbol");
7197 llvm::StringRef SymName = SymNameErr.
get();
7198 if (SymName.empty())
7201 if (BinObjFile->isELF()) {
7205 if (SymName.contains(
"@GLIBCXX") || SymName.contains(
"@CXXABI") ||
7206 SymName.contains(
"@GLIBC") || SymName.contains(
"@GCC"))
7214 static constexpr llvm::StringRef RegisterClasses(
"_Jv_RegisterClasses");
7215 static constexpr llvm::StringRef RegisterCloneTable(
"_ITM_registerTMCloneTable");
7216 static constexpr llvm::StringRef DeregisterCloneTable(
"_ITM_deregisterTMCloneTable");
7217 if (SymName == RegisterClasses ||
7218 SymName == RegisterCloneTable ||
7219 SymName == DeregisterCloneTable)
7224 if (skipLoadedLibs) {
7226 if (llvm::sys::DynamicLibrary::SearchForAddressOfSymbol(SymNameForDlsym))
7231 std::string found = interp->getDynamicLibraryManager()->searchLibrariesForSymbol(SymName,
false);
7237 if (!found.empty()) {
7238 std::string cand = llvm::sys::path::filename(found).str();
7239 if (!DedupSet.insert(cand).second)
7242 Result += cand +
' ';
7252 llvm::SmallString<256> rootmapName;
7253 if (!lib.startswith(
"lib"))
7254 rootmapName.append(
"lib");
7256 rootmapName.append(llvm::sys::path::filename(lib));
7257 llvm::sys::path::replace_extension(rootmapName,
"rootmap");
7259 if (
gCling->GetRootMapFiles()->FindObject(rootmapName.c_str()))
7263 llvm::StringRef rootmapNameNoLib = rootmapName.str();
7264 if (rootmapNameNoLib.consume_front(
"lib"))
7265 return gCling->GetRootMapFiles()->FindObject(rootmapNameNoLib.data());
7272 if (
gCling->HasPCMForLibrary(lib.data()))
7288 if (llvm::sys::path::is_absolute(lib) && !llvm::sys::fs::exists(lib))
7292 llvm::SmallString<512> rootmapName(lib);
7293 llvm::sys::path::replace_extension(rootmapName,
"rootmap");
7294 if (llvm::sys::fs::exists(rootmapName)) {
7296 Info(
"Load",
"loading %s", rootmapName.c_str());
7303 Warning(
"TCling::GetSharedLibDeps",
"Precomputed dependencies available but scanning '%s'", lib);
7308 if (!libs.empty()) {
7314 if (!
fMapfile || !lib || !lib[0]) {
7325 while ((rec = (
TEnvRec*) next())) {
7326 const char* libs = rec->GetValue();
7327 if (!strncmp(libs, libname.
Data(),
len) && strlen(libs) >=
len
7328 && (!libs[
len] || libs[
len] ==
' ' || libs[
len] ==
'.')) {
7341#if defined(R__MUST_REVISIT)
7342#if R__MUST_REVISIT(6,2)
7343 Warning(
"IsErrorMessagesEnabled",
"Interface not available yet.");
7355#if defined(R__MUST_REVISIT)
7356#if R__MUST_REVISIT(6,2)
7357 Warning(
"SetErrorMessages",
"Interface not available yet.");
7373 llvm::SmallVector<std::string, 10> includePaths;
7375 fInterpreter->GetIncludePaths(includePaths,
false,
true);
7376 if (
const size_t nPaths = includePaths.size()) {
7377 assert(!(nPaths & 1) &&
"GetIncludePath, number of paths and options is not equal");
7379 for (
size_t i = 0;
i < nPaths;
i += 2) {
7384 if (includePaths[
i] !=
"-I")
7418 assert(fout !=
nullptr &&
"DisplayIncludePath, 'fout' parameter is null");
7420 llvm::SmallVector<std::string, 10> includePaths;
7422 fInterpreter->GetIncludePaths(includePaths,
false,
true);
7423 if (
const size_t nPaths = includePaths.size()) {
7424 assert(!(nPaths & 1) &&
"DisplayIncludePath, number of paths and options is not equal");
7426 std::string allIncludes(
"include path:");
7427 for (
size_t i = 0;
i < nPaths;
i += 2) {
7429 allIncludes += includePaths[
i];
7431 if (includePaths[
i] !=
"-I")
7433 allIncludes += includePaths[
i + 1];
7436 fprintf(fout,
"%s\n", allIncludes.c_str());
7456#if defined(R__MUST_REVISIT)
7457#if R__MUST_REVISIT(6,2)
7458 Warning(
"GenericError",
"Interface not available yet.");
7486#if defined(R__MUST_REVISIT)
7487#if R__MUST_REVISIT(6,2)
7488 Warning(
"GetSecurityError",
"Interface not available yet.");
7501 cling::Interpreter::CompilationResult compRes;
7503 return compRes == cling::Interpreter::kFailure;
7522 TTHREAD_TLS_DECL(std::string,buffer);
7524 return buffer.c_str();
7605#if defined(R__MUST_REVISIT)
7606#if R__MUST_REVISIT(6,2)
7607 Warning(
"SetErrmsgcallback",
"Interface not available yet.");
7616 &
fInterpreter->getDiagnostics().getDiagnosticOptions(),
7618 [] (clang::DiagnosticsEngine::Level Level,
const std::string &
Info) {
7619 if (Level == clang::DiagnosticsEngine::Warning) {
7620 ::Warning(
"cling",
"%s", Info.c_str());
7621 }
else if (Level == clang::DiagnosticsEngine::Error
7622 || Level == clang::DiagnosticsEngine::Fatal) {
7628 fInterpreter->replaceDiagnosticConsumer(consumer,
true);
7630 fInterpreter->replaceDiagnosticConsumer(
nullptr);
7649 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
7650 std::string canonical = DLM->lookupLibrary(path);
7651 if (canonical.empty()) {
7655 cling::Interpreter::CompilationResult compRes;
7657 return compRes == cling::Interpreter::kFailure;
7661 return std::unique_ptr<TInterpreterValue>(
new TClingValue);
7668 std::vector<std::string>& completions)
7679 auto V =
reinterpret_cast<cling::Value*
>(
value.GetValAddr());
7681 return compRes!=cling::Interpreter::kSuccess ? 0 : 1 ;
7688 using namespace cling;
7702 if (
value.isValid() &&
value.needsManagedAllocation()) {
7723 auto iSpecObj = iSpecObjMap->second.find(Name);
7724 if (iSpecObj != iSpecObjMap->second.end()) {
7726 return iSpecObj->second;
7733 ASTContext& C = SemaR.getASTContext();
7734 Preprocessor &PP = SemaR.getPreprocessor();
7735 Parser& P =
const_cast<Parser&
>(
fInterpreter->getParser());
7736 Preprocessor::CleanupAndRestoreCacheRAII cleanupRAII(PP);
7737 Parser::ParserCurTokRestoreRAII savedCurToken(P);
7740 Token& Tok =
const_cast<Token&
>(P.getCurToken());
7741 Tok.setKind(tok::semi);
7747 Sema::ContextAndScopeRAII pushedDCAndS(SemaR, C.getTranslationUnitDecl(),
7750 TObject* specObj =
gROOT->FindSpecialObject(Name, LookupCtx);
7753 Error(
"GetObjectAddress",
"Got a special object without LookupCtx!");
7767 clang::CXXRecordDecl* klass)
const
7769 using namespace clang;
7770 ASTContext& Ctx = klass->getASTContext();
7771 FriendDecl::FriendUnion friendUnion(
function);
7774 FriendDecl* friendDecl = FriendDecl::Create(Ctx, klass, sl, friendUnion, sl);
7775 klass->pushFriendDecl(friendDecl);
7789 if (func)
return ((
TClingCallFunc*)func)->GetDecl()->getCanonicalDecl();
7860 f->Exec(address, &val);
7868 f->ExecWithReturn(address, ret);
7874 const void* args[] ,
7879 f->ExecWithArgsAndReturn(address, args, nargs, ret);
7887 return f->ExecInt(address);
7895 return f->ExecInt64(address);
7903 return f->ExecDouble(address);
7926 return (MethodInfo_t*)
f->FactoryMethod();
7934 f->IgnoreExtraArgs(ignore);
7951 return f->IsValid();
7960 return f->IFacePtr();
8024 f->SetArgArray(paramArr, nparam);
8041 f->SetFunc(ci, method, params,
offset);
8050 f->SetFunc(ci, method, params, objectIsConst,
offset);
8088 llvm::SmallVector<clang::QualType, 4> funcProto;
8089 for (std::vector<TypeInfo_t*>::const_iterator iter =
proto.begin(), end =
proto.end();
8090 iter != end; ++iter) {
8091 funcProto.push_back( ((
TClingTypeInfo*)(*iter))->GetQualType() );
8093 f->SetFuncProto(ci, method, funcProto,
offset,
mode);
8103 llvm::SmallVector<clang::QualType, 4> funcProto;
8104 for (std::vector<TypeInfo_t*>::const_iterator iter =
proto.begin(), end =
proto.end();
8105 iter != end; ++iter) {
8106 funcProto.push_back( ((
TClingTypeInfo*)(*iter))->GetQualType() );
8108 f->SetFuncProto(ci, method, funcProto, objectIsConst,
offset,
mode);
8114 std::string wrapper_name;
8115 std::string wrapper;
8116 f->get_wrapper_code(wrapper_name, wrapper);
8135 const clang::DeclContext *ctxt =
nullptr;
8137 ctxt = clang::Decl::castToDeclContext(((
TClingClassInfo*)info)->GetDecl());
8139 ctxt =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
8144 const clang::Decl *decl =
reinterpret_cast<const clang::Decl*
>(declid);
8148 const clang::DeclContext *declDC = decl->getDeclContext();
8151 if (declDC->isTransparentContext()) {
8152 declDC = declDC->getParent();
8155 if (
const auto *declRD = llvm::dyn_cast<clang::RecordDecl>(declDC)) {
8156 if (declRD->isAnonymousStructOrUnion()) {
8157 declDC = declRD->getParent();
8161 if (
const auto *declNS = llvm::dyn_cast<clang::NamespaceDecl>(declDC)) {
8162 if (declNS->isAnonymousNamespace() || declNS->isInlineNamespace()) {
8163 declDC = declNS->getParent();
8170 return declDC->Equals(ctxt);
8281 TClinginfo->
Init(tagnum);
8354 return TClinginfo->
Next();
8402 return TClinginfo->
Size();
8410 return TClinginfo->
Tagnum();
8426 TTHREAD_TLS_DECL(std::string,
output);
8436 return TClinginfo->
Name();
8444 return TClinginfo->
Title();
8481 ClassInfo_t* base)
const
8494 return TClinginfo->
Next();
8502 return TClinginfo->
Next(onlyDirect);
8510 return TClinginfo->
Offset(address, isDerivedObject);
8523 return TClinginfo->
GetBaseOffset(TClinginfoBase, address, isDerivedObject);
8539 return (ClassInfo_t *)TClinginfo->
GetBase();
8547 return TClinginfo->
Tagnum();
8555 TTHREAD_TLS_DECL(std::string,
output);
8565 return TClinginfo->
Name();
8610 const clang::Decl* decl =
reinterpret_cast<const clang::Decl*
>(declid);
8611 const clang::ValueDecl* vd = llvm::dyn_cast_or_null<clang::ValueDecl>(decl);
8644 return TClinginfo->
Next();
8652 return TClinginfo->
Offset();
8700 return TClinginfo->
Name();
8708 return TClinginfo->
Title();
8715 TTHREAD_TLS_DECL(std::string,
result);
8726 Decl* decl =
static_cast<Decl*
>(
const_cast<void*
>(declId));
8727 ASTContext &C = decl->getASTContext();
8728 decl->addAttr(AnnotateAttr::CreateImplicit(C, attribute));
8739 cling::Interpreter &interp,
8742 const clang::TypeDecl* td = llvm::dyn_cast<clang::TypeDecl>(decl->getDeclContext());
8745 clang::QualType qualType(td->getTypeForDecl(),0);
8747 unsigned int level = 0;
8750 else if (
name[
cursor] ==
'<' && level) --level;
8751 else if (level == 0 &&
name[
cursor] ==
':') {
8764 const auto *FD = llvm::dyn_cast<clang::FunctionDecl>(decl);
8765 if (
const auto *USD = llvm::dyn_cast<clang::UsingShadowDecl>(decl)) {
8766 FD = llvm::dyn_cast<clang::FunctionDecl>(USD->getTargetDecl());
8769 Error(
"GetFunctionName",
"NULL Decl!");
8776 if (llvm::isa<clang::CXXConstructorDecl>(FD))
8780 }
else if (llvm::isa<clang::CXXDestructorDecl>(decl))
8785 llvm::raw_string_ostream stream(
output);
8786 auto printPolicy = decl->getASTContext().getPrintingPolicy();
8788 printPolicy.AnonymousTagLocations =
false;
8789 FD->getNameForDiagnostic(stream, printPolicy,
false);
8819 return (FuncTempInfo_t*)
const_cast<void*
>(declid);
8830 return (FuncTempInfo_t*)ft_info;
8841 return t_info !=
nullptr;
8850 if (!ft_info)
return 0;
8851 const clang::FunctionTemplateDecl *ft = (
const clang::FunctionTemplateDecl*)ft_info;
8852 return ft->getTemplateParameters()->size();
8861 if (!ft_info)
return 0;
8862 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
8863 return ft->getTemplateParameters()->getMinRequiredArguments();
8871 if (!ft_info)
return 0;
8876 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
8878 switch (ft->getAccess()) {
8879 case clang::AS_public:
8882 case clang::AS_protected:
8885 case clang::AS_private:
8888 case clang::AS_none:
8889 if (ft->getDeclContext()->isNamespace())
8894 assert(
false &&
"Unexpected value for the access property value in Clang");
8898 const clang::FunctionDecl *fd = ft->getTemplatedDecl();
8899 if (
const clang::CXXMethodDecl *md =
8900 llvm::dyn_cast<clang::CXXMethodDecl>(fd)) {
8901 if (md->getMethodQualifiers().hasConst()) {
8904 if (md->isVirtual()) {
8910 if (
const clang::CXXConstructorDecl *cd =
8911 llvm::dyn_cast<clang::CXXConstructorDecl>(md)) {
8912 if (cd->isExplicit()) {
8916 else if (
const clang::CXXConversionDecl *cd =
8917 llvm::dyn_cast<clang::CXXConversionDecl>(md)) {
8918 if (cd->isExplicit()) {
8932 if (!ft_info)
return 0;
8937 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
8938 const clang::FunctionDecl *fd = ft->getTemplatedDecl();
8940 if (fd->isOverloadedOperator())
8942 if (llvm::isa<clang::CXXConversionDecl>(fd))
8944 if (llvm::isa<clang::CXXConstructorDecl>(fd))
8946 if (llvm::isa<clang::CXXDestructorDecl>(fd))
8948 if (fd->isInlined())
8959 if (!ft_info)
return;
8960 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
8972 if (!ft_info)
return;
8973 const clang::FunctionTemplateDecl *ft = (
const clang::FunctionTemplateDecl*)ft_info;
8977 if (
const RedeclarableTemplateDecl *AnnotFD
8979 if (AnnotateAttr *A = AnnotFD->getAttr<AnnotateAttr>()) {
8980 output = A->getAnnotation().str();
8984 if (!ft->isFromASTFile()) {
9035 const clang::Decl* decl =
reinterpret_cast<const clang::Decl*
>(declid);
9069 return info->
NArg();
9085 return info->
Next();
9112 return (TypeInfo_t*)info->
Type();
9120 TTHREAD_TLS_DECL(
TString, mangled_name);
9123 return mangled_name;
9141 return info->
Name();
9171 return info->
Title();
9190 if (info && info->
IsValid()) {
9192 clang::QualType QT( typeinfo->
GetQualType().getCanonicalType() );
9193 if (QT->isEnumeralType()) {
9195 }
else if (QT->isPointerType()) {
9197 QT = llvm::cast<clang::PointerType>(QT)->getPointeeType();
9198 if ( QT->isCharType() ) {
9203 }
else if ( QT->isFloatingType() ) {
9204 int sz = typeinfo->
Size();
9205 if (sz == 4 || sz == 8) {
9211 }
else if ( QT->isIntegerType() ) {
9212 int sz = typeinfo->
Size();
9265 return (MethodArgInfo_t*)
9282 return info->
Next();
9306 return info->
Name();
9330 return (TypeInfo_t*) info->
Type();
9390 return TClinginfo->
Name();
9414 return TClinginfo->
Size();
9472 const char*
name)
const
9492 return TClinginfo->
Next();
9508 return TClinginfo->
Size();
9524 return TClinginfo->
Name();
9532 return TClinginfo->
Title();
9539 clang::QualType QT1 = clang::QualType::getFromOpaquePtr(QualTypePtr1);
9540 clang::QualType QT2 = clang::QualType::getFromOpaquePtr(QualTypePtr2);
9541 return fInterpreter->getCI()->getASTContext().hasSameType(QT1, QT2);
9548 clang::QualType QT = clang::QualType::getFromOpaquePtr(QualTypePtr);
9549 return QT->hasIntegerRepresentation();
9556 clang::QualType QT = clang::QualType::getFromOpaquePtr(QualTypePtr);
9557 return QT->hasSignedIntegerRepresentation();
9564 clang::QualType QT = clang::QualType::getFromOpaquePtr(QualTypePtr);
9565 return QT->hasUnsignedIntegerRepresentation();
9572 clang::QualType QT = clang::QualType::getFromOpaquePtr(QualTypePtr);
9573 return QT->hasFloatingRepresentation();
9580 clang::QualType QT = clang::QualType::getFromOpaquePtr(QualTypePtr);
9581 return QT->hasPointerRepresentation();
9588 clang::QualType QT = clang::QualType::getFromOpaquePtr(QualTypePtr);
9589 return QT->isVoidPointerType();
9596 clang::FunctionDecl *FD = (clang::FunctionDecl *) fdeclid;
9597 return llvm::isa_and_nonnull<clang::CXXMethodDecl>(FD);
9606 Error(
"SnapshotMutexState",
"fRecurseCount != 0 even though initial mutex state is unset!");
9622 Error(
"ForgetMutexState",
"mutex state's recurse count already 0!");
9638 std::unique_ptr<MutexStateAndRecurseCountDelta> uniqueP{typedDelta};
9639 gCoreMutex->Apply(std::move(typedDelta->fDelta));
9641 R__ASSERT(
fInitialMutex.fRecurseCount == 0 &&
"Inconsistent state of fInitialMutex! Another thread within Interpreter critical section.");
9652 Error(
"ApplyToInterpreterMutex",
9653 "After returning from user code that turned on thread safety support, we notice that fInitialMutex is already used ... "
9654 "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.");
9669 uniqueP->fDelta =
gCoreMutex->Rewind(*uniqueP->fInitialState.fState);
9670 return uniqueP.release();
The file contains utilities which are foundational and could be used across the core component of ROO...
true
Register systematic variations for multiple existing columns using auto-generated tags.
#define R(a, b, c, d, e, f, g, h, i)
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
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)
TListOfDataMembers & LODM
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 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 std::string AlternateTuple(const char *classname, const cling::LookupHelper &lh, Bool_t silent)
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)
return
Invalidate stored TCling state for declarations included in transaction ‘T’.
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[])
TListOfFunctionTemplates & LOFT
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)
if(isa< VarDecl >(D)||isa< FieldDecl >(D)||isa< EnumConstantDecl >(D))
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.
externInt_t gErrorIgnoreLevel
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.
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 data
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< State > GetStateBefore()=0
Storage_t const & get() const
Const access to the underlying stl container.
static Longptr_t ExecuteFile(const char *file, Int_t *error=nullptr, Bool_t keep=kFALSE)
Execute a file containing a C++ macro (static method).
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 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 SetArgs(const char *args)
Longptr_t ExecInt(void *address)
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
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
void * QualTypePtr() const
Return the QualType as a void pointer.
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.
std::hash< std::string > fHashFunc
std::set< size_t > fLinesHashSet
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)
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
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)
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.
bool FunctionDeclId_IsMethod(DeclId_t fdeclid) const
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
TypeInfo_t * MethodArgInfo_TypeInfo(MethodArgInfo_t *marginfo) const
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.
TCling(const char *name, const char *title, const char *const argv[], void *interpLibHandle)
Initialize the cling interpreter interface.
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
bool IsVoidPointerType(const void *QualTypePtr) const
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
bool IsUnsignedIntegerType(const void *QualTypePtr) const
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
bool IsSignedIntegerType(const void *QualTypePtr) const
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
bool IsIntegerType(const void *QualTypePtr) const
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 SetClassInfo(TClass *cl, Bool_t reload=kFALSE, Bool_t silent=kFALSE) final
Set pointer to the TClingClassInfo in TClass.
void CallFunc_Exec(CallFunc_t *func, void *address) const final
bool IsPointerType(const void *QualTypePtr) const
bool IsFloatingType(const void *QualTypePtr) const
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)
void UpdateClassInfoWithDecl(const clang::NamedDecl *ND)
Internal function. Inform a TClass about its new TagDecl or NamespaceDecl.
bool IsSameType(const void *QualTypePtr1, const void *QualTypePtr2) const
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
void * TypeInfo_QualTypePtr(TypeInfo_t *tinfo) const
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 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
The TEnv class reads config files, by default named .rootrc.
A file, usually with extension .root, that stores data and code in the form of serialized objects in ...
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...
void Clear(Option_t *option="") override
Remove all objects from the list.
THashTable implements a hash table to store TObject's.
This class defines an abstract interface to a generic command line interpreter.
int(* AutoLoadCallBack_t)(const char *)
std::vector< std::pair< std::string, int > > FwdDeclArgsToKeepCollection_t
TDictionary::DeclId_t DeclId_t
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...
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();.
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.
Int_t GetEntries() const override
Return the number of objects in array (i.e.
TObject * At(Int_t idx) const 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 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 TClass * IsA() const
TObject()
TObject constructor.
@ 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 & 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!
static const TString & GetSharedLibDir()
Get the shared libraries 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
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()
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
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 *)
constexpr Double_t C()
Velocity of light in .
constexpr Double_t E()
Base of natural log: .
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.
A read-only memory range which we do not control.