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__; }
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, skipCore);
641 return ((
TCling*)
gCling)->IsAutoLoadNamespaceCandidate(nsDecl);
646 string file(fileName);
652 string &args,
string &io,
string &fname)
654 string file(fileName);
655 TString f, 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);
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") {
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 if (iSTLType == sSTLTypes.end()) {
791 fileContent +=
"#pragma link C++ class " + *it +
"::*+;\n" ;
794 fileContent +=
"#endif\n";
798 filePointer = fopen(fileName,
"w");
799 if (filePointer ==
nullptr) {
805 fprintf(filePointer,
"%s", fileContent.c_str());
821 const std::vector<std::string> &headers,
822 const std::vector<std::string> &fwdDecls,
823 const std::vector<std::string> &unknown)
829 std::vector<std::string> classes;
830 classes.push_back(className);
858 void exceptionErrorHandler(
void * ,
861 throw std::runtime_error(std::string(
">>> Interpreter compilation error:\n") + reason);
875 class clangDiagSuppr {
877 clangDiagSuppr(clang::DiagnosticsEngine& diag): fDiagEngine(diag){
878 fOldDiagValue = fDiagEngine.getIgnoreAllWarnings();
879 fDiagEngine.setIgnoreAllWarnings(
true);
883 fDiagEngine.setIgnoreAllWarnings(fOldDiagValue);
886 clang::DiagnosticsEngine& fDiagEngine;
909 if (strncmp(tname.c_str(),
"const ", 6) == 0) {
912 unsigned long end = tname.length();
913 while( end && (tname[end-1]==
'&' || tname[end-1]==
'*' || tname[end-1]==
']') ) {
914 if ( tname[end-1]==
']' ) {
916 while ( end && tname[end-1]!=
'[' ) --end;
920 std::string innerbuf;
922 if (end != tname.length()) {
924 inner = innerbuf.c_str();
926 inner = tname.c_str()+
offset;
930 if (
gROOT->GetListOfClasses()->FindObject(inner)
940 const char *newname =
type->GetFullTypeName();
942 newname =
"Long64_t";
944 newname =
"ULong64_t";
946 if (strcmp(inner,newname) == 0) {
951 if ( end != tname.length() ) {
952 result += tname.substr(end,tname.length()-end);
960 if (lastPos != inner)
963 const auto enName = lastPos;
964 const auto scopeNameSize = (lastPos - inner) /
sizeof(
decltype(*lastPos)) - 2;
965 std::string scopeName{inner, scopeNameSize};
967 if (
auto scope =
static_cast<TClass *
>(
gROOT->GetListOfClasses()->FindObject(scopeName.c_str()))) {
968 auto enumTable =
dynamic_cast<const THashList *
>(scope->GetListOfEnums(
false));
969 if (enumTable && enumTable->THashList::FindObject(enName))
974 auto listOfEnums = scope->GetListOfEnums();
976 auto enumTable =
dynamic_cast<const THashList *
>(listOfEnums);
977 if (enumTable && enumTable->THashList::FindObject(enName))
984 auto enumTable =
dynamic_cast<const THashList *
>(
gROOT->GetListOfEnums());
985 if (enumTable && enumTable->THashList::FindObject(inner))
return true;
1008 return fContent.c_str();
1016 bool notPresent = fLinesHashSet.emplace(fHashFunc(str)).second;
1030static bool LoadModule(
const std::string &ModuleName, cling::Interpreter &interp)
1040 assert(!currentDir.empty());
1043 ::Info(
"TCling::__LoadModule",
"Preloading module %s. \n",
1044 ModuleName.c_str());
1046 return interp.loadModule(ModuleName,
true);
1052static void LoadModules(
const std::vector<std::string> &modules, cling::Interpreter &interp)
1054 for (
const auto &modName : modules)
1060 const static bool foundSymbol = dlsym(RTLD_DEFAULT,
"usedToIdentifyRootClingByDlSym");
1065static bool HasASTFileOnDisk(clang::Module *M,
const clang::Preprocessor &PP, std::string *FullFileName =
nullptr)
1067 const HeaderSearchOptions &HSOpts = PP.getHeaderSearchInfo().getHeaderSearchOpts();
1069 std::string ModuleFileName;
1070 if (!HSOpts.PrebuiltModulePaths.empty())
1072 ModuleFileName = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(M->Name);
1074 *FullFileName = ModuleFileName;
1076 return !ModuleFileName.empty();
1082 CompilerInstance &CI = *interp.getCI();
1083 Preprocessor &PP = CI.getPreprocessor();
1084 auto ModuleManager = CI.getASTReader();
1085 assert(ModuleManager);
1090 if (ModuleIndexPath.empty())
1093 ModuleManager->resetForReload();
1094 ModuleManager->loadGlobalIndex();
1095 GlobalModuleIndex *GlobalIndex = ModuleManager->getGlobalIndex();
1100 ModuleMap &MMap = PP.getHeaderSearchInfo().getModuleMap();
1101 bool RecreateIndex =
false;
1102 for (ModuleMap::module_iterator
I = MMap.module_begin(), E = MMap.module_end();
I != E; ++
I) {
1103 Module *TheModule =
I->second;
1108 RecreateIndex =
true;
1110 if (RecreateIndex) {
1111 cling::Interpreter::PushTransactionRAII deserRAII(&interp);
1112 clang::GlobalModuleIndex::UserDefinedInterestingIDs IDs;
1114 struct DefinitionFinder :
public RecursiveASTVisitor<DefinitionFinder> {
1115 DefinitionFinder(clang::GlobalModuleIndex::UserDefinedInterestingIDs& IDs,
1116 clang::TranslationUnitDecl* TU) : DefinitionIDs(IDs) {
1119 bool VisitNamedDecl(NamedDecl *ND) {
1120 if (!ND->isFromASTFile())
1122 if (!ND->getIdentifier())
1125 if (ND->getAccess() == AS_protected || ND->getAccess() == AS_private)
1128 if (TagDecl *TD = llvm::dyn_cast<TagDecl>(ND)) {
1129 if (TD->isCompleteDefinition())
1131 }
else if (NamespaceDecl *NSD = llvm::dyn_cast<NamespaceDecl>(ND)) {
1132 Register(NSD,
false);
1134 else if (TypedefNameDecl *TND = dyn_cast<TypedefNameDecl>(ND))
1140 clang::GlobalModuleIndex::UserDefinedInterestingIDs &DefinitionIDs;
1141 void Register(
const NamedDecl* ND,
bool AddSingleEntry =
true) {
1142 assert(ND->isFromASTFile());
1145 if (!ND->hasOwningModule()) {
1147 SourceManager &SM = ND->getASTContext().getSourceManager();
1148 SourceLocation Loc = ND->getLocation();
1149 const FileEntry *FE = SM.getFileEntryForID(SM.getFileID(Loc));
1151 assert(FE->getName().contains(
"input_line_"));
1156 Module *OwningModule = ND->getOwningModule()->getTopLevelModule();
1157 assert(OwningModule);
1158 assert(!ND->getName().empty() &&
"Empty name");
1159 if (AddSingleEntry && DefinitionIDs.count(ND->getName()))
1165 DefinitionIDs[ND->getName()].push_back(OwningModule->getASTFile());
1168 DefinitionFinder defFinder(IDs, CI.getASTContext().getTranslationUnitDecl());
1170 llvm::cantFail(GlobalModuleIndex::writeIndex(CI.getFileManager(),
1171 CI.getPCHContainerReader(),
1174 ModuleManager->resetForReload();
1175 ModuleManager->loadGlobalIndex();
1176 GlobalIndex = ModuleManager->getGlobalIndex();
1185 if (!clingInterp.getCI()->getLangOpts().Modules)
1189 cling::Interpreter::PushTransactionRAII deserRAII(&clingInterp);
1207 LoadModule(
"_Builtin_intrinsics", clingInterp);
1211 std::vector<std::string> CoreModules = {
"ROOT_Foundation_C",
1214 "ROOT_Foundation_Stage1_NoRTTI",
1223 std::vector<std::string> CommonModules = {
"MathCore"};
1229 std::vector<std::string> FIXMEModules = {
"Hist"};
1230 clang::CompilerInstance &CI = *clingInterp.getCI();
1231 clang::Preprocessor &PP = CI.getPreprocessor();
1232 ModuleMap &MMap = PP.getHeaderSearchInfo().getModuleMap();
1233 if (MMap.findModule(
"RInterface"))
1234 FIXMEModules.push_back(
"RInterface");
1238 GlobalModuleIndex *GlobalIndex =
nullptr;
1242 GlobalIndex = CI.getASTReader()->getGlobalIndex();
1244 llvm::StringSet<> KnownModuleFileNames;
1246 GlobalIndex->getKnownModuleFileNames(KnownModuleFileNames);
1248 std::vector<std::string> PendingModules;
1249 PendingModules.reserve(256);
1250 for (
auto I = MMap.module_begin(), E = MMap.module_end();
I != E; ++
I) {
1251 clang::Module *M =
I->second;
1255 std::string FullASTFilePath;
1259 if (GlobalIndex && KnownModuleFileNames.count(FullASTFilePath))
1262 if (M->IsUnimportable)
1270 if (std::find(CoreModules.begin(), CoreModules.end(), M->Name) != CoreModules.end())
1278 PendingModules.push_back(M->Name);
1285 assert(clingInterp.getMacro(
"gROOT") &&
"Couldn't load gROOT macro?");
1289 clingInterp.declare(R
"CODE(
1301 std::string PreIncludes;
1302 bool hasCxxModules = clingInterp.getCI()->getLangOpts().Modules;
1308 PreIncludes +=
"#include \"RtypesCore.h\"\n";
1311 PreIncludes +=
"#include \"Rtypes.h\"\n";
1313 PreIncludes += gClassDefInterpMacro +
"\n"
1314 + gInterpreterClassDef +
"\n"
1316 "#define ClassImp(X);\n";
1319 PreIncludes +=
"#include <string>\n";
1324 PreIncludes +=
"#include <cassert>\n";
1326 PreIncludes +=
"using namespace std;\n";
1327 clingInterp.declare(PreIncludes);
1347#ifdef R__USE_CXXMODULES
1351 llvm::install_fatal_error_handler(&exceptionErrorHandler);
1355 std::vector<std::string> clingArgsStorage;
1356 clingArgsStorage.push_back(
"cling4root");
1357 for (
const char*
const* arg = argv; *arg; ++arg)
1358 clingArgsStorage.push_back(*arg);
1361 if (!fromRootCling) {
1366 clingArgsStorage.push_back(
"-I" + interpInclude);
1369 clingArgsStorage.push_back(
"-I" + interpInclude +
"/cling");
1372 clingArgsStorage.push_back(
"-I" + interpInclude +
"/cling/plugins/include");
1383 std::string pchFilename = interpInclude +
"/allDict.cxx.pch";
1388 clingArgsStorage.push_back(
"-include-pch");
1389 clingArgsStorage.push_back(pchFilename);
1392 clingArgsStorage.push_back(
"-Wno-undefined-inline");
1393 clingArgsStorage.push_back(
"-fsigned-char");
1398 clingArgsStorage.push_back(
"-O1");
1401 clingArgsStorage.push_back(
"-mllvm");
1402 clingArgsStorage.push_back(
"-optimize-regalloc=0");
1407 std::optional<std::string> EnvOpt = llvm::sys::Process::GetEnv(
"EXTRA_CLING_ARGS");
1408 if (EnvOpt.has_value()) {
1409 StringRef Env(*EnvOpt);
1410 while (!Env.empty()) {
1412 std::tie(Arg, Env) = Env.split(
' ');
1413 clingArgsStorage.push_back(Arg.str());
1417 auto GetEnvVarPath = [](
const std::string &EnvVar, std::vector<std::string> &Paths) {
1418 std::optional<std::string> EnvOpt = llvm::sys::Process::GetEnv(EnvVar);
1419 if (EnvOpt.has_value()) {
1420 StringRef Env(*EnvOpt);
1421 while (!Env.empty()) {
1424 if (std::find(Paths.begin(), Paths.end(), Arg.str()) == Paths.end())
1425 Paths.push_back(Arg.str());
1431 std::vector<std::string> Paths;
1436 GetEnvVarPath(
"CLING_PREBUILT_MODULE_PATH", Paths);
1437 std::string EnvVarPath;
1438 for (
const std::string& P : Paths)
1441 gSystem->
Setenv(
"CLING_PREBUILT_MODULE_PATH", EnvVarPath.c_str());
1445 EnvOpt = llvm::sys::Process::GetEnv(
"ROOT_CLING_TIMING");
1446 if (EnvOpt.has_value())
1447 clingArgsStorage.push_back(
"-ftime-report");
1454 std::vector<std::string> ModuleMaps;
1457 GetEnvVarPath(
"CLING_MODULEMAP_FILES", ModuleMaps);
1461 if (llvm::sys::fs::exists(cwd + ModuleMapSuffix))
1462 ModuleMaps.push_back(cwd + ModuleMapSuffix);
1464 for (
const std::string& M : ModuleMaps)
1465 clingArgsStorage.push_back(
"-fmodule-map-file=" + M);
1467 std::string ModulesCachePath;
1468 EnvOpt = llvm::sys::Process::GetEnv(
"CLING_MODULES_CACHE_PATH");
1469 if (EnvOpt.has_value()){
1470 StringRef Env(*EnvOpt);
1471 assert(llvm::sys::fs::exists(Env) &&
"Path does not exist!");
1472 ModulesCachePath = Env.str();
1477 clingArgsStorage.push_back(
"-fmodules-cache-path=" + ModulesCachePath);
1480 std::vector<const char*> interpArgs;
1481 for (std::vector<std::string>::const_iterator iArg = clingArgsStorage.begin(),
1482 eArg = clingArgsStorage.end(); iArg != eArg; ++iArg)
1483 interpArgs.push_back(iArg->c_str());
1490 if (!fromRootCling) {
1492 interpArgs.push_back(
"-fmodules");
1493 interpArgs.push_back(
"-fno-implicit-module-maps");
1497 interpArgs.push_back(
"-Rmodule-build");
1503 interpArgs.push_back(
"-fno-autolink");
1508 interpArgs.push_back(
"-ffast-math");
1514 extraArgs && *extraArgs; ++extraArgs) {
1515 if (!strcmp(*extraArgs,
"-resource-dir")) {
1517 llvmResourceDir = *(++extraArgs);
1519 interpArgs.push_back(*extraArgs);
1523 std::vector<std::string> _empty;
1525 for (
const auto &arg: args)
1526 interpArgs.emplace_back(arg.c_str());
1529 cling::Interpreter::ModuleFileExtensions extensions;
1530 EnvOpt = llvm::sys::Process::GetEnv(
"ROOTDEBUG_RDICT");
1531 if (!EnvOpt.has_value())
1532 extensions.push_back(std::make_shared<TClingRdictModuleFileExtension>());
1534 fInterpreter = std::make_unique<cling::Interpreter>(interpArgs.size(),
1536 llvmResourceDir, extensions,
1540 fInterpreter->getCI()->getPreprocessorOpts().DisablePCHOrModuleValidation =
1541 DisableValidationForModuleKind::All;
1545 fInterpreter->getCI()->getLangOpts().SpellChecking =
false;
1548 auto isModulesArg = [](
const char* arg) {
return !strcmp(arg,
"-fmodules"); };
1549 bool hasModulesArg = std::find_if(interpArgs.begin(), interpArgs.end(), isModulesArg) != interpArgs.end();
1550 fInterpreter->getCI()->getLangOpts().Modules = hasModulesArg;
1555 static llvm::raw_fd_ostream fMPOuts (STDOUT_FILENO,
false);
1575 if (!fromRootCling) {
1580 fInterpreter->getRuntimeOptions().AllowRedefinition = 1;
1581 auto &Policy =
const_cast<clang::PrintingPolicy &
>(
fInterpreter->getCI()->getASTContext().getPrintingPolicy());
1585 Policy.SplitTemplateClosers =
true;
1587 Policy.SuppressDefaultTemplateArgs =
false;
1593 std::unique_ptr<TClingCallbacks>
1599 if (!fromRootCling) {
1600 cling::DynamicLibraryManager& DLM = *
fInterpreter->getDynamicLibraryManager();
1605 auto ShouldPermanentlyIgnore = [](llvm::StringRef FileName) ->
bool{
1606 llvm::StringRef stem = llvm::sys::path::stem(FileName);
1607 return stem.startswith(
"libNew") || stem.startswith(
"libcppyy_backend");
1610 DLM.initializeDyld(ShouldPermanentlyIgnore);
1648 assert(
GetRootMapFiles() ==
nullptr &&
"Must be called before LoadLibraryMap!");
1667 auto setFactory = []() {
1671 static bool doneFactory = setFactory();
1683 if (llvm::sys::fs::exists(pcmFileNameFullPath)) {
1684 ::Error(
"TCling::RegisterRdictForLoadPCM",
"Rdict '%s' is both in Module extension and in File system.", pcmFileNameFullPath.c_str());
1701 if (listOfKeys && ((listOfKeys->GetSize() == 0) ||
1702 ((listOfKeys->GetSize() == 1) &&
1703 !strcmp(((
TKey *)listOfKeys->At(0))->GetName(),
"EMPTY")
1710 ::Info(
"TCling::LoadPCMImpl",
"reading protoclasses for %s \n", pcmFile.
GetName());
1716 auto listOfGlobals =
gROOT->GetListOfGlobals();
1717 auto listOfEnums =
dynamic_cast<THashList *
>(
gROOT->GetListOfEnums());
1719 for (
auto selEnum : *enums) {
1720 const char *enumScope = selEnum->
GetTitle();
1721 const char *enumName = selEnum->GetName();
1722 if (strcmp(enumScope,
"") == 0) {
1725 if (!listOfEnums->THashList::FindObject(enumName)) {
1726 ((
TEnum *)selEnum)->SetClass(
nullptr);
1727 listOfEnums->Add(selEnum);
1729 for (
auto enumConstant : *
static_cast<TEnum *
>(selEnum)->GetConstants()) {
1730 if (!listOfGlobals->FindObject(enumConstant)) {
1731 listOfGlobals->Add(enumConstant);
1738 if (!nsTClassEntry) {
1741 auto listOfEnums = nsTClassEntry->
fEnums.load();
1752 if (listOfEnums && !listOfEnums->THashList::FindObject(enumName)) {
1753 ((
TEnum *)selEnum)->SetClass(nsTClassEntry);
1754 listOfEnums->Add(selEnum);
1762 pcmFile.
GetObject(
"__ProtoClasses", protoClasses);
1765 for (
auto obj : *protoClasses) {
1775 for (
auto proto : *protoClasses) {
1783 ::Error(
"TCling::LoadPCM",
"Inconsistent TClassTable for %s",
proto->GetName());
1794 protoClasses->
Clear();
1795 delete protoClasses;
1799 pcmFile.
GetObject(
"__Typedefs", dataTypes);
1801 for (
auto typedf : *dataTypes)
1802 gROOT->GetListOfTypes()->Add(typedf);
1815 assert(!pcmFileNameFullPath.empty());
1816 assert(llvm::sys::path::is_absolute(pcmFileNameFullPath));
1819 TString pcmFileName = pcmFileNameFullPath;
1827 llvm::SaveAndRestore<Int_t> SaveGDebug(
gDebug);
1830 ::Info(
"TCling::LoadPCM",
"Loading ROOT PCM %s", pcmFileName.
Data());
1835 if (llvm::sys::fs::is_symlink_file(pcmFileNameFullPath))
1840 llvm::StringRef pcmContent = pendingRdict->second;
1842 std::string RDictFileOpts = pcmFileNameFullPath +
"?filetype=pcm";
1843 TMemFile pcmMemFile(RDictFileOpts.c_str(), range);
1858 if (!llvm::sys::fs::exists(pcmFileNameFullPath)) {
1859 ::Error(
"TCling::LoadPCM",
"ROOT PCM %s file does not exist",
1860 pcmFileNameFullPath.data());
1863 ::Info(
"TCling::LoadPCM",
"In-memory ROOT PCM candidate %s\n",
1864 rdict.first.c_str());
1868 if (!
gROOT->IsRootFile(pcmFileName)) {
1869 Fatal(
"LoadPCM",
"The file %s is not a ROOT as was expected\n", pcmFileName.
Data());
1872 TFile pcmFile(pcmFileName +
"?filetype=pcm",
"READ");
1879 using namespace clang;
1881 class ExtLexicalStorageAdder:
public RecursiveASTVisitor<ExtLexicalStorageAdder>{
1886 bool VisitRecordDecl(clang::RecordDecl* rcd){
1888 Info(
"ExtLexicalStorageAdder",
1889 "Adding external lexical storage to class %s",
1890 rcd->getNameAsString().c_str());
1891 auto reDeclPtr = rcd->getMostRecentDecl();
1893 reDeclPtr->setHasExternalLexicalStorage();
1894 }
while ((reDeclPtr = reDeclPtr->getPreviousDecl()));
1907 const std::string &ModuleMapName )
const
1909 assert(llvm::sys::path::is_absolute(FullPath));
1910 Preprocessor &PP =
fInterpreter->getCI()->getPreprocessor();
1911 FileManager &FM = PP.getFileManager();
1914 if (
auto DE = FM.getOptionalDirectoryRef(FullPath)) {
1915 HeaderSearch &HS = PP.getHeaderSearchInfo();
1916 HeaderSearchOptions &HSOpts = HS.getHeaderSearchOpts();
1917 const auto &ModPaths = HSOpts.PrebuiltModulePaths;
1918 bool pathExists = std::find(ModPaths.begin(), ModPaths.end(), FullPath) != ModPaths.end();
1920 HSOpts.AddPrebuiltModulePath(FullPath);
1925 llvm::SmallString<256> ModuleMapFileName(DE->getName());
1926 llvm::sys::path::append(ModuleMapFileName, ModuleMapName);
1927 if (
auto FE = FM.getOptionalFileRef(ModuleMapFileName,
false,
1929 if (!HS.loadModuleMapFile(*FE,
false))
1931 Error(
"RegisterPrebuiltModulePath",
"Could not load modulemap in %s", ModuleMapFileName.c_str());
1948 "libforward_listDict",
1956 "libunordered_setDict",
1957 "libunordered_multisetDict",
1958 "libunordered_mapDict",
1959 "libunordered_multimapDict",
1967 char dyLibError[1000];
1968 FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
1969 dyLibError,
sizeof(dyLibError), NULL);
1971 const char *dyLibError = dlerror();
1973 ::Error(
"TCling::RegisterModule",
"Cannot open shared library %s for dictionary %s:\n %s", dyLibName, modulename,
1974 (dyLibError) ? dyLibError :
"");
2011 const char** headers,
2012 const char** includePaths,
2013 const char* payloadCode,
2014 const char* fwdDeclsCode,
2015 void (*triggerFunc)(),
2017 const char** classesHeaders,
2018 Bool_t lateRegistration ,
2025 if (fromRootCling)
return;
2034 bool isACLiC = strstr(modulename,
"_ACLiC_dict") !=
nullptr;
2035 if (hasHeaderParsingOnDemand && isACLiC) {
2037 Info(
"TCling::RegisterModule",
2038 "Header parsing on demand is active but this is an Aclic library. Disabling it for this library.");
2039 hasHeaderParsingOnDemand =
false;
2053 for (
const char** inclPath = includePaths; *inclPath; ++inclPath) {
2056 cling::Transaction* T =
nullptr;
2058 for (
auto& fwdDeclArgToSkipPair : fwdDeclsArgToSkip){
2059 const std::string& fwdDecl = fwdDeclArgToSkipPair.first;
2060 const int nArgsToSkip = fwdDeclArgToSkipPair.second;
2061 auto compRes =
fInterpreter->declare(fwdDecl.c_str(), &T);
2062 assert(cling::Interpreter::kSuccess == compRes &&
2063 "A fwd declaration could not be compiled");
2064 if (compRes!=cling::Interpreter::kSuccess){
2065 Warning(
"TCling::RegisterModule",
2066 "Problems in declaring string '%s' were encountered.",
2081 TString code = gNonInterpreterClassDef;
2083 code += payloadCode;
2085 std::string dyLibName = cling::DynamicLibraryManager::getSymbolLocation(triggerFunc);
2086 assert(!llvm::sys::fs::is_symlink_file(dyLibName));
2088 if (dyLibName.empty()) {
2089 ::Error(
"TCling::RegisterModule",
"Dictionary trigger function for %s not found", modulename);
2094 bool isSharedLib = cling::DynamicLibraryManager::isSharedLibrary(dyLibName);
2096 bool wasDlopened =
false;
2101 if (!lateRegistration) {
2108 void* dyLibHandle = dlopen(dyLibName.c_str(), RTLD_LAZY | RTLD_GLOBAL);
2118 if (hasHeaderParsingOnDemand && fwdDeclsCode){
2121 std::string fwdDeclsCodeLessEnums;
2125 std::string fwdDeclsLine;
2126 std::istringstream fwdDeclsCodeStr(fwdDeclsCode);
2127 std::vector<std::string> scopes;
2128 while (std::getline(fwdDeclsCodeStr, fwdDeclsLine)) {
2129 const auto enumPos = fwdDeclsLine.find(
"enum __attribute__((annotate(\"");
2131 if (enumPos != std::string::npos) {
2138 auto nsPos = fwdDeclsLine.find(
"namespace");
2139 R__ASSERT(nsPos < enumPos &&
"Inconsistent enum and enclosing scope parsing!");
2140 while (nsPos < enumPos && nsPos != std::string::npos) {
2142 const auto nsNameStart = nsPos + 10;
2143 const auto nsNameEnd = fwdDeclsLine.find(
'{', nsNameStart);
2144 const auto nsName = fwdDeclsLine.substr(nsNameStart, nsNameEnd - nsNameStart);
2145 scopes.push_back(nsName);
2146 nsPos = fwdDeclsLine.find(
"namespace", nsNameEnd);
2149 clang::DeclContext* DC =
nullptr;
2150 for (
auto &&aScope: scopes) {
2151 DC = cling::utils::Lookup::Namespace(&
fInterpreter->getSema(), aScope.c_str(), DC);
2157 if (scopes.empty() || DC) {
2161 size_t posEnumName = fwdDeclsLine.rfind(
"\"))) ");
2162 R__ASSERT(posEnumName != std::string::npos &&
"Inconsistent enum fwd decl!");
2164 while (isspace(fwdDeclsLine[posEnumName]))
2166 size_t posEnumNameEnd = fwdDeclsLine.find(
" : ", posEnumName);
2167 R__ASSERT(posEnumNameEnd != std::string::npos &&
"Inconsistent enum fwd decl (end)!");
2168 while (isspace(fwdDeclsLine[posEnumNameEnd]))
2172 std::string enumName = fwdDeclsLine.substr(posEnumName,
2173 posEnumNameEnd - posEnumName + 1);
2175 if (clang::NamedDecl* enumDecl
2176 = cling::utils::Lookup::Named(&
fInterpreter->getSema(),
2177 enumName.c_str(), DC)) {
2180 R__ASSERT(llvm::dyn_cast<clang::EnumDecl>(enumDecl) &&
"not an enum decl!");
2187 fwdDeclsCodeLessEnums += fwdDeclsLine +
"\n";
2191 if (!fwdDeclsCodeLessEnums.empty()){
2192 auto compRes =
fInterpreter->declare(fwdDeclsCodeLessEnums, &T);
2193 assert(cling::Interpreter::kSuccess == compRes &&
2194 "The forward declarations could not be compiled");
2195 if (compRes!=cling::Interpreter::kSuccess){
2196 Warning(
"TCling::RegisterModule",
2197 "Problems in compiling forward declarations for module %s: '%s'",
2198 modulename, fwdDeclsCodeLessEnums.c_str()) ;
2206 ExtLexicalStorageAdder elsa;
2207 for (
auto dciIt = T->decls_begin();dciIt!=T->decls_end();dciIt++){
2208 cling::Transaction::DelayCallInfo& dci = *dciIt;
2209 for(
auto dit = dci.m_DGR.begin(); dit != dci.m_DGR.end(); ++dit) {
2210 clang::Decl* declPtr = *dit;
2211 elsa.TraverseDecl(declPtr);
2225 for (
const char** classesHeader = classesHeaders; *classesHeader; ++classesHeader) {
2226 temp=*classesHeader;
2228 size_t theTemplateHash = 0;
2229 bool addTemplate =
false;
2230 size_t posTemplate = temp.find(
'<');
2231 if (posTemplate != std::string::npos) {
2233 std::string templateName = temp.substr(0, posTemplate);
2239 for (
const char** classesHeader_inner = classesHeader; 0!=strcmp(*classesHeader_inner,
"@"); ++classesHeader_inner,++classesHeader){
2241 if (payloadCode == *classesHeader_inner ){
2243 if (addTemplate)
fPayloads.insert(theTemplateHash);
2246 Info(
"TCling::RegisterModule",
2247 "Adding a header for %s", temp.c_str());
2253 addTemplate =
false;
2261 bool ModuleWasSuccessfullyLoaded =
false;
2263 std::string ModuleName = modulename;
2264 if (llvm::StringRef(modulename).startswith(
"lib"))
2265 ModuleName = llvm::StringRef(modulename).substr(3).str();
2270 clang::Preprocessor &PP = TheSema.getPreprocessor();
2271 std::string ModuleMapName;
2273 ModuleMapName = ModuleName +
".modulemap";
2275 ModuleMapName =
"module.modulemap";
2283 if (!ModuleWasSuccessfullyLoaded) {
2285 clang::HeaderSearch &headerSearch = PP.getHeaderSearchInfo();
2286 clang::ModuleMap &moduleMap = headerSearch.getModuleMap();
2287 if (moduleMap.findModule(ModuleName))
2288 Info(
"TCling::RegisterModule",
"Module %s in modulemap failed to load.", ModuleName.c_str());
2293 llvm::SmallString<256> pcmFileNameFullPath(dyLibName);
2296 llvm::sys::fs::make_absolute(pcmFileNameFullPath);
2297 llvm::sys::path::remove_filename(pcmFileNameFullPath);
2298 llvm::sys::path::append(pcmFileNameFullPath,
2300 LoadPCM(pcmFileNameFullPath.str().str());
2307 clangDiagSuppr diagSuppr(TheSema.getDiagnostics());
2309#if defined(R__MUST_REVISIT)
2310#if R__MUST_REVISIT(6,2)
2311 Warning(
"TCling::RegisterModule",
"Diagnostics suppression should be gone by now.");
2315 if (!ModuleWasSuccessfullyLoaded && !hasHeaderParsingOnDemand){
2318 const cling::Transaction* watermark =
fInterpreter->getLastTransaction();
2319 cling::Interpreter::CompilationResult compRes =
fInterpreter->parseForModule(code.
Data());
2325 assert(cling::Interpreter::kSuccess == compRes &&
2326 "Payload code of a dictionary could not be parsed correctly.");
2327 if (compRes!=cling::Interpreter::kSuccess) {
2328 Warning(
"TCling::RegisterModule",
2329 "Problems declaring payload for module %s.", modulename) ;
2342 if (!ModuleWasSuccessfullyLoaded && !hasHeaderParsingOnDemand) {
2345 "#undef __ROOTCLING__\n"
2346 + gInterpreterClassDef +
2351 assert(isSharedLib);
2354 dlclose(dyLibHandle);
2360 ASTContext &C = CI.getASTContext();
2368 if (IdentifierInfoLookup *External = C.Idents.getExternalIdentifierLookup()) {
2369 std::unique_ptr<IdentifierIterator> Iter(External->getIdentifiers());
2370 for (llvm::StringRef Ident = Iter->Next(); !Ident.empty(); Ident = Iter->Next()) {
2371 std::string
I = Ident.str();
2395 typedef std::vector<std::pair<TClass*,DictFuncPtr_t> >::iterator iterator;
2401 if ( i->first == oldcl ) {
2424 const char* input_line,
2425 cling::Interpreter::CompilationResult& compRes,
2429 return metaProcessor->process(input_line, compRes,
result);
2431 catch (cling::InterpreterException&
ex)
2433 Error(
"HandleInterpreterException",
"%s\n%s",
ex.what(),
"Execution of your code was aborted.");
2435 compRes = cling::Interpreter::kFailure;
2444 if (
auto ie =
dynamic_cast<const cling::InterpreterException*
>(&
e)) {
2470 gROOT->SetLineIsProcessing();
2474 gROOT->SetLineHasBeenProcessed();
2487 gROOT->SetLineIsProcessing();
2489 struct InterpreterFlagsRAII {
2490 cling::Interpreter* fInterpreter;
2491 bool fWasDynamicLookupEnabled;
2493 InterpreterFlagsRAII(cling::Interpreter* interp):
2494 fInterpreter(interp),
2495 fWasDynamicLookupEnabled(interp->isDynamicLookupEnabled())
2497 fInterpreter->enableDynamicLookup(
true);
2499 ~InterpreterFlagsRAII() {
2500 fInterpreter->enableDynamicLookup(fWasDynamicLookupEnabled);
2501 gROOT->SetLineHasBeenProcessed();
2510 cling::Interpreter::CompilationResult compRes = cling::Interpreter::kSuccess;
2511 if (!strncmp(sLine.
Data(),
".L", 2) || !strncmp(sLine.
Data(),
".x", 2) ||
2512 !strncmp(sLine.
Data(),
".X", 2)) {
2520 aclicMode, arguments, io);
2521 if (aclicMode.
Length()) {
2523 R__ASSERT(aclicMode[0]==
'+' &&
"ACLiC mode must start with a +");
2525 if (aclicMode[1]==
'+') {
2531 compRes = cling::Interpreter::kFailure;
2533 if (strncmp(sLine.
Data(),
".L", 2) != 0) {
2536 if (arguments.
Length() == 0) {
2545 mod_line = function + arguments + io;
2549 }
else if (cling::DynamicLibraryManager::isSharedLibrary(fname.
Data()) &&
2550 strncmp(sLine.
Data(),
".L", 2) != 0) {
2553 compRes = cling::Interpreter::kFailure;
2555 if (arguments.
Length() == 0) {
2569 ext = fname.
Last(
'_');
2575 mod_line = function + arguments + io;
2580 size_t unnamedMacroOpenCurly;
2583 std::string codeline;
2586 std::ifstream in(fname, std::ifstream::binary);
2588 std::getline(in, codeline);
2589 code += codeline +
"\n";
2591 unnamedMacroOpenCurly
2592 = cling::utils::isUnnamedMacro(code,
fInterpreter->getCI()->getLangOpts());
2596 if (unnamedMacroOpenCurly != std::string::npos) {
2598 unnamedMacroOpenCurly);
2608 if (0!=strncmp(sLine.
Data(),
".autodict ",10) && sLine !=
".autodict") {
2613 bool isInclusionDirective = sLine.
Contains(
"\n#include") || sLine.
BeginsWith(
"#include");
2614 if (isInclusionDirective) {
2631 case cling::Interpreter::kSuccess: *error =
kNoError;
break;
2632 case cling::Interpreter::kFailure: *error =
kRecoverable;
break;
2633 case cling::Interpreter::kMoreInputExpected: *error =
kProcessing;
break;
2636 if (compRes == cling::Interpreter::kSuccess
2667 if (path[0] ==
'-' && path[1] ==
'I')
2674 snprintf(drive, 3,
"%c:", _getdrive() +
'A' - 1);
2699 static const TClassRef clRefString(
"std::string");
2700 if (clRefString == cl) {
2719 const char* cobj = (
const char*) obj;
2726 auto inspInspect = [&] (ptrdiff_t
offset){
2732 switch(complexType) {
2739 inspInspect(
sizeof(
float));
2744 inspInspect(
sizeof(
double));
2749 inspInspect(
sizeof(
int));
2754 inspInspect(
sizeof(
long));
2759 static clang::PrintingPolicy
2761 if (printPol.Indentation) {
2763 printPol.Indentation = 0;
2764 printPol.SuppressInitializers =
true;
2767 const char* clname = cl->
GetName();
2770 const clang::ASTContext& astContext =
fInterpreter->getCI()->getASTContext();
2771 const clang::Decl *scopeDecl =
nullptr;
2772 const clang::Type *recordType =
nullptr;
2776 scopeDecl = clingCI->
GetDecl();
2777 recordType = clingCI->
GetType();
2779 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
2781 scopeDecl = lh.findScope(clname, cling::LookupHelper::NoDiagnostics,
2785 Error(
"InspectMembers",
"Cannot find Decl for class %s", clname);
2788 const clang::CXXRecordDecl* recordDecl
2789 = llvm::dyn_cast<const clang::CXXRecordDecl>(scopeDecl);
2791 Error(
"InspectMembers",
"Cannot find Decl for class %s is not a CXXRecordDecl.", clname);
2800 astContext.getASTRecordLayout(recordDecl);
2802 for (clang::RecordDecl::field_iterator iField = recordDecl->field_begin(),
2803 eField = recordDecl->field_end(); iField != eField; ++iField) {}
2806 const clang::ASTRecordLayout& recLayout
2807 = astContext.getASTRecordLayout(recordDecl);
2814 if (cl->
Size() != recLayout.getSize().getQuantity()) {
2815 Error(
"InspectMembers",
"TClass and cling disagree on the size of the class %s, respectively %d %lld\n",
2819 unsigned iNField = 0;
2822 for (clang::RecordDecl::field_iterator iField = recordDecl->field_begin(),
2823 eField = recordDecl->field_end(); iField != eField;
2824 ++iField, ++iNField) {
2827 clang::QualType memberQT = iField->getType();
2832 memberQT = cling::utils::Transform::GetPartiallyDesugaredType(astContext, memberQT,
fNormalizedCtxt->
GetConfig(),
false );
2833 if (memberQT.isNull()) {
2834 std::string memberName;
2835 llvm::raw_string_ostream stream(memberName);
2837 printPol.AnonymousTagLocations =
false;
2838 iField->getNameForDiagnostic(stream, printPol,
true );
2840 Error(
"InspectMembers",
2841 "Cannot retrieve QualType for member %s while inspecting class %s",
2842 memberName.c_str(), clname);
2845 const clang::Type* memType = memberQT.getTypePtr();
2847 std::string memberName;
2848 llvm::raw_string_ostream stream(memberName);
2850 printPol.AnonymousTagLocations =
false;
2851 iField->getNameForDiagnostic(stream, printPol,
true );
2853 Error(
"InspectMembers",
2854 "Cannot retrieve Type for member %s while inspecting class %s",
2855 memberName.c_str(), clname);
2859 const clang::Type* memNonPtrType = memType;
2860 Bool_t ispointer =
false;
2861 if (memNonPtrType->isPointerType()) {
2863 clang::QualType ptrQT
2864 = memNonPtrType->getAs<clang::PointerType>()->getPointeeType();
2869 ptrQT = cling::utils::Transform::GetPartiallyDesugaredType(astContext, ptrQT,
fNormalizedCtxt->
GetConfig(),
false );
2870 if (ptrQT.isNull()) {
2871 std::string memberName;
2872 llvm::raw_string_ostream stream(memberName);
2874 printPol.AnonymousTagLocations =
false;
2875 iField->getNameForDiagnostic(stream, printPol,
true );
2877 Error(
"InspectMembers",
2878 "Cannot retrieve pointee Type for member %s while inspecting class %s",
2879 memberName.c_str(), clname);
2882 memNonPtrType = ptrQT.getTypePtr();
2886 llvm::SmallString<8> arraySize;
2887 const clang::ArrayType* arrType = memNonPtrType->getAsArrayTypeUnsafe();
2888 unsigned arrLevel = 0;
2889 bool haveErrorDueToArray =
false;
2893 const clang::ConstantArrayType* constArrType =
2894 clang::dyn_cast<clang::ConstantArrayType>(arrType);
2896 constArrType->getSize().toStringUnsigned(arraySize);
2899 clang::QualType subArrQT = arrType->getElementType();
2900 if (subArrQT.isNull()) {
2901 std::string memberName;
2902 llvm::raw_string_ostream stream(memberName);
2904 printPol.AnonymousTagLocations =
false;
2905 iField->getNameForDiagnostic(stream, printPol,
true );
2907 Error(
"InspectMembers",
2908 "Cannot retrieve QualType for array level %d (i.e. element type of %s) for member %s while inspecting class %s",
2909 arrLevel, subArrQT.getAsString(printPol).c_str(),
2910 memberName.c_str(), clname);
2911 haveErrorDueToArray =
true;
2914 arrType = subArrQT.getTypePtr()->getAsArrayTypeUnsafe();
2916 if (haveErrorDueToArray) {
2921 std::string fieldName;
2922 if (memType->isPointerType()) {
2927 std::string ioname(iField->getName());
2929 fieldName += ioname;
2930 fieldName += arraySize;
2935 clang::CharUnits
offset(astContext.toCharUnitsFromBits(recLayout.getFieldOffset(iNField)));
2936 ptrdiff_t fieldOffset =
offset.getQuantity();
2946 auto iFiledQtype = iField->getType();
2947 if (
auto tagDecl = iFiledQtype->getAsTagDecl()){
2948 auto declAccess = tagDecl->getAccess();
2949 if (declAccess == AS_private || declAccess == AS_protected) {
2955 insp.
Inspect(
const_cast<TClass*
>(cl), insp.
GetParent(), fieldName.c_str(), cobj + fieldOffset, isTransient);
2958 const clang::CXXRecordDecl* fieldRecDecl = memNonPtrType->getAsCXXRecordDecl();
2959 if (fieldRecDecl && !fieldRecDecl->isAnonymousStructOrUnion()) {
2962 std::string sFieldRecName;
2965 clang::QualType(memNonPtrType,0),
2975 insp.
InspectMember(sFieldRecName.c_str(), cobj + fieldOffset,
2976 (fieldName +
'.').c_str(), transient);
2984 unsigned iNBase = 0;
2985 for (clang::CXXRecordDecl::base_class_const_iterator iBase
2986 = recordDecl->bases_begin(), eBase = recordDecl->bases_end();
2987 iBase != eBase; ++iBase, ++iNBase) {
2988 clang::QualType baseQT = iBase->getType();
2989 if (baseQT.isNull()) {
2990 Error(
"InspectMembers",
2991 "Cannot find QualType for base number %d while inspecting class %s",
2995 const clang::CXXRecordDecl* baseDecl
2996 = baseQT->getAsCXXRecordDecl();
2998 Error(
"InspectMembers",
2999 "Cannot find CXXRecordDecl for base number %d while inspecting class %s",
3004 std::string sBaseName;
3006 std::vector<TClass*> foundClasses;
3008 if (foundClasses.size()==1){
3009 baseCl=foundClasses[0];
3022 std::string qualNameForDiag;
3024 Error(
"InspectMembers",
3025 "Cannot find TClass for base class %s", qualNameForDiag.c_str() );
3030 if (iBase->isVirtual()) {
3033 Error(
"InspectMembers",
3034 "Base %s of class %s is virtual but no object provided",
3035 sBaseName.c_str(), clname);
3043 baseOffset = ci->
GetBaseOffset(baseCi,
const_cast<void*
>(obj),
3045 if (baseOffset == -1) {
3046 Error(
"InspectMembers",
3047 "Error calculating offset of virtual base %s of class %s",
3048 sBaseName.c_str(), clname);
3051 Error(
"InspectMembers",
3052 "Cannot calculate offset of virtual base %s of class %s",
3053 sBaseName.c_str(), clname);
3058 baseOffset = recLayout.getBaseClassOffset(baseDecl).getQuantity();
3105 bool oldDynLookup =
fInterpreter->isDynamicLookupEnabled();
3134 return fInterpreter->getDynamicLibraryManager()->isLibraryLoaded(tLibName.
Data());
3149 llvm::StringRef ModuleName(libname);
3150 ModuleName = llvm::sys::path::stem(ModuleName);
3151 ModuleName.consume_front(
"lib");
3159 clang::ModuleMap &moduleMap =
fInterpreter->getCI()->getPreprocessor().getHeaderSearchInfo().getModuleMap();
3160 clang::Module *M = moduleMap.findModule(ModuleName);
3161 return M && !M->IsUnimportable && M->getASTFile();
3180 size_t at = std::string::npos;
3181 while ((at = file_name.find(
"/./")) != std::string::npos)
3182 file_name.replace(at, 3,
"/");
3184 std::string filesStr =
"";
3185 llvm::raw_string_ostream filesOS(filesStr);
3186 clang::SourceManager &SM =
fInterpreter->getCI()->getSourceManager();
3187 cling::ClangInternalState::printIncludedFiles(filesOS, SM);
3190 llvm::SmallVector<llvm::StringRef, 100> files;
3191 llvm::StringRef(filesStr).split(files,
"\n");
3193 std::set<std::string> fileMap;
3194 llvm::StringRef file_name_ref(file_name);
3196 for (llvm::SmallVector<llvm::StringRef, 100>::const_iterator
3197 iF = files.begin(), iE = files.end(); iF != iE; ++iF) {
3198 if ((*iF) == file_name_ref)
return kTRUE;
3199 fileMap.insert(iF->str());
3202 if (fileMap.empty())
return kFALSE;
3205 TString sFilename(file_name.c_str());
3207 && fileMap.count(sFilename.
Data())) {
3215 while (incPath.
Index(
" :") != -1) {
3219 sFilename = file_name.c_str();
3221 && fileMap.count(sFilename.
Data())) {
3230 clang::ConstSearchDirIterator *CurDir =
nullptr;
3231 clang::Preprocessor &PP =
fInterpreter->getCI()->getPreprocessor();
3232 clang::HeaderSearch &HS = PP.getHeaderSearchInfo();
3233 auto FE = HS.LookupFile(file_name.c_str(),
3234 clang::SourceLocation(),
3237 clang::ArrayRef<std::pair<clang::OptionalFileEntryRef,
3238 clang::DirectoryEntryRef>>(),
3251 clang::SourceManager &SM =
fInterpreter->getCI()->getSourceManager();
3253 clang::FileID FID = SM.translateFile(*FE);
3254 if (!FID.isInvalid() && FID.getHashValue() == 0)
3257 clang::SrcMgr::SLocEntry SLocE = SM.getSLocEntry(FID);
3258 if (SLocE.isFile() && !SLocE.getFile().getContentCache().getBufferIfLoaded())
3260 if (!FID.isInvalid())
3264 sFilename = FE->getName().str();
3266 && fileMap.count(sFilename.
Data())) {
3274#if defined(R__MACOSX)
3282static bool R__UpdateLibFileForLinking(
TString &lib)
3284 const char *mapfile =
nullptr;
3286 mapfile =
"/System/Library/dyld/dyld_shared_cache_x86_64.map";
3288 mapfile =
"/System/Library/dyld/dyld_shared_cache_arm64e.map";
3290 #error unsupported architecture
3292 if (std::ifstream cacheMap{mapfile}) {
3294 while (getline(cacheMap,
line)) {
3295 if (
line.find(lib) != std::string::npos) {
3307#if defined (R__LINUX) || defined (R__FBSD)
3313static int callback_for_dl_iterate_phdr(
struct dl_phdr_info *info,
size_t size,
void *
data)
3316 static std::unordered_set<
decltype(info->dlpi_addr)> sKnownLoadedLibBaseAddrs;
3318 auto newLibs =
static_cast<std::vector<std::string>*
>(
data);
3319 if (!sKnownLoadedLibBaseAddrs.count(info->dlpi_addr)) {
3321 if (info->dlpi_name && info->dlpi_name[0]
3326 && strncmp(info->dlpi_name,
"[vdso]", 6)
3330 && strncmp(info->dlpi_name,
"/libexec/ld-elf.so.1", 20)
3332 && strncmp(info->dlpi_name,
"linux-vdso.so", 13)
3333 && strncmp(info->dlpi_name,
"linux-vdso32.so", 15)
3334 && strncmp(info->dlpi_name,
"linux-vdso64.so", 15)
3335 && strncmp(info->dlpi_name,
"linux-gate.so", 13))
3336 newLibs->emplace_back(info->dlpi_name);
3337 sKnownLoadedLibBaseAddrs.insert(info->dlpi_addr);
3350#if defined(R__WIN32) || defined(__CYGWIN__)
3351 HMODULE hModules[1024];
3353 unsigned long cbModules;
3355 hProcess = (
void *)::GetCurrentProcess();
3356 ::EnumProcessModules(hProcess, hModules,
sizeof(hModules), &cbModules);
3358 for (i = 1; i < (cbModules /
sizeof(
void *)); i++) {
3359 static const int bufsize = 260;
3360 wchar_t winname[bufsize];
3361 char posixname[bufsize];
3362 ::GetModuleFileNameExW(hProcess, hModules[i], winname, bufsize);
3363#if defined(__CYGWIN__)
3364 cygwin_conv_path(CCP_WIN_W_TO_POSIX, winname, posixname, bufsize);
3366 std::wstring wpath = winname;
3367 std::replace(wpath.begin(), wpath.end(),
'\\',
'/');
3368 string path(wpath.begin(), wpath.end());
3369 strncpy(posixname, path.c_str(), bufsize);
3375#elif defined(R__MACOSX)
3379 while (
const mach_header* mh = _dyld_get_image_header(imageIndex)) {
3381 if (mh->filetype == MH_DYLIB) {
3382 if (
const char* imageName = _dyld_get_image_name(imageIndex)) {
3390#elif defined(R__LINUX) || defined(R__FBSD)
3394 std::vector<std::string> newLibs;
3395 dl_iterate_phdr(callback_for_dl_iterate_phdr, &newLibs);
3396 for (
auto &&lib: newLibs)
3399 Error(
"TCling::UpdateListOfLoadedSharedLibraries",
3400 "Platform not supported!");
3406static bool StartsWithStrLit(
const char *haystack,
const char (&needle)[
N]) {
3407 return !strncmp(haystack, needle,
N - 1);
3422 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
3423 if (!DLM->isLibraryLoaded(
filename)) {
3424 DLM->loadLibrary(
filename,
true ,
true );
3427#if defined(R__MACOSX)
3429 auto lenFilename = strlen(
filename);
3430 auto isInMacOSSystemDir = [](
const char *fn) {
3431 return StartsWithStrLit(fn,
"/usr/lib/") || StartsWithStrLit(fn,
"/System/Library/");
3433 if (!strcmp(
filename,
"cl_kernels")
3436 || StartsWithStrLit(
filename,
"/usr/lib/system/")
3437 || StartsWithStrLit(
filename,
"/usr/lib/libc++")
3438 || StartsWithStrLit(
filename,
"/System/Library/Frameworks/")
3439 || StartsWithStrLit(
filename,
"/System/Library/PrivateFrameworks/")
3440 || StartsWithStrLit(
filename,
"/System/Library/CoreServices/")
3441 || StartsWithStrLit(
filename,
"/usr/lib/libSystem")
3442 || StartsWithStrLit(
filename,
"/usr/lib/libstdc++")
3443 || StartsWithStrLit(
filename,
"/usr/lib/libicucore")
3444 || StartsWithStrLit(
filename,
"/usr/lib/libbsm")
3445 || StartsWithStrLit(
filename,
"/usr/lib/libobjc")
3446 || StartsWithStrLit(
filename,
"/usr/lib/libresolv")
3447 || StartsWithStrLit(
filename,
"/usr/lib/libauto")
3448 || StartsWithStrLit(
filename,
"/usr/lib/libcups")
3449 || StartsWithStrLit(
filename,
"/usr/lib/libDiagnosticMessagesClient")
3450 || StartsWithStrLit(
filename,
"/usr/lib/liblangid")
3451 || StartsWithStrLit(
filename,
"/usr/lib/libCRFSuite")
3452 || StartsWithStrLit(
filename,
"/usr/lib/libpam")
3453 || StartsWithStrLit(
filename,
"/usr/lib/libOpenScriptingUtil")
3454 || StartsWithStrLit(
filename,
"/usr/lib/libextension")
3455 || StartsWithStrLit(
filename,
"/usr/lib/libAudioToolboxUtility")
3456 || StartsWithStrLit(
filename,
"/usr/lib/liboah")
3457 || StartsWithStrLit(
filename,
"/usr/lib/libRosetta")
3458 || StartsWithStrLit(
filename,
"/usr/lib/libCoreEntitlements")
3459 || StartsWithStrLit(
filename,
"/usr/lib/libssl.")
3460 || StartsWithStrLit(
filename,
"/usr/lib/libcrypto.")
3466 || StartsWithStrLit(
filename,
"/usr/lib/system/libsystem_kernel")
3467 || StartsWithStrLit(
filename,
"/usr/lib/system/libsystem_platform")
3468 || StartsWithStrLit(
filename,
"/usr/lib/system/libsystem_pthread")
3473 || (lenFilename > 4 && !strcmp(
filename + lenFilename - 4,
".tbd")))
3476 R__UpdateLibFileForLinking(sFileName);
3478#elif defined(__CYGWIN__)
3480 static const int bufsize = 260;
3481 char posixwindir[bufsize];
3482 char *windir = getenv(
"WINDIR");
3484 cygwin_conv_path(CCP_WIN_A_TO_POSIX, windir, posixwindir, bufsize);
3486 snprintf(posixwindir,
sizeof(posixwindir),
"/Windows/");
3487 if (strstr(
filename, posixwindir) ||
3490#elif defined(R__WIN32)
3493#elif defined (R__LINUX)
3517 assert(!
IsFromRootCling() &&
"Trying to load library from rootcling!");
3521 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
3522 std::string canonLib = DLM->lookupLibrary(
filename);
3523 cling::DynamicLibraryManager::LoadLibResult res
3524 = cling::DynamicLibraryManager::kLoadLibNotFound;
3525 if (!canonLib.empty()) {
3527 res = DLM->loadLibrary(
filename, system,
true);
3531 cling::Interpreter::CompilationResult compRes;
3533 if (compRes == cling::Interpreter::kSuccess)
3534 res = cling::DynamicLibraryManager::kLoadLibSuccess;
3538 if (res == cling::DynamicLibraryManager::kLoadLibSuccess) {
3542 case cling::DynamicLibraryManager::kLoadLibSuccess:
return 0;
3543 case cling::DynamicLibraryManager::kLoadLibAlreadyLoaded:
return 1;
3593 Warning(
"Calc",
"waiting for cling thread to free");
3596 gROOT->SetLineIsProcessing();
3603 cling::Value valRef;
3604 cling::Interpreter::CompilationResult cr = cling::Interpreter::kFailure;
3608 catch (cling::InterpreterException&
ex)
3610 Error(
"Calc",
"%s.\n%s",
ex.what(),
"Evaluation of your expression was aborted.");
3612 cr = cling::Interpreter::kFailure;
3615 if (cr != cling::Interpreter::kSuccess) {
3623 if (!valRef.isValid()) {
3632 if (valRef.isVoid()) {
3639 gROOT->SetLineHasBeenProcessed();
3649 void (*histaddFunc)(
const char*
line))
3654#if defined(R__MUST_REVISIT)
3655#if R__MUST_REVISIT(6,2)
3656 Warning(
"SetGetline",
"Cling should support the equivalent of SetGetlineFunc(getlineFunc, histaddFunc)");
3669 if ((std::distance(T.decls_begin(), T.decls_end()) != 1)
3670 || T.deserialized_decls_begin() != T.deserialized_decls_end()
3671 || T.macros_begin() != T.macros_end()
3672 || ((!T.getFirstDecl().isNull()) && ((*T.getFirstDecl().begin()) != T.getWrapperFD()))) {
3695 std::set<TObject*>::iterator iSpecial = ((std::set<TObject*>*)
fgSetOfSpecials)->find(obj);
3713#if defined(R__MUST_REVISIT)
3714#if R__MUST_REVISIT(6,2)
3716 Warning(
"Reset",
"Cling should support the equivalent of scratch_upto(&fDictPos)");
3726#if defined(R__MUST_REVISIT)
3727#if R__MUST_REVISIT(6,2)
3729 Warning(
"ResetAll",
"Cling should support the equivalent of complete reset (unload everything but the startup decls.");
3756#if defined(R__MUST_REVISIT)
3757#if R__MUST_REVISIT(6,2)
3759 Warning(
"ResetGlobalVar",
"Cling should support the equivalent of resetglobalvar(obj)");
3771#if defined(R__MUST_REVISIT)
3772#if R__MUST_REVISIT(6,2)
3774 Warning(
"RewindDictionary",
"Cling should provide a way to revert transaction similar to rewinddictionary()");
3785#if defined(R__MUST_REVISIT)
3786#if R__MUST_REVISIT(6,2)
3788 Warning(
"DeleteGlobal",
"Cling should provide the equivalent of deleteglobal(obj), see also DeleteVariable.");
3800#if defined(R__MUST_REVISIT)
3801#if R__MUST_REVISIT(6,2)
3802 Warning(
"DeleteVariable",
"should do more that just reseting the value to zero");
3807 llvm::StringRef srName(
name);
3808 const char* unscopedName =
name;
3809 llvm::StringRef::size_type posScope = srName.rfind(
"::");
3810 const clang::DeclContext* declCtx =
nullptr;
3811 if (posScope != llvm::StringRef::npos) {
3812 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
3813 const clang::Decl* scopeDecl
3814 = lh.findScope(srName.substr(0, posScope),
3815 cling::LookupHelper::WithDiagnostics);
3817 Error(
"DeleteVariable",
"Cannot find enclosing scope for variable %s",
3821 declCtx = llvm::dyn_cast<clang::DeclContext>(scopeDecl);
3823 Error(
"DeleteVariable",
3824 "Enclosing scope for variable %s is not a declaration context",
3828 unscopedName += posScope + 2;
3832 clang::NamedDecl* nVarDecl
3833 = cling::utils::Lookup::Named(&
fInterpreter->getSema(), unscopedName, declCtx);
3835 Error(
"DeleteVariable",
"Unknown variable %s",
name);
3838 clang::VarDecl* varDecl = llvm::dyn_cast<clang::VarDecl>(nVarDecl);
3840 Error(
"DeleteVariable",
"Entity %s is not a variable",
name);
3844 clang::QualType qType = varDecl->getType();
3845 const clang::Type*
type = qType->getUnqualifiedDesugaredType();
3848 if (
type->isPointerType()) {
3849 int** ppInt = (
int**)
fInterpreter->getAddressOfGlobal(GlobalDecl(varDecl));
3851 if (ppInt) *ppInt =
nullptr;
3861#if defined(R__MUST_REVISIT)
3862#if R__MUST_REVISIT(6,2)
3864 Warning(
"SaveContext",
"Cling should provide a way to record a state watermark similar to store_dictposition(&fDictPos)");
3874#if defined(R__MUST_REVISIT)
3875#if R__MUST_REVISIT(6,2)
3877 Warning(
"SaveGlobalsContext",
"Cling should provide a way to record a watermark for the list of global variable similar to store_dictposition(&fDictPosGlobals)");
3925 std::tuple<int,double>
value;
3929 size_t offset0 = ((
char*)&(std::get<0>(
value))) - ((
char*)&
value);
3930 size_t offset1 = ((
char*)&(std::get<1>(
value))) - ((
char*)&
value);
3932 size_t ascOffset0 = ((
char*)&(asc.
_0)) - ((
char*)&asc);
3933 size_t ascOffset1 = ((
char*)&(asc.
_1)) - ((
char*)&asc);
3935 size_t desOffset0 = ((
char*)&(des.
_0)) - ((
char*)&des);
3936 size_t desOffset1 = ((
char*)&(des.
_1)) - ((
char*)&des);
3938 if (offset0 == ascOffset0 && offset1 == ascOffset1) {
3940 }
else if (offset0 == desOffset0 && offset1 == desOffset1) {
3950 std::string alternateName =
"TEmulatedTuple";
3951 alternateName.append( classname + 5 );
3953 std::string fullname =
"ROOT::Internal::" + alternateName;
3954 if (lh.findScope(fullname, cling::LookupHelper::NoDiagnostics,
3960 auto iter = tupleContent.
fElements.begin() + 1;
3961 auto theEnd = tupleContent.
fElements.end() - 1;
3962 auto deleter = [](TypeInfo_t *
type) {
3965 std::unique_ptr<TypeInfo_t,
decltype(deleter)>
type{
gInterpreter->TypeInfo_Factory(), deleter };
3966 while (iter != theEnd) {
3970 Error(
"Load",
"Could not declare alternate type for %s since %s (or one of its context) is private or protected",
3971 classname, iter->c_str());
3978 std::string guard_name;
3980 std::ostringstream guard;
3981 guard <<
"ROOT_INTERNAL_TEmulated_";
3982 guard << guard_name;
3984 std::ostringstream alternateTuple;
3985 alternateTuple <<
"#ifndef " << guard.str() <<
"\n";
3986 alternateTuple <<
"#define " << guard.str() <<
"\n";
3987 alternateTuple <<
"namespace ROOT { namespace Internal {\n";
3988 alternateTuple <<
"template <class... Types> struct TEmulatedTuple;\n";
3989 alternateTuple <<
"template <> struct " << alternateName <<
" {\n";
3994 unsigned int nMember = 0;
3995 auto iter = tupleContent.
fElements.begin() + 1;
3996 auto theEnd = tupleContent.
fElements.end() - 1;
3997 while (iter != theEnd) {
3998 alternateTuple <<
" " << *iter <<
" _" << nMember <<
";\n";
4005 unsigned int nMember = tupleContent.
fElements.size() - 3;
4006 auto iter = tupleContent.
fElements.rbegin() + 1;
4007 auto theEnd = tupleContent.
fElements.rend() - 1;
4008 while (iter != theEnd) {
4009 alternateTuple <<
" " << *iter <<
" _" << nMember <<
";\n";
4016 Fatal(
"TCling::SetClassInfo::AlternateTuple",
4017 "Layout of std::tuple on this platform is unexpected.");
4022 alternateTuple <<
"};\n";
4023 alternateTuple <<
"}}\n";
4024 alternateTuple <<
"#endif\n";
4029 Error(
"Load",
"Could not declare %s",alternateName.c_str());
4032 alternateName =
"ROOT::Internal::" + alternateName;
4033 return alternateName;
4073 auto SetWithoutClassInfoState = [](
TClass *cl)
4086 if (strncmp(cl->
GetName(),
"tuple<",strlen(
"tuple<"))==0) {
4089 if (reload ||
name.empty()) {
4091 SetWithoutClassInfoState(cl);
4103 SetWithoutClassInfoState(cl);
4120 zombieCandidate =
kTRUE;
4127 zombieCandidate =
kTRUE;
4180 static const char *anonEnum =
"anonymous enum ";
4181 static const int cmplen = strlen(anonEnum);
4208 const char *classname =
name;
4211 class MaybeSuspendAutoLoadParse {
4212 int fStoreAutoLoad = 0;
4213 int fStoreAutoParse = 0;
4214 bool fSuspendedAutoParse =
false;
4216 MaybeSuspendAutoLoadParse(
int autoload) {
4217 fStoreAutoLoad = ((
TCling*)
gCling)->SetClassAutoLoading(autoload);
4221 fSuspendedAutoParse =
true;
4222 fStoreAutoParse = ((
TCling*)
gCling)->SetSuspendAutoParsing(
true);
4225 ~MaybeSuspendAutoLoadParse() {
4226 if (fSuspendedAutoParse)
4227 ((
TCling*)
gCling)->SetSuspendAutoParsing(fStoreAutoParse);
4228 ((
TCling*)
gCling)->SetClassAutoLoading(fStoreAutoLoad);
4232 MaybeSuspendAutoLoadParse autoLoadParseRAII( autoload );
4234 autoLoadParseRAII.SuspendAutoParsing();
4243 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
4244 const clang::Type *
type =
nullptr;
4245 const clang::Decl *decl
4246 = lh.findScope(classname,
4247 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
4248 : cling::LookupHelper::NoDiagnostics,
4252 decl = lh.findScope(buf,
4253 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
4254 : cling::LookupHelper::NoDiagnostics,
4271 clang::ClassTemplateSpecializationDecl *tmpltDecl =
4272 llvm::dyn_cast_or_null<clang::ClassTemplateSpecializationDecl>
4273 (
type->getAsCXXRecordDecl());
4274 if (tmpltDecl && !tmpltDecl->getPointOfInstantiation().isValid()) {
4291 if (tci.
Property() & propertiesMask) {
4292 bool hasClassDefInline =
false;
4293 if (isClassOrNamespaceOnly) {
4299 if (hasDictionary.IsValid() && implLineFunc.IsValid()) {
4301 bool success =
false;
4302 std::tie(success, lineNumber) =
4304 hasClassDefInline = success && (lineNumber == -1);
4312 if (hasClassDefInline)
4351 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
4354 const clang::Decl *decl
4355 = lh.findClassTemplate(
name,
4356 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
4357 : cling::LookupHelper::NoDiagnostics);
4359 std::string strname =
"std::";
4361 decl = lh.findClassTemplate(strname,
4362 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
4363 : cling::LookupHelper::NoDiagnostics);
4365 return nullptr != decl;
4389 cl->
fBase = listOfBase;
4405 D =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
4408 if (
const clang::DeclContext* DC = dyn_cast<clang::DeclContext>(D)) {
4411 llvm::SmallVector< DeclContext *, 4> allDeclContexts;
4412 const_cast< clang::DeclContext *
>(DC)->collectAllContexts(allDeclContexts);
4413 for (llvm::SmallVector<DeclContext*, 4>::iterator declIter = allDeclContexts.begin(), declEnd = allDeclContexts.end();
4414 declIter != declEnd; ++declIter) {
4416 for (clang::DeclContext::decl_iterator DI = (*declIter)->decls_begin(),
4417 DE = (*declIter)->decls_end(); DI != DE; ++DI) {
4418 if (
const clang::EnumDecl* ED = dyn_cast<clang::EnumDecl>(*DI)) {
4421 PrintingPolicy Policy(ED->getASTContext().getPrintingPolicy());
4422 llvm::raw_string_ostream stream(buf);
4424 Policy.AnonymousTagLocations =
false;
4425 ED->getNameForDiagnostic(stream, Policy,
false);
4429 const char*
name = buf.c_str();
4453 D =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
4457 if (
const clang::DeclContext* DC = dyn_cast<clang::DeclContext>(D)) {
4460 llvm::SmallVector< DeclContext *, 4> allDeclContexts;
4461 const_cast< clang::DeclContext *
>(DC)->collectAllContexts(allDeclContexts);
4462 for (llvm::SmallVector<DeclContext*, 4>::iterator declIter = allDeclContexts.begin(),
4463 declEnd = allDeclContexts.end(); declIter != declEnd; ++declIter) {
4465 for (clang::DeclContext::decl_iterator DI = (*declIter)->decls_begin(),
4466 DE = (*declIter)->decls_end(); DI != DE; ++DI) {
4467 if (
const clang::FunctionTemplateDecl* FTD = dyn_cast<clang::FunctionTemplateDecl>(*DI)) {
4468 funcTempList->
Get(FTD);
4526 if (
m->fMethodArgs) {
4537 m->fMethodArgs = arglist;
4582 if (llvm::isa<clang::NamespaceDecl>(cli->
GetDecl())) {
4591 Error(
"GenerateTClass",
4592 "Cannot find %s::Class_Version()! Class version might be wrong.",
4599 if (newvers == -1) {
4607 newvers = callfunc.
ExecInt(
nullptr);
4609 Error(
"GenerateTClass",
4610 "Cannot invoke %s::Class_Version()! Class version might be wrong.",
4614 if (newvers != oldvers) {
4631static void GenerateTClass_GatherInnerIncludes(cling::Interpreter *interp,
TString &includes,
TClingClassInfo *info)
4635 const clang::ClassTemplateSpecializationDecl *templateCl
4636 = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(info->
GetDecl());
4638 for(
unsigned int i=0; i < templateCl->getTemplateArgs().
size(); ++i) {
4639 const clang::TemplateArgument &arg( templateCl->getTemplateArgs().get(i) );
4640 if (arg.getKind() == clang::TemplateArgument::Type) {
4643 if (!uType->isFundamentalType() && !uType->isEnumeralType()) {
4645 const clang::CXXRecordDecl *argdecl = uType->getAsCXXRecordDecl();
4648 TClingClassInfo subinfo(interp,*(argdecl->getASTContext().getRecordType(argdecl).getTypePtr()));
4649 GenerateTClass_GatherInnerIncludes(interp, includes, &subinfo);
4652 llvm::raw_string_ostream OS(Result);
4653 arg.print(argdecl->getASTContext().getPrintingPolicy(),OS);
4654 Warning(
"TCling::GenerateTClass",
"Missing header file for %s",OS.str().c_str());
4669 if (!info || !info->
IsValid()) {
4670 Fatal(
"GenerateTClass",
"Requires a valid ClassInfo object");
4675 std::string classname;
4679 Info(
"GenerateTClass",
"Will (try to) generate the compiled TClass for %s.",classname.c_str());
4683 GenerateTClass_GatherInnerIncludes(
fInterpreter,includes,info);
4689 Error(
"GenerateTClass",
"Even though the dictionary generation for %s seemed successful we can't find the TClass bootstrap!",classname.c_str());
4693 if (cl ==
nullptr) {
4695 cl =
new TClass(classinfo, version,
nullptr,
nullptr, -1, -1, silent);
4700 cl =
new TClass(classinfo, 1,
nullptr,
nullptr, -1, -1, silent);
4725 if (classes ==
nullptr || classes[0] == 0) {
4726 Error(
"TCling::GenerateDictionary",
"Cannot generate dictionary without passing classes.");
4730 std::vector<std::string> listClasses;
4732 const char* current = classes, *prev = classes;
4736 if (*current ==
';') {
4737 listClasses.push_back(std::string(prev, current - prev));
4740 else if (*(current + 1) == 0) {
4741 listClasses.push_back(std::string(prev, current + 1 - prev));
4745 std::vector<std::string> listIncludes;
4749 const char* current = includes, *prev = includes;
4753 if (*current ==
';') {
4754 listIncludes.push_back(std::string(prev, current - prev));
4757 else if (*(current + 1) == 0) {
4758 listIncludes.push_back(std::string(prev, current + 1 - prev));
4764 std::vector<std::string>(), std::vector<std::string>());
4788 if (
const ValueDecl* decl = (
const ValueDecl*)
d){
4791 if (hasIoName && ioName !=
name)
return nullptr;
4803 using namespace clang;
4805 DeclarationName DName = &SemaR.Context.Idents.get(
name);
4807 LookupResult
R(SemaR, DName, SourceLocation(), Sema::LookupOrdinaryName,
4808 Sema::ForExternalRedeclaration);
4810 cling::utils::Lookup::Named(&SemaR,
R);
4812 LookupResult::Filter
F =
R.makeFilter();
4814 while (
F.hasNext()) {
4815 NamedDecl *D =
F.next();
4816 if (isa<VarDecl>(D) || isa<FieldDecl>(D) || isa<EnumConstantDecl>(D) ||
4817 isa<IndirectFieldDecl>(D))
4823 if (
R.isSingleResult())
4824 return R.getFoundDecl();
4836 const clang::Decl* possibleEnum =
nullptr;
4841 const clang::DeclContext* dc =
nullptr;
4842 if (
const clang::Decl* D = cci->
GetDecl()) {
4843 if (!(dc = dyn_cast<clang::NamespaceDecl>(D))) {
4844 dc = dyn_cast<clang::RecordDecl>(D);
4851 possibleEnum = cling::utils::Lookup::Tag(&
fInterpreter->getSema(),
name, dc);
4853 Error(
"TCling::GetEnum",
"DeclContext not found for %s .\n",
name);
4862 if (possibleEnum && (possibleEnum != (clang::Decl*)-1)
4863 && isa<clang::EnumDecl>(possibleEnum)) {
4864 return possibleEnum;
4874 if (!gv)
return nullptr;
4876 llvm::StringRef mangled_name = gv->getName();
4891 std::string scopename(demangled_name_c);
4892 free(demangled_name_c);
4898 std::string dataname;
4900 if (!strncmp(scopename.c_str(),
"typeinfo for ",
sizeof(
"typeinfo for ")-1)) {
4901 scopename.erase(0,
sizeof(
"typeinfo for ")-1);
4902 }
else if (!strncmp(scopename.c_str(),
"vtable for ",
sizeof(
"vtable for ")-1)) {
4903 scopename.erase(0,
sizeof(
"vtable for ")-1);
4906 std::string::size_type pos = scopename.rfind(
'(');
4907 if (pos != std::string::npos) {
4911 pos = scopename.rfind(
':');
4912 if (pos != std::string::npos) {
4913 if ((pos != 0) && (scopename[pos-1] ==
':')) {
4914 dataname = scopename.substr(pos+1);
4915 scopename.erase(pos-1);
4919 dataname = scopename;
4927 if (scopename.size()) {
4943 Error(
"GetDataMemberWithValue()",
"not implemented");
4953 Error(
"GetDataMemberAtAddr()",
"not implemented");
4963 const char* params,
Bool_t objectIsConst )
4981 return mangled_name;
4996 GetMethod(method,
proto, objectIsConst,
nullptr ,
mode).GetMangledName();
5008 const char* params,
Bool_t objectIsConst )
5049 std::vector<DeclId_t>& res)
const
5052 clang::ASTContext& Ctx = S.Context;
5053 const clang::Decl* CtxDecl
5055 Ctx.getTranslationUnitDecl();
5056 auto RecDecl = llvm::dyn_cast<const clang::RecordDecl>(CtxDecl);
5057 const clang::DeclContext* DeclCtx = RecDecl;
5060 DeclCtx = dyn_cast<clang::NamespaceDecl>(CtxDecl);
5061 if (!DeclCtx)
return;
5063 clang::DeclarationName DName;
5068 if (RecDecl->getNameAsString() == funcname) {
5069 clang::QualType QT = Ctx.getTypeDeclType(RecDecl);
5070 DName = Ctx.DeclarationNames.getCXXConstructorName(Ctx.getCanonicalType(QT));
5071 }
else if (funcname[0] ==
'~' && RecDecl->getNameAsString() == funcname + 1) {
5072 clang::QualType QT = Ctx.getTypeDeclType(RecDecl);
5073 DName = Ctx.DeclarationNames.getCXXDestructorName(Ctx.getCanonicalType(QT));
5075 DName = &Ctx.Idents.get(funcname);
5078 DName = &Ctx.Idents.get(funcname);
5082 clang::LookupResult
R(S, DName, clang::SourceLocation(),
5083 Sema::LookupOrdinaryName, clang::Sema::NotForRedeclaration);
5084 R.suppressDiagnostics();
5085 S.LookupQualifiedName(
R,
const_cast<DeclContext*
>(DeclCtx));
5086 if (
R.empty())
return;
5088 res.reserve(res.size() + (
R.end() -
R.begin()));
5089 for (clang::LookupResult::iterator IR =
R.begin(), ER =
R.end();
5091 if (
const clang::FunctionDecl* FD
5092 = llvm::dyn_cast<const clang::FunctionDecl>(*IR)) {
5093 if (!FD->getDescribedFunctionTemplate()) {
5096 }
else if (
const auto *USD = llvm::dyn_cast<const clang::UsingShadowDecl>(*IR)) {
5098 if (llvm::isa<clang::FunctionDecl>(USD->getTargetDecl())) {
5119 GetMethod(method,
proto, objectIsConst,
nullptr ,
mode).InterfaceMethod();
5258 const char* params,
Bool_t objectIsConst,
int* error)
5278 const char* params,
int* error)
5280 Execute(obj,cl,method,params,
false,error);
5295 Error(
"Execute",
"No method was defined");
5304 if (argc > nparms) {
5305 Error(
"Execute",
"Too many parameters to call %s, got %d but expected at most %d.",method->
GetName(),argc,nparms);
5308 if (nparms != argc) {
5318 Int_t firstDefault = -1;
5319 for (
Int_t i = 0; i < nparms; i ++) {
5326 if (firstDefault >= 0) {
5327 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);
5329 Error(
"Execute",
"Too few arguments to call %s, got only %d but expected %d.",method->
GetName(),argc,nparms);
5335 const char* listpar =
"";
5340 for (
Int_t i = 0; i < argc; i ++) {
5349 chpar += (nxtpar->
String()).ReplaceAll(
"\"",
"\\\"");
5356 complete += nxtpar->
String();
5359 listpar = complete.
Data();
5386 const void* args[] ,
5391 Error(
"ExecuteWithArgsAndReturn",
"No method was defined");
5418 Warning(
"GetTopLevelMacroName",
"Must change return type!");
5465#if defined(R__MUST_REVISIT)
5466#if R__MUST_REVISIT(6,0)
5467 Warning(
"GetCurrentMacroName",
"Must change return type!");
5480 TTHREAD_TLS_DECL(std::string,t);
5482 if (!strstr(typeDesc,
"(*)(")) {
5483 const char *s = strchr(typeDesc,
' ');
5484 const char *template_start = strchr(typeDesc,
'<');
5485 if (!strcmp(typeDesc,
"long long")) {
5488 else if (!strncmp(typeDesc,
"unsigned ", s + 1 - typeDesc)) {
5495 else if (s && (template_start ==
nullptr || (s < template_start))) {
5505 auto l = t.length();
5506 while (
l > 0 && (t[
l - 1] ==
'*' || t[
l - 1] ==
'&'))
5514 assert(rootmapfile && *rootmapfile);
5516 llvm::StringRef libName = llvm::sys::path::filename(rootmapfile);
5517 libName.consume_back(
".rootmap");
5519 return !
gInterpreter->HasPCMForLibrary(libName.str().c_str());
5530 if (!(rootmapfile && *rootmapfile))
5537 const std::map<char, unsigned int> keyLenMap = {{
'c',6},{
'n',10},{
't',8},{
'h',7},{
'e',5},{
'v',4}};
5539 std::string rootmapfileNoBackslash(rootmapfile);
5541 std::replace(rootmapfileNoBackslash.begin(), rootmapfileNoBackslash.end(),
'\\',
'/');
5548 std::string lineDirective = std::string(
"\n#line 2 \"Forward declarations from ") + rootmapfileNoBackslash +
"\"\n";
5550 std::ifstream file(rootmapfileNoBackslash);
5553 std::string lib_name;
5555 bool newFormat =
false;
5556 while (getline(file,
line,
'\n')) {
5557 if (!newFormat && (
line.compare(0, 8,
"Library.") == 0 ||
line.compare(0, 8,
"Declare.") == 0)) {
5563 if (
line.compare(0, 9,
"{ decls }") == 0) {
5566 while (getline(file,
line,
'\n')) {
5569 if (!uniqueString) {
5570 Error(
"ReadRootmapFile",
"Cannot handle \"{ decls }\" sections in custom rootmap file %s",
5571 rootmapfileNoBackslash.c_str());
5574 if (!lineDirective.empty())
5575 uniqueString->
Append(lineDirective);
5579 const char firstChar =
line[0];
5580 if (firstChar ==
'[') {
5582 auto brpos =
line.find(
']');
5583 if (brpos == string::npos)
5585 lib_name =
line.substr(1, brpos - 1);
5587 lib_name.erase(lib_name.find_last_not_of(
' ') + 1);
5588 lib_name.erase(0, lib_name.find_first_not_of(
' '));
5590 TString lib_nameTstr(lib_name.c_str());
5595 Info(
"ReadRootmapFile",
"%s: New section for %s", rootmapfile, lib_nameTstr.
Data());
5597 Info(
"ReadRootmapFile",
"%s: Section for %s (library does not exist)", rootmapfile, lib_nameTstr.
Data());
5603 auto keyLenIt = keyLenMap.find(firstChar);
5604 if (keyLenIt == keyLenMap.end())
5606 unsigned int keyLen = keyLenIt->second;
5608 const char *keyname =
line.c_str() + keyLen;
5610 Info(
"ReadRootmapFile",
"%s: class %s in %s", rootmapfile, keyname, lib_name.c_str());
5613 if (lib_name != isThere->
GetValue()) {
5614 if (firstChar ==
'n') {
5616 Info(
"ReadRootmapFile",
5617 "While processing %s, namespace %s was found to be associated to %s although it is already "
5619 rootmapfile, keyname, lib_name.c_str(), isThere->
GetValue());
5620 }
else if (firstChar ==
'h') {
5626 "While processing %s, %s %s was found to be associated to %s although it is already "
5628 rootmapfile,
line.substr(0, keyLen - 1).c_str(), keyname, lib_name.c_str(),
5633 Info(
"ReadRootmapFile",
"While processing %s, key %s was found to be already defined for %s",
5634 rootmapfile, keyname, lib_name.c_str());
5695 using namespace clang;
5697 class ExtVisibleStorageAdder:
public RecursiveASTVisitor<ExtVisibleStorageAdder>{
5703 ExtVisibleStorageAdder(std::unordered_set<const NamespaceDecl*>& nsSet): fNSSet(nsSet) {};
5704 bool VisitNamespaceDecl(NamespaceDecl* nsDecl) {
5709 nsDecl->setHasExternalVisibleStorage();
5710 fNSSet.insert(nsDecl);
5713 bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl* specDecl) {
5716 if (specDecl->getTemplateSpecializationKind() == TSK_ExplicitSpecialization)
5718 specDecl->setHasExternalLexicalStorage();
5730 std::unordered_set<const NamespaceDecl*>& fNSSet;
5777 for (
Int_t j = 0; j < i; j++) {
5788 Info(
"LoadLibraryMap",
"%s",
d.Data());
5793 if (
f.EndsWith(
".rootmap")) {
5799 Info(
"LoadLibraryMap",
" rootmap file: %s",
p.Data());
5817 if (
f.BeginsWith(
"rootmap")) {
5822 Warning(
"LoadLibraryMap",
"please rename %s to end with \".rootmap\"",
p.Data());
5835 if (rootmapfile && *rootmapfile) {
5842 else if (res == -3) {
5852 while ((rec = (
TEnvRec*) next())) {
5854 if (!strncmp(cls.
Data(),
"Library.", 8) && cls.
Length() > 8) {
5856 TString libs = rec->GetValue();
5873 Info(
"LoadLibraryMap",
"class %s in %s", cls.
Data(), wlib);
5876 Info(
"LoadLibraryMap",
"class %s in %s (library does not exist)", cls.
Data(), lib);
5882 else if (!strncmp(cls.
Data(),
"Declare.", 8) && cls.
Length() > 8) {
5892 cling::Transaction* T =
nullptr;
5894 assert(cling::Interpreter::kSuccess == compRes &&
"A declaration in a rootmap could not be compiled");
5896 if (compRes!=cling::Interpreter::kSuccess){
5898 "Problems in %s declaring '%s' were encountered.", rootmapfile, uniqueString.
Data()) ;
5903 for (
auto declIt = T->decls_begin(); declIt < T->decls_end(); ++declIt) {
5904 if (declIt->m_DGR.isSingleDecl()) {
5905 if (Decl* D = declIt->m_DGR.getSingleDecl()) {
5906 if (clang::isa<TagDecl>(D) || clang::isa<NamespaceDecl>(D)) {
5907 evsAdder.TraverseDecl(D);
5942 for (
Int_t ilib = 0; ilib < nrSharedLibs; ilib++) {
5949 TString rootMapBaseStr = sharedLibBaseStr;
5950 if (sharedLibBaseStr.
EndsWith(
".dll")) {
5953 else if (sharedLibBaseStr.
EndsWith(
".DLL")) {
5956 else if (sharedLibBaseStr.
EndsWith(
".so")) {
5959 else if (sharedLibBaseStr.
EndsWith(
".sl")) {
5962 else if (sharedLibBaseStr.
EndsWith(
".dl")) {
5965 else if (sharedLibBaseStr.
EndsWith(
".a")) {
5969 Error(
"ReloadAllSharedLibraryMaps",
"Unknown library type %s", sharedLibBaseStr.
Data());
5973 rootMapBaseStr +=
".rootmap";
5976 Error(
"ReloadAllSharedLibraryMaps",
"Could not find rootmap %s in path", rootMapBaseStr.
Data());
5983 Error(
"ReloadAllSharedLibraryMaps",
"Error loading map %s", rootMap);
6018 if (!
fMapfile || !library || !*library) {
6031 while ((rec = (
TEnvRec *) next())) {
6035 TString libs = rec->GetValue();
6042 if (!strncmp(cls.
Data(),
"Library.", 8) && cls.
Length() > 8) {
6051 if (!strncmp(lib, libname.
Data(),
len)) {
6053 Error(
"UnloadLibraryMap",
"entry for <%s, %s> not found in library map table", cls.
Data(), lib);
6061 TString library_rootmap(library);
6062 if (!library_rootmap.
EndsWith(
".rootmap"))
6063 library_rootmap.
Append(
".rootmap");
6114 if (err)
return nullptr;
6116 free(demangled_name);
6134 std::string demangled_name(demangled_name_c);
6135 free(demangled_name_c);
6167 if (
gROOT->LoadClass(cls, deplib) == 0) {
6170 "loaded dependent library %s for %s", deplib, cls);
6175 "failure loading dependent library %s for %s",
6180 if (lib && lib[0]) {
6181 if (
gROOT->LoadClass(cls, lib) == 0) {
6184 "loaded library %s for %s", lib, cls);
6190 "failure loading library %s for %s", lib, cls);
6205 bool nameIsNormalized)
6211 if (!visited.insert(std::string(cls)).second)
6221 for (
auto element :
proto->GetData()) {
6222 if (element->IsBasic())
6224 const char *subtypename = element->GetTypeName();
6240 if (classinfo &&
gInterpreter->ClassInfo_IsValid(classinfo)
6244 while (
gInterpreter->DataMemberInfo_Next(memberinfo)) {
6277 Info(
"TCling::AutoLoad",
"Explicitly disabled (the class name is %s)", cls);
6297 Info(
"TCling::AutoLoad",
6298 "Trying to autoload for %s", cls);
6303 Info(
"TCling::AutoLoad",
6304 "Disabled due to gROOT or gInterpreter being invalid/not ready (the class name is %s)", cls);
6325 std::unordered_set<std::string> visited;
6334 cling::Interpreter *interpreter)
6336 std::string code = gNonInterpreterClassDef ;
6343 code += (
"#include \"");
6347 code += (
"#ifdef __ROOTCLING__\n"
6348 "#undef __ROOTCLING__\n"
6349 + gInterpreterClassDef +
6352 cling::Interpreter::CompilationResult cr;
6358 Sema &SemaR = interpreter->getSema();
6360 clangDiagSuppr diagSuppr(SemaR.getDiagnostics());
6362 #if defined(R__MUST_REVISIT)
6363 #if R__MUST_REVISIT(6,2)
6364 Warning(
"TCling::RegisterModule",
"Diagnostics suppression should be gone by now.");
6368 cr = interpreter->parseForModule(code);
6386 Int_t nHheadersParsed = 0;
6387 unsigned long offset = 0;
6388 if (strncmp(cls,
"const ", 6) == 0) {
6393 bool skipFirstEntry =
false;
6394 std::vector<std::string> autoparseKeys;
6395 if (strchr(cls,
'<')) {
6401 if (!autoparseKeys.empty() && !autoparseKeys[0].empty()) {
6406 TString templateName(autoparseKeys[0]);
6407 auto tokens = templateName.
Tokenize(
"::");
6408 clang::NamedDecl* previousScopeAsNamedDecl =
nullptr;
6409 clang::DeclContext* previousScopeAsContext =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
6411 previousScopeAsContext =
fInterpreter->getSema().getStdNamespace();
6413 for (
Int_t tk = 0; tk < nTokens; ++tk) {
6414 auto scopeObj = tokens->UncheckedAt(tk);
6415 auto scopeName = ((
TObjString*) scopeObj)->String().Data();
6416 previousScopeAsNamedDecl = cling::utils::Lookup::Named(&
fInterpreter->getSema(), scopeName, previousScopeAsContext);
6418 if ((clang::NamedDecl*)-1 == previousScopeAsNamedDecl)
break;
6419 previousScopeAsContext = llvm::dyn_cast_or_null<clang::DeclContext>(previousScopeAsNamedDecl);
6420 if (!previousScopeAsContext)
break;
6424 if ((clang::NamedDecl*)-1 != previousScopeAsNamedDecl) {
6425 if (
auto templateDecl = llvm::dyn_cast_or_null<clang::ClassTemplateDecl>(previousScopeAsNamedDecl)) {
6426 if (
auto templatedDecl = templateDecl->getTemplatedDecl()) {
6427 skipFirstEntry = templatedDecl->hasDefinition();
6434 if (topLevel) autoparseKeys.emplace_back(cls);
6436 for (
const auto & apKeyStr : autoparseKeys) {
6437 if (skipFirstEntry) {
6438 skipFirstEntry=
false;
6441 if (apKeyStr.empty())
continue;
6442 const char *apKey = apKeyStr.c_str();
6446 Info(
"TCling::AutoParse",
6447 "Starting autoparse for %s\n", apKey);
6452 const cling::Transaction *T =
fInterpreter->getCurrentTransaction();
6454 auto const &hNamesPtrs = iter->second;
6456 Info(
"TCling::AutoParse",
6457 "We can proceed for %s. We have %s headers.", apKey, std::to_string(hNamesPtrs.size()).c_str());
6459 for (
auto & hName : hNamesPtrs) {
6461 if (0 !=
fPayloads.count(normNameHash)) {
6462 float initRSSval=0.f, initVSIZEval=0.f;
6464 (void) initVSIZEval;
6467 "Parsing full payload for %s", apKey);
6474 if (cRes != cling::Interpreter::kSuccess) {
6475 if (hName[0] ==
'\n')
6476 Error(
"AutoParse",
"Error parsing payload code for class %s with content:\n%s", apKey, hName);
6485 Info(
"Autoparse",
">>> RSS key %s - before %.3f MB - after %.3f MB - delta %.3f MB", apKey, initRSSval, endRSSval, endRSSval-initRSSval);
6486 Info(
"Autoparse",
">>> VSIZE key %s - before %.3f MB - after %.3f MB - delta %.3f MB", apKey, initVSIZEval, endVSIZEval, endVSIZEval-initVSIZEval);
6492 "Parsing single header %s", hName);
6495 if (cRes != cling::Interpreter::kSuccess) {
6496 Error(
"AutoParse",
"Error parsing headerfile %s for class %s.", hName, apKey);
6508 if (strchr(apKey,
'<')) {
6515 return nHheadersParsed;
6525 if (llvm::StringRef(cls).contains(
"(lambda)"))
6539 Info(
"TCling::AutoParse",
6540 "Trying to autoparse for %s", cls);
6562 return nHheadersParsed > 0 ? 1 : 0;
6570 StringRef errMsg(errmessage);
6571 if (errMsg.contains(
"undefined symbol: ")) {
6573 std::string mangled_name = std::string(errMsg.split(
"undefined symbol: ").second);
6574 void* res = ((
TCling*)
gCling)->LazyFunctionCreatorAutoload(mangled_name);
6575 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
6576 if (res && DLM && (DLM->loadLibrary(libStem, permanent, resolved) == cling::DynamicLibraryManager::kLoadLibSuccess))
6595 if (
void* Addr = llvm::sys::DynamicLibrary::SearchForAddressOfSymbol(dlsym_mangled_name))
6598 const cling::DynamicLibraryManager &DLM = *
GetInterpreterImpl()->getDynamicLibraryManager();
6601 auto LibLoader = [](
const std::string& LibName) ->
bool {
6602 if (
gSystem->
Load(LibName.c_str(),
"",
false) < 0) {
6603 ::Error(
"TCling__LazyFunctionCreatorAutoloadForModule",
6604 "Failed to load library %s", LibName.c_str());
6610 std::string libName = DLM.searchLibrariesForSymbol(mangled_name,
6613 assert(!llvm::StringRef(libName).startswith(
"libNew") &&
6614 "We must not resolve symbols from libNew!");
6616 if (libName.empty())
6619 if (!LibLoader(libName))
6622 return llvm::sys::DynamicLibrary::SearchForAddressOfSymbol(dlsym_mangled_name);
6642 const NamedDecl *oldDef = llvm::dyn_cast_or_null<NamedDecl>(cci->
GetDecl());
6643 if (!oldDef || (def && def != oldDef)) {
6652 Error(
"RefreshClassInfo",
"Should not need to update the classInfo a non type decl: %s", oldDef->getNameAsString().c_str());
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)
6895 if (D->isFromASTFile())
6903 if (isa<VarDecl>(D) || isa<FieldDecl>(D) || isa<EnumConstantDecl>(D)) {
6909 }
else if (isa<FunctionDecl>(D)) {
6911 }
else if (isa<FunctionTemplateDecl>(D)) {
6913 }
else if (isa<EnumDecl>(D)) {
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) {
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::StructuralValue:
7040 case TemplateArgument::Expression:
7041 case TemplateArgument::Template:
7042 case TemplateArgument::TemplateExpansion:
return;
7043 case TemplateArgument::Type:
7044 if (
const TagType *TagTy = dyn_cast<TagType>(
TA.getAsType()))
7045 return Visit(TagTy->getDecl());
7047 case TemplateArgument::Declaration:
return Visit(
TA.getAsDecl());
7049 llvm_unreachable(
"Invalid TemplateArgument::Kind!");
7052 void VisitClassTemplateSpecializationDecl(
const ClassTemplateSpecializationDecl *CTSD)
7054 if (CTSD->getOwningModule())
7057 VisitDecl(CTSD->getSpecializedTemplate());
7058 const TemplateArgumentList &ArgList = CTSD->getTemplateArgs();
7059 for (
const TemplateArgument *Arg = ArgList.data(), *ArgEnd = Arg + ArgList.size(); Arg != ArgEnd; ++Arg) {
7060 VisitTemplateArgument(*Arg);
7065 llvm::DenseSet<Module *> TopLevelModules;
7066 ModuleCollector
m(TopLevelModules);
7069 for (
auto M : TopLevelModules) {
7072 if (!M->LinkLibraries.size())
7075 if (M->Name ==
"Core" && skipCore)
7077 assert(M->LinkLibraries.size() == 1);
7080 result += M->LinkLibraries[0].Library;
7103 llvm::StringRef className = cls;
7109 if (className.contains(
"(lambda)"))
7113 cling::LookupHelper &LH =
fInterpreter->getLookupHelper();
7115 if (!libs.empty()) {
7121 if (!cls || !*cls) {
7126 TEnvRec* libs_record =
nullptr;
7129 const char* libs = libs_record->
GetValue();
7130 return (*libs) ? libs :
nullptr;
7144 TEnvRec* libs_record =
nullptr;
7147 const char* libs = libs_record->
GetValue();
7148 return (*libs) ? libs :
nullptr;
7162 cling::Interpreter *interp,
7163 bool skipLoadedLibs =
true)
7166 if (!llvm::sys::path::is_absolute(lib)) {
7168 Error(
"TCling__GetSharedLibImmediateDepsSlow",
"Cannot find library '%s'", lib.c_str());
7172 assert(llvm::sys::fs::exists(lib) &&
"Must exist!");
7173 lib = llvm::sys::path::filename(lib).str();
7176 auto ObjF = llvm::object::ObjectFile::createObjectFile(LibFullPath.
Data());
7178 Warning(
"TCling__GetSharedLibImmediateDepsSlow",
"Failed to read object file %s", lib.c_str());
7182 llvm::object::ObjectFile *BinObjFile = ObjF.get().getBinary();
7184 std::set<string> DedupSet;
7185 std::string Result = lib +
' ';
7186 for (
const auto &S : BinObjFile->symbols()) {
7187 uint32_t Flags = llvm::cantFail(S.getFlags());
7189 if (!(Flags & llvm::object::SymbolRef::SF_Undefined))
7193 if (Flags & llvm::object::SymbolRef::SF_Weak)
7195 llvm::Expected<StringRef> SymNameErr = S.getName();
7197 Warning(
"GetSharedLibDepsForModule",
"Failed to read symbol");
7200 llvm::StringRef SymName = SymNameErr.get();
7201 if (SymName.empty())
7204 if (BinObjFile->isELF()) {
7208 if (SymName.contains(
"@GLIBCXX") || SymName.contains(
"@CXXABI") ||
7209 SymName.contains(
"@GLIBC") || SymName.contains(
"@GCC"))
7217 static constexpr llvm::StringRef RegisterClasses(
"_Jv_RegisterClasses");
7218 static constexpr llvm::StringRef RegisterCloneTable(
"_ITM_registerTMCloneTable");
7219 static constexpr llvm::StringRef DeregisterCloneTable(
"_ITM_deregisterTMCloneTable");
7220 if (SymName == RegisterClasses ||
7221 SymName == RegisterCloneTable ||
7222 SymName == DeregisterCloneTable)
7227 if (skipLoadedLibs) {
7229 if (llvm::sys::DynamicLibrary::SearchForAddressOfSymbol(SymNameForDlsym))
7234 std::string found = interp->getDynamicLibraryManager()->searchLibrariesForSymbol(SymName,
false);
7240 if (!found.empty()) {
7241 std::string cand = llvm::sys::path::filename(found).str();
7242 if (!DedupSet.insert(cand).second)
7245 Result += cand +
' ';
7255 llvm::SmallString<256> rootmapName;
7256 if (!lib.startswith(
"lib"))
7257 rootmapName.append(
"lib");
7259 rootmapName.append(llvm::sys::path::filename(lib));
7260 llvm::sys::path::replace_extension(rootmapName,
"rootmap");
7266 llvm::StringRef rootmapNameNoLib = rootmapName.str();
7267 if (rootmapNameNoLib.consume_front(
"lib"))
7291 if (llvm::sys::path::is_absolute(lib) && !llvm::sys::fs::exists(lib))
7295 llvm::SmallString<512> rootmapName(lib);
7296 llvm::sys::path::replace_extension(rootmapName,
"rootmap");
7297 if (llvm::sys::fs::exists(rootmapName)) {
7299 Info(
"Load",
"loading %s", rootmapName.c_str());
7306 Warning(
"TCling::GetSharedLibDeps",
"Precomputed dependencies available but scanning '%s'", lib);
7311 if (!libs.empty()) {
7317 if (!
fMapfile || !lib || !lib[0]) {
7328 while ((rec = (
TEnvRec*) next())) {
7329 const char* libs = rec->GetValue();
7330 if (!strncmp(libs, libname.
Data(),
len) && strlen(libs) >=
len
7331 && (!libs[
len] || libs[
len] ==
' ' || libs[
len] ==
'.')) {
7344#if defined(R__MUST_REVISIT)
7345#if R__MUST_REVISIT(6,2)
7346 Warning(
"IsErrorMessagesEnabled",
"Interface not available yet.");
7358#if defined(R__MUST_REVISIT)
7359#if R__MUST_REVISIT(6,2)
7360 Warning(
"SetErrorMessages",
"Interface not available yet.");
7376 llvm::SmallVector<std::string, 10> includePaths;
7378 fInterpreter->GetIncludePaths(includePaths,
false,
true);
7379 if (
const size_t nPaths = includePaths.size()) {
7380 assert(!(nPaths & 1) &&
"GetIncludePath, number of paths and options is not equal");
7382 for (
size_t i = 0; i < nPaths; i += 2) {
7387 if (includePaths[i] !=
"-I")
7421 assert(fout !=
nullptr &&
"DisplayIncludePath, 'fout' parameter is null");
7423 llvm::SmallVector<std::string, 10> includePaths;
7425 fInterpreter->GetIncludePaths(includePaths,
false,
true);
7426 if (
const size_t nPaths = includePaths.size()) {
7427 assert(!(nPaths & 1) &&
"DisplayIncludePath, number of paths and options is not equal");
7429 std::string allIncludes(
"include path:");
7430 for (
size_t i = 0; i < nPaths; i += 2) {
7432 allIncludes += includePaths[i];
7434 if (includePaths[i] !=
"-I")
7436 allIncludes += includePaths[i + 1];
7439 fprintf(fout,
"%s\n", allIncludes.c_str());
7459#if defined(R__MUST_REVISIT)
7460#if R__MUST_REVISIT(6,2)
7461 Warning(
"GenericError",
"Interface not available yet.");
7489#if defined(R__MUST_REVISIT)
7490#if R__MUST_REVISIT(6,2)
7491 Warning(
"GetSecurityError",
"Interface not available yet.");
7504 cling::Interpreter::CompilationResult compRes;
7506 return compRes == cling::Interpreter::kFailure;
7525 TTHREAD_TLS_DECL(std::string,buffer);
7527 return buffer.c_str();
7608#if defined(R__MUST_REVISIT)
7609#if R__MUST_REVISIT(6,2)
7610 Warning(
"SetErrmsgcallback",
"Interface not available yet.");
7619 &
fInterpreter->getDiagnostics().getDiagnosticOptions(),
7621 [] (clang::DiagnosticsEngine::Level Level,
const std::string &
Info) {
7622 if (Level == clang::DiagnosticsEngine::Warning) {
7623 ::Warning(
"cling",
"%s", Info.c_str());
7624 }
else if (Level == clang::DiagnosticsEngine::Error
7625 || Level == clang::DiagnosticsEngine::Fatal) {
7631 fInterpreter->replaceDiagnosticConsumer(consumer,
true);
7633 fInterpreter->replaceDiagnosticConsumer(
nullptr);
7652 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
7653 std::string canonical = DLM->lookupLibrary(path);
7654 if (canonical.empty()) {
7658 cling::Interpreter::CompilationResult compRes;
7660 return compRes == cling::Interpreter::kFailure;
7664 return std::unique_ptr<TInterpreterValue>(
new TClingValue);
7671 std::vector<std::string>& completions)
7680 auto V =
reinterpret_cast<cling::Value*
>(
value.GetValAddr());
7682 return compRes!=cling::Interpreter::kSuccess ? 0 : 1 ;
7689 using namespace cling;
7703 if (
value.isValid() &&
value.needsManagedAllocation()) {
7724 auto iSpecObj = iSpecObjMap->second.find(Name);
7725 if (iSpecObj != iSpecObjMap->second.end()) {
7727 return iSpecObj->second;
7734 ASTContext& C = SemaR.getASTContext();
7735 Preprocessor &PP = SemaR.getPreprocessor();
7736 Parser& P =
const_cast<Parser&
>(
fInterpreter->getParser());
7737 Preprocessor::CleanupAndRestoreCacheRAII cleanupRAII(PP);
7738 Parser::ParserCurTokRestoreRAII savedCurToken(P);
7741 Token& Tok =
const_cast<Token&
>(P.getCurToken());
7742 Tok.setKind(tok::semi);
7748 Sema::ContextAndScopeRAII pushedDCAndS(SemaR, C.getTranslationUnitDecl(),
7751 TObject* specObj =
gROOT->FindSpecialObject(Name, LookupCtx);
7754 Error(
"GetObjectAddress",
"Got a special object without LookupCtx!");
7768 clang::CXXRecordDecl* klass)
const
7770 using namespace clang;
7771 ASTContext& Ctx = klass->getASTContext();
7772 FriendDecl::FriendUnion friendUnion(function);
7775 FriendDecl* friendDecl = FriendDecl::Create(Ctx, klass, sl, friendUnion, sl);
7776 klass->pushFriendDecl(friendDecl);
7790 if (func)
return ((
TClingCallFunc*)func)->GetDecl()->getCanonicalDecl();
7861 f->
Exec(address, &val);
7875 const void* args[] ,
8042 f->SetFunc(ci, method, params,
offset);
8051 f->SetFunc(ci, method, params, objectIsConst,
offset);
8089 llvm::SmallVector<clang::QualType, 4> funcProto;
8090 for (std::vector<TypeInfo_t*>::const_iterator iter =
proto.begin(), end =
proto.end();
8091 iter != end; ++iter) {
8092 funcProto.push_back( ((
TClingTypeInfo*)(*iter))->GetQualType() );
8094 f->SetFuncProto(ci, method, funcProto,
offset,
mode);
8104 llvm::SmallVector<clang::QualType, 4> funcProto;
8105 for (std::vector<TypeInfo_t*>::const_iterator iter =
proto.begin(), end =
proto.end();
8106 iter != end; ++iter) {
8107 funcProto.push_back( ((
TClingTypeInfo*)(*iter))->GetQualType() );
8109 f->SetFuncProto(ci, method, funcProto, objectIsConst,
offset,
mode);
8115 std::string wrapper_name;
8116 std::string wrapper;
8136 const clang::DeclContext *ctxt =
nullptr;
8138 ctxt = clang::Decl::castToDeclContext(((
TClingClassInfo*)info)->GetDecl());
8140 ctxt =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
8145 const clang::Decl *decl =
reinterpret_cast<const clang::Decl*
>(declid);
8149 const clang::DeclContext *declDC = decl->getDeclContext();
8152 if (declDC->isTransparentContext()) {
8153 declDC = declDC->getParent();
8156 if (
const auto *declRD = llvm::dyn_cast<clang::RecordDecl>(declDC)) {
8157 if (declRD->isAnonymousStructOrUnion()) {
8158 declDC = declRD->getParent();
8162 if (
const auto *declNS = llvm::dyn_cast<clang::NamespaceDecl>(declDC)) {
8163 if (declNS->isAnonymousNamespace() || declNS->isInlineNamespace()) {
8164 declDC = declNS->getParent();
8171 return declDC->Equals(ctxt);
8282 TClinginfo->
Init(tagnum);
8355 return TClinginfo->
Next();
8403 return TClinginfo->
Size();
8411 return TClinginfo->
Tagnum();
8427 TTHREAD_TLS_DECL(std::string,
output);
8437 return TClinginfo->
Name();
8445 return TClinginfo->
Title();
8482 ClassInfo_t* base)
const
8495 return TClinginfo->
Next();
8503 return TClinginfo->
Next(onlyDirect);
8511 return TClinginfo->
Offset(address, isDerivedObject);
8524 return TClinginfo->
GetBaseOffset(TClinginfoBase, address, isDerivedObject);
8540 return (ClassInfo_t *)TClinginfo->
GetBase();
8548 return TClinginfo->
Tagnum();
8556 TTHREAD_TLS_DECL(std::string,
output);
8566 return TClinginfo->
Name();
8611 const clang::Decl* decl =
reinterpret_cast<const clang::Decl*
>(declid);
8612 const clang::ValueDecl* vd = llvm::dyn_cast_or_null<clang::ValueDecl>(decl);
8645 return TClinginfo->
Next();
8653 return TClinginfo->
Offset();
8701 return TClinginfo->
Name();
8709 return TClinginfo->
Title();
8716 TTHREAD_TLS_DECL(std::string,
result);
8727 Decl* decl =
static_cast<Decl*
>(
const_cast<void*
>(declId));
8728 ASTContext &C = decl->getASTContext();
8729 decl->addAttr(AnnotateAttr::CreateImplicit(C, attribute,
nullptr, 0));
8740 cling::Interpreter &interp,
8743 const clang::TypeDecl* td = llvm::dyn_cast<clang::TypeDecl>(decl->getDeclContext());
8746 clang::QualType qualType(td->getTypeForDecl(),0);
8748 unsigned int level = 0;
8751 else if (
name[
cursor] ==
'<' && level) --level;
8752 else if (level == 0 &&
name[
cursor] ==
':') {
8765 const auto *FD = llvm::dyn_cast<clang::FunctionDecl>(decl);
8766 if (
const auto *USD = llvm::dyn_cast<clang::UsingShadowDecl>(decl)) {
8767 FD = llvm::dyn_cast<clang::FunctionDecl>(USD->getTargetDecl());
8770 Error(
"GetFunctionName",
"NULL Decl!");
8777 if (llvm::isa<clang::CXXConstructorDecl>(FD))
8781 }
else if (llvm::isa<clang::CXXDestructorDecl>(decl))
8786 llvm::raw_string_ostream stream(
output);
8787 auto printPolicy = decl->getASTContext().getPrintingPolicy();
8789 printPolicy.AnonymousTagLocations =
false;
8790 FD->getNameForDiagnostic(stream, printPolicy,
false);
8820 return (FuncTempInfo_t*)
const_cast<void*
>(declid);
8831 return (FuncTempInfo_t*)ft_info;
8842 return t_info !=
nullptr;
8851 if (!ft_info)
return 0;
8852 const clang::FunctionTemplateDecl *ft = (
const clang::FunctionTemplateDecl*)ft_info;
8853 return ft->getTemplateParameters()->size();
8862 if (!ft_info)
return 0;
8863 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
8864 return ft->getTemplateParameters()->getMinRequiredArguments();
8872 if (!ft_info)
return 0;
8877 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
8879 switch (ft->getAccess()) {
8880 case clang::AS_public:
8883 case clang::AS_protected:
8886 case clang::AS_private:
8889 case clang::AS_none:
8890 if (ft->getDeclContext()->isNamespace())
8895 assert(
false &&
"Unexpected value for the access property value in Clang");
8899 const clang::FunctionDecl *fd = ft->getTemplatedDecl();
8900 if (
const clang::CXXMethodDecl *md =
8901 llvm::dyn_cast<clang::CXXMethodDecl>(fd)) {
8902 if (md->getMethodQualifiers().hasConst()) {
8905 if (md->isVirtual()) {
8908 if (md->isPureVirtual()) {
8911 if (
const clang::CXXConstructorDecl *cd =
8912 llvm::dyn_cast<clang::CXXConstructorDecl>(md)) {
8913 if (cd->isExplicit()) {
8917 else if (
const clang::CXXConversionDecl *cd =
8918 llvm::dyn_cast<clang::CXXConversionDecl>(md)) {
8919 if (cd->isExplicit()) {
8933 if (!ft_info)
return 0;
8938 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
8939 const clang::FunctionDecl *fd = ft->getTemplatedDecl();
8941 if (fd->isOverloadedOperator())
8943 if (llvm::isa<clang::CXXConversionDecl>(fd))
8945 if (llvm::isa<clang::CXXConstructorDecl>(fd))
8947 if (llvm::isa<clang::CXXDestructorDecl>(fd))
8949 if (fd->isInlined())
8960 if (!ft_info)
return;
8961 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
8973 if (!ft_info)
return;
8974 const clang::FunctionTemplateDecl *ft = (
const clang::FunctionTemplateDecl*)ft_info;
8978 if (
const RedeclarableTemplateDecl *AnnotFD
8980 if (AnnotateAttr *A = AnnotFD->getAttr<AnnotateAttr>()) {
8981 output = A->getAnnotation().str();
8985 if (!ft->isFromASTFile()) {
9036 const clang::Decl* decl =
reinterpret_cast<const clang::Decl*
>(declid);
9070 return info->
NArg();
9086 return info->
Next();
9113 return (TypeInfo_t*)info->
Type();
9121 TTHREAD_TLS_DECL(
TString, mangled_name);
9124 return mangled_name;
9142 return info->
Name();
9172 return info->
Title();
9180 return MethodInfo_MethodCallReturnType(func->fInfo);
9182 return EReturnType::kOther;
9191 if (info && info->
IsValid()) {
9193 clang::QualType QT( typeinfo->
GetQualType().getCanonicalType() );
9194 if (QT->isEnumeralType()) {
9195 return EReturnType::kLong;
9196 }
else if (QT->isPointerType()) {
9198 QT = llvm::cast<clang::PointerType>(QT)->getPointeeType();
9199 if ( QT->isCharType() ) {
9200 return EReturnType::kString;
9202 return EReturnType::kOther;
9204 }
else if ( QT->isFloatingType() ) {
9205 int sz = typeinfo->
Size();
9206 if (sz == 4 || sz == 8) {
9208 return EReturnType::kDouble;
9210 return EReturnType::kOther;
9212 }
else if ( QT->isIntegerType() ) {
9213 int sz = typeinfo->
Size();
9222 return EReturnType::kLong;
9224 return EReturnType::kOther;
9227 return EReturnType::kOther;
9230 return EReturnType::kOther;
9266 return (MethodArgInfo_t*)
9283 return info->
Next();
9307 return info->
Name();
9331 return (TypeInfo_t*) info->
Type();
9391 return TClinginfo->
Name();
9415 return TClinginfo->
Size();
9473 const char*
name)
const
9493 return TClinginfo->
Next();
9509 return TClinginfo->
Size();
9525 return TClinginfo->
Name();
9533 return TClinginfo->
Title();
9540 clang::QualType QT1 = clang::QualType::getFromOpaquePtr(QualTypePtr1);
9541 clang::QualType QT2 = clang::QualType::getFromOpaquePtr(QualTypePtr2);
9542 return fInterpreter->getCI()->getASTContext().hasSameType(QT1, QT2);
9549 clang::QualType QT = clang::QualType::getFromOpaquePtr(QualTypePtr);
9550 return QT->hasIntegerRepresentation();
9557 clang::QualType QT = clang::QualType::getFromOpaquePtr(QualTypePtr);
9558 return QT->hasSignedIntegerRepresentation();
9565 clang::QualType QT = clang::QualType::getFromOpaquePtr(QualTypePtr);
9566 return QT->hasUnsignedIntegerRepresentation();
9573 clang::QualType QT = clang::QualType::getFromOpaquePtr(QualTypePtr);
9574 return QT->hasFloatingRepresentation();
9581 clang::QualType QT = clang::QualType::getFromOpaquePtr(QualTypePtr);
9582 return QT->hasPointerRepresentation();
9589 clang::QualType QT = clang::QualType::getFromOpaquePtr(QualTypePtr);
9590 return QT->isVoidPointerType();
9597 clang::FunctionDecl *FD = (clang::FunctionDecl *) fdeclid;
9598 return llvm::isa_and_nonnull<clang::CXXMethodDecl>(FD);
9607 Error(
"SnapshotMutexState",
"fRecurseCount != 0 even though initial mutex state is unset!");
9623 Error(
"ForgetMutexState",
"mutex state's recurse count already 0!");
9639 std::unique_ptr<MutexStateAndRecurseCountDelta> uniqueP{typedDelta};
9653 Error(
"ApplyToInterpreterMutex",
9654 "After returning from user code that turned on thread safety support, we notice that fInitialMutex is already used ... "
9655 "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.");
9671 return uniqueP.release();
The file contains utilities which are foundational and could be used across the core component of ROO...
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
unsigned long long ULong64_t
TClass *(* DictFuncPtr_t)()
R__EXTERN TApplication * gApplication
R__EXTERN TClassTable * gClassTable
static bool IsFromRootCling()
static void indent(ostringstream &buf, int indent_level)
The file contains facilities to work with C++ module files extensions used to store rdict files.
void TCling__RestoreInterpreterMutex(void *delta)
Re-apply the lock count delta that TCling__ResetInterpreterMutex() caused.
void TCling__TransactionRollback(const cling::Transaction &T)
static void RegisterPreIncludedHeaders(cling::Interpreter &clingInterp)
static bool hasParsedRootmapForLibrary(llvm::StringRef lib)
void TCling__InvalidateGlobal(const clang::Decl *D)
bool TClingLookupHelper__AutoParse(const char *cname)
Allow calling autoparsing from TMetaUtils.
void * TCling__LockCompilationDuringUserCodeExecution()
Lock the interpreter.
void TCling__UpdateListsOnUnloaded(const cling::Transaction &T)
void TCling__GetNormalizedContext(const ROOT::TMetaUtils::TNormalizedCtxt *&normCtxt)
int TCling__LoadLibrary(const char *library)
Load a library.
void TCling__DEBUG__dump(clang::DeclContext *DC)
ETupleOrdering
Check in what order the member of a tuple are layout.
bool TCling__LibraryLoadingFailed(const std::string &errmessage, const std::string &libStem, bool permanent, bool resolved)
Lookup libraries in LD_LIBRARY_PATH and DYLD_LIBRARY_PATH with mangled_name, which is extracted by er...
static const std::unordered_set< std::string > gIgnoredPCMNames
List of dicts that have the PCM information already in the PCH.
static Bool_t s_IsLibraryLoaded(const char *libname, cling::Interpreter *fInterpreter)
const char * TCling__GetClassSharedLibs(const char *className, bool skipCore)
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.
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)
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[])
static std::string GetClassSharedLibsForModule(const char *cls, cling::LookupHelper &LH, bool skipCore)
void TCling__LibraryLoadedRTTI(const void *dyLibHandle, const char *canonicalName)
static cling::Interpreter::CompilationResult ExecAutoParse(const char *what, Bool_t header, cling::Interpreter *interpreter)
Parse the payload or header.
static bool requiresRootMap(const char *rootmapfile)
clang::NamespaceDecl * TCling__DEBUG__DCtoNamespace(clang::DeclContext *DC)
TObject * TCling__GetObjectAddress(const char *Name, void *&LookupCtx)
static void LoadModules(const std::vector< std::string > &modules, cling::Interpreter &interp)
Loads the C++ modules that we require to run any ROOT program.
int TCling__IsAutoLoadNamespaceCandidate(const clang::NamespaceDecl *nsDecl)
void DestroyInterpreter(TInterpreter *interp)
static bool hasPrecomputedLibraryDeps(llvm::StringRef lib)
void TCling__SplitAclicMode(const char *fileName, string &mode, string &args, string &io, string &fname)
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
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.
Int_t gErrorIgnoreLevel
Error handling routines.
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
void Fatal(const char *location, const char *msgfmt,...)
Use this function in case of a fatal error. It will abort the program.
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void input
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t cursor
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h offset
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h length
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char cname
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
Option_t Option_t TPoint TPoint const char mode
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t property
Option_t Option_t TPoint TPoint const char text
R__EXTERN TVirtualMutex * gInterpreterMutex
#define R__LOCKGUARD_CLING(mutex)
R__EXTERN TInterpreter * gCling
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
Bool_t R_ISREG(Int_t mode)
R__EXTERN TSystem * gSystem
R__EXTERN TVirtualMutex * gGlobalMutex
#define R__LOCKGUARD(mutex)
#define R__WRITE_LOCKGUARD(mutex)
#define R__READ_LOCKGUARD(mutex)
virtual std::unique_ptr< StateDelta > Rewind(const State &earlierState)=0
virtual void Apply(std::unique_ptr< StateDelta > &&delta)=0
virtual std::unique_ptr< State > GetStateBefore()=0
static Longptr_t ExecuteFile(const char *file, Int_t *error=nullptr, Bool_t keep=kFALSE)
Execute a file containing a C++ macro (static method).
virtual TApplicationImp * GetApplicationImp()
virtual Bool_t IsCmdThread()
Each class (see TClass) has a linked list of its base class(es).
TClassRef is used to implement a permanent reference to a TClass object.
static DictFuncPtr_t GetDict(const char *cname)
Given the class name returns the Dictionary() function of a class (uses hash of name).
static TProtoClass * GetProtoNorm(const char *cname)
Given the class normalized name returns the TClassProto object for the class.
static DictFuncPtr_t GetDictNorm(const char *cname)
Given the normalized class name returns the Dictionary() function of a class (uses hash of name).
static TProtoClass * GetProto(const char *cname)
Given the class name returns the TClassProto object for the class.
static Bool_t Check(const char *cname, std::string &normname)
static void Add(const char *cname, Version_t id, const std::type_info &info, DictFuncPtr_t dict, Int_t pragmabits)
Add a class to the class table (this is a static function).
TClass instances represent classes, structs and namespaces in the ROOT type system.
TDataMember * GetDataMember(const char *datamember) const
Return pointer to datamember object with name "datamember".
ROOT::ESTLType GetCollectionType() const
Return the 'type' of the STL the TClass is representing.
EState fState
cached of the streaming method to use
std::atomic< TList * > fBase
static void AddClassToDeclIdMap(TDictionary::DeclId_t id, TClass *cl)
static: Add a TClass* to the map of classes.
TList * GetListOfFunctionTemplates(Bool_t load=kTRUE)
Return TListOfFunctionTemplates for a class.
void * DynamicCast(const TClass *base, void *obj, Bool_t up=kTRUE)
Cast obj of this class type up to baseclass cl if up is true.
static void RemoveClassDeclId(TDictionary::DeclId_t id)
Bool_t CallShowMembers(const void *obj, TMemberInspector &insp, Bool_t isTransient=kFALSE) const
Call ShowMembers() on the obj of this class type, passing insp and parent.
std::atomic< TListOfEnums * > fEnums
static Bool_t HasNoInfoOrEmuOrFwdDeclaredDecl(const char *)
virtual void PostLoadCheck()
Do the initialization that can only be done after the CINT dictionary has been fully populated and ca...
static TClass * LoadClass(const char *requestedname, Bool_t silent)
Helper function used by TClass::GetClass().
Int_t Size() const
Return size of object of this class.
TObjArray * fStreamerInfo
Bool_t IsLoaded() const
Return true if the shared library of this class is currently in the a process's memory.
ClassInfo_t * GetClassInfo() const
TVirtualCollectionProxy * GetCollectionProxy() const
Return the proxy describing the collection (if any).
void ResetCaches()
To clean out all caches.
Long_t Property() const override
Returns the properties of the TClass as a bit field stored as a Long_t value.
static Int_t ReadRules()
Read the class.rules files from the default location:.
Version_t GetClassVersion() const
std::atomic< Bool_t > fHasRootPcmInfo
C++ Property of the class (is abstract, has virtual table, etc.)
const char * GetDeclFileName() const
Return name of the file containing the declaration of this class.
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
Emulation of the CINT BaseClassInfo class.
const char * TmpltName() const
const char * Name() const
ptrdiff_t Offset(void *address=0, bool isDerivedObject=true) const
void FullName(std::string &output, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
TClingClassInfo * GetBase() const
Emulation of the CINT CallFunc class.
void ExecWithReturn(void *address, void *ret=nullptr)
void SetArgs(const char *args)
double ExecDouble(void *address)
void SetArgArray(Longptr_t *argArr, int narg)
Longptr_t ExecInt(void *address)
TInterpreter::CallFuncIFacePtr_t IFacePtr()
void SetFunc(const TClingClassInfo *info, const char *method, const char *arglist, Longptr_t *poffset)
void ExecWithArgsAndReturn(void *address, const void *args[]=0, int nargs=0, void *ret=0)
void Exec(void *address, TInterpreterValue *interpVal=0)
TClingMethodInfo * FactoryMethod() const
int get_wrapper_code(std::string &wrapper_name, std::string &wrapper)
void IgnoreExtraArgs(bool ignore)
long long ExecInt64(void *address)
bool IsAutoLoadingEnabled() const
void SetAutoParsingSuspended(bool val=true)
void SetAutoLoadingEnabled(bool val=true)
Emulation of the CINT ClassInfo class.
static bool IsEnum(cling::Interpreter *interp, const char *name)
long ClassProperty() const
void Init(const char *name)
void FullName(std::string &output, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
EDataType GetUnderlyingType() const
const char * TmpltName() const
const clang::Type * GetType() const
ptrdiff_t GetBaseOffset(TClingClassInfo *toBase, void *address, bool isDerivedObject)
bool IsScopedEnum() const
ROOT::TMetaUtils::EIOCtorCategory HasDefaultConstructor(bool checkio=false, std::string *type_name=nullptr) const
TClingMethodInfo GetMethodWithArgs(const char *fname, const char *arglist, Longptr_t *poffset, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch, EInheritanceMode imode=kWithInheritance) const
const clang::FunctionTemplateDecl * GetFunctionTemplate(const char *fname) const
int GetMethodNArg(const char *method, const char *proto, Bool_t objectIsConst, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch) const
bool IsValidMethod(const char *method, const char *proto, Bool_t objectIsConst, Longptr_t *offset, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch) const
bool HasMethod(const char *name) const
TDictionary::DeclId_t GetDeclId() const
void DeleteArray(void *arena, bool dtorOnly, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
void * New(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
TClingMethodInfo GetMethod(const char *fname) const
const clang::ValueDecl * GetDataMember(const char *name) const
void Destruct(void *arena, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
std::vector< std::string > GetUsingNamespaces()
bool IsBase(const char *name) const
void Delete(void *arena, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
Emulation of the CINT DataMemberInfo class.
const char * TypeName() const
const char * TypeTrueName(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
int MaxIndex(int dim) const
llvm::StringRef ValidArrayIndex() const
const char * Name() const override
long TypeProperty() const
virtual const char * Name() const
virtual bool IsValid() const
virtual const clang::Decl * GetDecl() const
Uses clang::TextDiagnosticPrinter to format diagnostics, which are then passed to a user-specified fu...
Emulation of the CINT MethodInfo class.
bool IsValid() const override
const char * DefaultValue() const
const TClingTypeInfo * Type() const
const char * TypeName() const
Emulation of the CINT MethodInfo class.
std::string GetMangledName() const
const char * TypeName() const
const char * Name() const override
const clang::FunctionDecl * GetTargetFunctionDecl() const
Get the FunctionDecl, or if this represents a UsingShadowDecl, the underlying target FunctionDecl.
const char * GetPrototype()
long ExtraProperty() const
void * InterfaceMethod() const
void CreateSignature(TString &signature) const
TDictionary::DeclId_t GetDeclId() const
TClingTypeInfo * Type() const
Emulation of the CINT TypeInfo class.
std::string NormalizedName(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
Return the normalized name of the type (i.e.
const char * Name() const override
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.
This class defines an interface to the cling C++ interpreter.
static Int_t DeepAutoLoadImpl(const char *cls, std::unordered_set< std::string > &visited, bool nameIsNormalized)
const char * MethodArgInfo_DefaultValue(MethodArgInfo_t *marginfo) const final
bool ClassInfo_IsScopedEnum(ClassInfo_t *info) const final
const char * TypeInfo_Name(TypeInfo_t *) const final
void * MethodInfo_InterfaceMethod(MethodInfo_t *minfo) const final
void LoadEnums(TListOfEnums &cl) const final
Create list of pointers to enums for TClass cl.
void UpdateListOfGlobals() final
No op: see TClingCallbacks (used to update the list of globals)
bool TypedefInfo_IsValid(TypedefInfo_t *tinfo) const final
Int_t AutoLoad(const char *classname, Bool_t knowDictNotLoaded=kFALSE) final
Load library containing the specified class.
void CallFunc_Init(CallFunc_t *func) const final
void SetGetline(const char *(*getlineFunc)(const char *prompt), void(*histaddFunc)(const char *line)) final
Set a getline function to call when input is needed.
bool LibraryLoadingFailed(const std::string &, const std::string &, bool, bool)
void GenericError(const char *error) const final
Let the interpreter issue a generic error, and set its error state.
std::vector< void * > fRegisterModuleDyLibs
void CallFunc_ExecWithReturn(CallFunc_t *func, void *address, void *ret) const final
TypeInfo_t * MethodInfo_Type(MethodInfo_t *minfo) const final
std::vector< std::string > fAutoLoadLibStorage
void CallFunc_Delete(CallFunc_t *func) const final
int LoadFile(const char *path) const final
Load a source file or library called path into the interpreter.
void ResetAll() final
Reset the Cling state to its initial state.
void SetDeclAttr(DeclId_t, const char *) final
void HandleNewDecl(const void *DV, bool isDeserialized, std::set< TClass * > &modifiedClasses)
void InvalidateCachedDecl(const std::tuple< TListOfDataMembers *, TListOfFunctions *, TListOfFunctionTemplates *, TListOfEnums * > &Lists, const clang::Decl *D)
Invalidate cached TCling information for the given declaration, and removed it from the appropriate o...
Long_t MethodInfo_Property(MethodInfo_t *minfo) const final
virtual void LoadFunctionTemplates(TClass *cl) const final
Create list of pointers to function templates for TClass cl.
bool ClassInfo_IsValidMethod(ClassInfo_t *info, const char *method, const char *proto, Longptr_t *offset, ROOT::EFunctionMatchMode=ROOT::kConversionMatch) const final
Long_t DataMemberInfo_Property(DataMemberInfo_t *dminfo) const final
int SetClassAutoparsing(int) final
Enable/Disable the Autoparsing of headers.
std::vector< const char * > fCurExecutingMacros
void CreateListOfDataMembers(TClass *cl) const final
Create list of pointers to data members for TClass cl.
void RewindDictionary() final
Rewind Cling dictionary to the point where it was before executing the current macro.
bool ClassInfo_IsValid(ClassInfo_t *info) const final
void UpdateListsOnCommitted(const cling::Transaction &T)
int TypeInfo_RefType(TypeInfo_t *) const final
void CreateListOfBaseClasses(TClass *cl) const final
Create list of pointers to base class(es) for TClass cl.
ClassInfo_t * ClassInfo_Factory(Bool_t all=kTRUE) const final
const char * MethodInfo_Name(MethodInfo_t *minfo) const final
BaseClassInfo_t * BaseClassInfo_Factory(ClassInfo_t *info) const final
Bool_t LoadText(const char *text) const final
Load the declarations from text into the interpreter.
const char * GetSharedLibDeps(const char *lib, bool tryDyld=false) final
Get the list a libraries on which the specified lib depends.
EReturnType MethodInfo_MethodCallReturnType(MethodInfo_t *minfo) const final
TObject * GetObjectAddress(const char *Name, void *&LookupCtx)
If the interpreter encounters Name, check whether that is an object ROOT could retrieve.
Longptr_t ProcessLineAsynch(const char *line, EErrorCode *error=nullptr)
Let cling process a command line asynch.
bool MethodInfo_IsValid(MethodInfo_t *minfo) const final
FuncTempInfo_t * FuncTempInfo_Factory(DeclId_t declid) const final
Construct a FuncTempInfo_t.
TypeInfo_t * TypeInfo_Factory() const final
bool IsClassAutoLoadingEnabled() const
Returns if class AutoLoading is currently enabled.
void InvalidateGlobal(const clang::Decl *D)
Invalidate cached TCling information for the given global declaration.
int Evaluate(const char *, TInterpreterValue &) final
Get the interpreter value corresponding to the statement.
std::unique_ptr< TInterpreterValue > MakeInterpreterValue() const final
void UpdateListOfLoadedSharedLibraries()
const char * TypedefInfo_Title(TypedefInfo_t *tinfo) const final
void CallFunc_SetFuncProto(CallFunc_t *func, ClassInfo_t *info, const char *method, const char *proto, Longptr_t *Offset, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch) const final
Interface to cling function.
void InitRootmapFile(const char *name)
Create a resource table and read the (possibly) three resource files, i.e.
Int_t AutoParse(const char *cls) final
Parse the headers relative to the class Returns 1 in case of success, 0 in case of failure.
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.
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.
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.
const char * GetClassSharedLibs(const char *cls, bool skipCore=true) final
Get the list of shared libraries containing the code for class cls.
Longptr_t DataMemberInfo_Offset(DataMemberInfo_t *dminfo) const final
CallFunc_t * CallFunc_Factory() const final
MethodInfo_t * MethodInfo_Factory() const final
Long_t DataMemberInfo_TypeProperty(DataMemberInfo_t *dminfo) const final
void ClearFileBusy() final
Reset the interpreter internal state in case a previous action was not correctly terminated.
cling::MetaProcessor * GetMetaProcessorImpl() const
bool DiagnoseIfInterpreterException(const std::exception &e) const final
void SetAllocunlockfunc(void(*)()) const final
[Place holder for Mutex Unlock] Provide the interpreter with a way to release a lock used to protect ...
std::set< size_t > fLookedUpClasses
virtual void AddAvailableIndentifiers(TSeqCollection &Idents) final
void TypedefInfo_Delete(TypedefInfo_t *tinfo) const final
void Reset() final
Pressing Ctrl+C should forward here.
const char * TypedefInfo_TrueName(TypedefInfo_t *tinfo) const final
int SetClassAutoLoading(int) const final
Enable/Disable the AutoLoading of libraries.
const char * ClassInfo_FullName(ClassInfo_t *info) const final
UInt_t AutoParseImplRecurse(const char *cls, bool topLevel)
Helper routine for TCling::AutoParse implementing the actual call to the parser and looping over temp...
const char * MethodInfo_TypeName(MethodInfo_t *minfo) const final
void CallFunc_SetArg(CallFunc_t *func, Long_t param) const final
const char * GetIncludePath() final
Refresh the list of include paths known to the interpreter and return it with -I prepended.
void UpdateListsOnUnloaded(const cling::Transaction &T)
Invalidate stored TCling state for declarations included in transaction ‘T’.
void UpdateClassInfoWithDecl(const clang::NamedDecl *ND)
Internal function. Inform a TClass about its new TagDecl or NamespaceDecl.
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 Int_t GetEntries() const
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
virtual void Add(TObject *obj)=0
TObject * FindObject(const char *name) const override
Find an object in this collection using its name.
Bool_t Contains(const char *name) const
All ROOT classes may have RTTI (run time type identification) support added.
Bool_t IsPersistent() const
Basic data type descriptor (datatype information is obtained from CINT).
EMemberSelection
Kinds of members to include in lists.
TList * GetListOfKeys() const override
TDirectory::TContext keeps track and restore the current directory.
void GetObject(const char *namecycle, T *&ptr)
Get an object with proper type checking.
The TEnumConstant class implements the constants of the enum type.
The TEnum class implements the enum type.
const TSeqCollection * GetConstants() const
static TEnum * GetEnum(const std::type_info &ti, ESearchAction sa=kALoadAndInterpLookup)
DeclId_t GetDeclId() const
const char * GetValue() const
The TEnv class reads config files, by default named .rootrc.
THashList * GetTable() const
Bool_t IgnoreDuplicates(Bool_t ignore)
If set to true, no warnings in case of duplicates are issued.
virtual void SetRcName(const char *name)
virtual Int_t ReadFile(const char *fname, EEnvLevel level)
Read and parse the resource file for a certain level.
virtual void SetValue(const char *name, const char *value, EEnvLevel level=kEnvChange, const char *type=nullptr)
Set the value of a resource or create a new resource.
virtual TEnvRec * Lookup(const char *n) const
Loop over all resource records and return the one with name.
A ROOT file is an on-disk file, usually with extension .root, that stores objects in a file-system-li...
Global functions class (global functions are obtained from CINT).
Global variables class (global variables are obtained from CINT).
THashList implements a hybrid collection class consisting of a hash table and a list to store TObject...
TObject * Remove(TObject *obj) override
Remove object from the list.
THashTable implements a hash table to store TObject's.
This class defines an abstract interface to a generic command line interpreter.
virtual bool RegisterPrebuiltModulePath(const std::string &FullPath, const std::string &ModuleMapName="module.modulemap") const =0
virtual Bool_t HasPCMForLibrary(const char *libname) const =0
virtual Int_t AutoParse(const char *cls)=0
int(* AutoLoadCallBack_t)(const char *)
virtual Bool_t Declare(const char *code)=0
virtual const char * GetClassSharedLibs(const char *cls, bool skipCore=true)=0
std::vector< std::pair< std::string, int > > FwdDeclArgsToKeepCollection_t
TDictionary::DeclId_t DeclId_t
virtual TObjArray * GetRootMapFiles() const =0
Book space in a file, create I/O buffers, to fill them, (un)compress them.
A collection of TDataMember objects designed for fast access given a DeclId_t and for keep track of T...
TObject * FindObject(const char *name) const override
Specialize FindObject to do search for the a data member just by name or create it if its not already...
TDictionary * Find(DeclId_t id) const
Return (after creating it if necessary) the TDataMember describing the data member corresponding to t...
TClass * GetClass() const
A collection of TEnum objects designed for fast access given a DeclId_t and for keep track of TEnum t...
A collection of TEnum objects designed for fast access given a DeclId_t and for keep track of TEnum t...
TEnum * Find(DeclId_t id) const
Return the TEnum corresponding to the Decl 'id' or NULL if it does not exist.
TEnum * Get(DeclId_t id, const char *name)
Return (after creating it if necessary) the TEnum describing the enum corresponding to the Decl 'id'.
TClass * GetClass() const
A collection of TFunction objects designed for fast access given a DeclId_t and for keep track of TFu...
TFunctionTemplate * Get(DeclId_t id)
Return (after creating it if necessary) the TMethod or TFunction describing the function correspondin...
A collection of TFunction objects designed for fast access given a DeclId_t and for keep track of TFu...
TFunction * Find(DeclId_t id) const
Return the TMethod or TFunction describing the function corresponding to the Decl 'id'.
void Add(TObject *obj) override
TObject * At(Int_t idx) const override
Returns the object at position idx. Returns 0 if idx is out of range.
A TMemFile is like a normal TFile except that it reads and writes only from memory.
Abstract base class for accessing the data-members of a class.
const char * GetParent() const
virtual void Inspect(TClass *cl, const char *parent, const char *name, const void *addr)
EObjectPointerState GetObjectValidity() const
virtual Bool_t IsTreatingNonAccessibleTypes()
void SetObjectValidity(EObjectPointerState val)
void InspectMember(const T &obj, const char *name, Bool_t isTransient)
Each ROOT method (see TMethod) has a linked list of its arguments.
const char * GetFullTypeName() const
Get full type description of method argument, e.g.: "class TDirectory*".
const char * GetDefault() const
Get default value of method argument.
Each ROOT class (see TClass) has a linked list of methods.
virtual TList * GetListOfMethodArgs()
Returns methodarg list and additionally updates fDataMember in TMethod by calling FindDataMember();.
The TNamed class is the base class for all named ROOT classes.
const char * GetName() const override
Returns name of object.
Int_t GetEntriesFast() const
virtual void Expand(Int_t newSize)
Expand or shrink the array to newSize elements.
void Clear(Option_t *option="") override
Remove all objects from the array.
virtual void Compress()
Remove empty slots from array.
Int_t GetEntries() const override
Return the number of objects in array (i.e.
TObject * At(Int_t idx) const override
TObject * Remove(TObject *obj) override
Remove object from array.
TObject * FindObject(const char *name) const override
Find an object in this collection using its name.
void Add(TObject *obj) override
Collectable string class.
Mother of all ROOT objects.
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
R__ALWAYS_INLINE Bool_t IsOnHeap() const
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual TObject * FindObject(const char *name) const
Must be redefined in derived classes.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message.
virtual const char * GetTitle() const
Returns title of object.
virtual TClass * IsA() const
@ kInvalidObject
if object ctor succeeded but object should not be used
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
Persistent version of a TClass.
static const TString & GetIncludeDir()
Get the include directory in the installation. Static utility function.
static const char * GetMacroPath()
Get macro search path. Static utility function.
static const std::vector< std::string > & AddExtraInterpreterArgs(const std::vector< std::string > &args)
Provide command line arguments to the interpreter construction.
static const TString & GetEtcDir()
Get the sysconfig directory in the installation. Static utility function.
static const char **& GetExtraInterpreterArgs()
INTERNAL function! Used by rootcling to inject interpreter arguments through a C-interface layer.
static const TString & 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
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
virtual void FreeDirectory(void *dirp)
Free a directory.
virtual void * OpenDirectory(const char *name)
Open a directory. Returns 0 if directory does not exist.
virtual const char * Getenv(const char *env)
Get environment variable.
virtual const char * GetIncludePath()
Get the list of include path.
virtual TString SplitAclicMode(const char *filename, TString &mode, TString &args, TString &io) const
This method split a filename of the form:
virtual char * ConcatFileName(const char *dir, const char *name)
Concatenate a directory and a file name. User must delete returned string.
virtual const char * FindFile(const char *search, TString &file, EAccessMode mode=kFileExists)
Find location of file in a search path.
virtual int Load(const char *module, const char *entry="", Bool_t system=kFALSE)
Load a shared library.
int GetPathInfo(const char *path, Long_t *id, Long_t *size, Long_t *flags, Long_t *modtime)
Get info about a file: id, size, flags, modification time.
virtual const char * PrependPathName(const char *dir, TString &name)
Concatenate a directory and a file name.
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
virtual const char * GetDirEntry(void *dirp)
Get a directory entry. Returns 0 if no more entries.
virtual int GetProcInfo(ProcInfo_t *info) const
Returns cpu and memory used by this process into the ProcInfo_t structure.
virtual const char * BaseName(const char *pathname)
Base name of a file name. Base name of /user/root is root.
virtual const char * GetDynamicPath()
Return the dynamic path (used to find shared libraries).
virtual const char * FindDynamicLibrary(TString &lib, Bool_t quiet=kFALSE)
Find a dynamic library using the system search paths.
virtual void Sleep(UInt_t milliSec)
Sleep milliSec milli seconds.
virtual int CompileMacro(const char *filename, Option_t *opt="", const char *library_name="", const char *build_dir="", UInt_t dirmode=0)
This method compiles and loads a shared library containing the code from the file "filename".
virtual const char * WorkingDirectory()
Return working directory.
virtual char * Which(const char *search, const char *file, EAccessMode mode=kFileExists)
Find location of file in a search path.
virtual void Setenv(const char *name, const char *value)
Set environment variable.
virtual const char * HomeDirectory(const char *userName=nullptr)
Return the user's home directory.
virtual TString GetDirName(const char *pathname)
Return the directory name in pathname.
virtual void StackTrace()
Print a stack trace.
char * DynamicPathName(const char *lib, Bool_t quiet=kFALSE)
Find a dynamic library called lib using the system search paths.
virtual TVirtualMutex * Factory(Bool_t=kFALSE)=0
TVirtualPad is an abstract base class for the Pad and Canvas classes.
static void SetFactory(TVirtualStreamerInfo *factory)
static function: Set the StreamerInfo factory
@ kNeedObjectForVirtualBaseClass
const std::string & GetPathSeparator()
const char & GetEnvPathSeparator()
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.
bool IsUniquePtr(std::string_view name)
EComplexType GetComplexType(const char *)
RAII used to store Parser, Sema, Preprocessor state for recursive parsing.
std::vector< std::string > fElements
void ShortType(std::string &answer, int mode)
Return the absolute type of typeDesc into the string answ.
std::unique_ptr< ROOT::TVirtualRWMutex::State > fState
State of gCoreMutex when the first interpreter-related function was invoked.
Int_t fRecurseCount
Interpreter-related functions will push the "entry" lock state to *this.
A read-only memory range which we do not control.