63#include "RConfigure.h"
64#include "compiledata.h"
83#include "clang/AST/ASTContext.h"
84#include "clang/AST/Decl.h"
85#include "clang/AST/DeclarationName.h"
86#include "clang/AST/GlobalDecl.h"
87#include "clang/AST/RecordLayout.h"
88#include "clang/AST/DeclVisitor.h"
89#include "clang/AST/RecursiveASTVisitor.h"
90#include "clang/AST/Type.h"
91#include "clang/Basic/SourceLocation.h"
92#include "clang/Basic/Specifiers.h"
93#include "clang/Basic/TargetInfo.h"
94#include "clang/CodeGen/ModuleBuilder.h"
95#include "clang/Frontend/CompilerInstance.h"
96#include "clang/Frontend/FrontendDiagnostic.h"
97#include "clang/Lex/HeaderSearch.h"
98#include "clang/Lex/Preprocessor.h"
99#include "clang/Lex/PreprocessorOptions.h"
100#include "clang/Parse/Parser.h"
101#include "clang/Sema/Lookup.h"
102#include "clang/Sema/Sema.h"
103#include "clang/Serialization/ASTReader.h"
104#include "clang/Serialization/GlobalModuleIndex.h"
106#include "cling/Interpreter/ClangInternalState.h"
107#include "cling/Interpreter/DynamicLibraryManager.h"
108#include "cling/Interpreter/Interpreter.h"
109#include "cling/Interpreter/LookupHelper.h"
110#include "cling/Interpreter/Value.h"
111#include "cling/Interpreter/Transaction.h"
112#include "cling/MetaProcessor/MetaProcessor.h"
113#include "cling/Utils/AST.h"
114#include "cling/Utils/ParserStateRAII.h"
115#include "cling/Utils/SourceNormalization.h"
116#include "cling/Interpreter/Exception.h"
118#include "llvm/IR/GlobalValue.h"
119#include "llvm/IR/Module.h"
121#include "llvm/Support/DynamicLibrary.h"
122#include "llvm/Support/raw_ostream.h"
123#include "llvm/Support/Path.h"
124#include "llvm/Support/Process.h"
125#include "llvm/Object/ELFObjectFile.h"
126#include "llvm/Object/ObjectFile.h"
127#include "llvm/Object/SymbolicFile.h"
128#include "llvm/Support/FileSystem.h"
142#include <unordered_map>
143#include <unordered_set>
150#define R__DLLEXPORT __attribute__ ((visibility ("default")))
158#include <mach-o/dyld.h>
159#include <mach-o/loader.h>
166#if defined(R__LINUX) || defined(R__FBSD)
173#if defined(__CYGWIN__)
174#include <sys/cygwin.h>
175#define HMODULE void *
177 __declspec(dllimport)
void * __stdcall GetCurrentProcess();
178 __declspec(dllimport)
bool __stdcall EnumProcessModules(
void *,
void **,
unsigned long,
unsigned long *);
179 __declspec(dllimport)
unsigned long __stdcall GetModuleFileNameExW(
void *,
void *,
wchar_t *,
unsigned long);
186# define STDIN_FILENO 0
189# define STDOUT_FILENO 1
192# define STDERR_FILENO 2
201#undef GetModuleFileName
202#define RTLD_DEFAULT ((void *)::GetModuleHandle(NULL))
203#define dlsym(library, function_name) ::GetProcAddress((HMODULE)library, function_name)
204#define dlopen(library_name, flags) ::LoadLibraryA(library_name)
205#define dlclose(library) ::FreeLibrary((HMODULE)library)
206#define R__DLLEXPORT __declspec(dllexport)
214 return D->getDeclContext();
217 return llvm::dyn_cast<clang::NamespaceDecl>(DC);
220 return llvm::dyn_cast<clang::RecordDecl>(DC);
223 return DC->dumpDeclContext();
232 return ((clang::Decl*)D)->dump();
235 if (clang::NamedDecl* ND = llvm::dyn_cast<clang::NamedDecl>(D)) {
238 llvm::raw_string_ostream OS(
name);
239 ND->getNameForDiagnostic(OS, D->getASTContext().getPrintingPolicy(),
242 printf(
"%s\n",
name.c_str());
250 return D->isInvalidDecl();
254 assert(info && info->
IsValid());
255 return info->
GetDecl()->isInvalidDecl();
259using namespace clang;
263 static const std::string gInterpreterClassDef = R
"ICF(
265#define ClassDef(name, id) \
266_ClassDefInterp_(name,id,virtual,) \
267static int DeclFileLine() { return __LINE__; }
269#define ClassDefNV(name, id) \
270_ClassDefInterp_(name,id,,) \
271static int DeclFileLine() { return __LINE__; }
272#undef ClassDefOverride
273#define ClassDefOverride(name, id) \
274_ClassDefInterp_(name,id,,override) \
275static int DeclFileLine() { return __LINE__; }
278 static const std::string gNonInterpreterClassDef = R
"ICF(
279#define __ROOTCLING__ 1
281#define ClassDef(name,id) \
282_ClassDefOutline_(name,id,virtual,) \
283static int DeclFileLine() { return __LINE__; }
285#define ClassDefNV(name, id)\
286_ClassDefOutline_(name,id,,)\
287static int DeclFileLine() { return __LINE__; }
288#undef ClassDefOverride
289#define ClassDefOverride(name, id)\
290_ClassDefOutline_(name,id,,override)\
291static int DeclFileLine() { return __LINE__; }
295 static const std::string gClassDefInterpMacro = R
"ICF(
298#define _ClassDefInterp_(name,id,virtual_keyword, overrd) \
301 static TClass *Class() { static TClass* sIsA = 0; if (!sIsA) sIsA = TClass::GetClass(#name); return sIsA; } \
302 static const char *Class_Name() { return #name; } \
303 virtual_keyword Bool_t CheckTObjectHashConsistency() const overrd { return true; } \
304 static Version_t Class_Version() { return id; } \
305 static TClass *Dictionary() { return 0; } \
306 virtual_keyword TClass *IsA() const overrd { return name::Class(); } \
307 virtual_keyword void ShowMembers(TMemberInspector&insp) const overrd { ::ROOT::Class_ShowMembers(name::Class(), this, insp); } \
308 virtual_keyword void Streamer(TBuffer&) overrd { ::Error("Streamer", "Cannot stream interpreted class."); } \
309 void StreamerNVirtual(TBuffer&ClassDef_StreamerNVirtual_b) { name::Streamer(ClassDef_StreamerNVirtual_b); } \
310 static const char *DeclFileName() { return __FILE__; } \
311 static int ImplFileLine() { return 0; } \
312 static const char *ImplFileName() { return __FILE__; }
351 return ((
TCling*)
gCling)->LibraryLoadingFailed(errmessage, libStem, permanent, resolved);
390 static vector<const NamedDecl*> updateList;
393 if (entered) topLevel =
kFALSE;
408 updateList.push_back(TD);
411 while (!updateList.empty()) {
413 updateList.pop_back();
420 const clang::Decl* D =
static_cast<const clang::Decl*
>(enumObj->
GetDeclId());
421 if(
const clang::EnumDecl* ED = dyn_cast<clang::EnumDecl>(D)) {
423 for (EnumDecl::enumerator_iterator EDI = ED->enumerator_begin(),
424 EDE = ED->enumerator_end(); EDI != EDE; ++EDI) {
426 std::string constbuf;
427 if (
const NamedDecl* END = llvm::dyn_cast<NamedDecl>(*EDI)) {
428 PrintingPolicy Policy((*EDI)->getASTContext().getPrintingPolicy());
429 llvm::raw_string_ostream stream(constbuf);
431 Policy.AnonymousTagLocations =
false;
432 (END)->getNameForDiagnostic(stream, Policy,
false);
434 const char* constantName = constbuf.c_str();
438 const llvm::APSInt valAPSInt = (*EDI)->getInitVal();
439 if (valAPSInt.isSigned()) {
440 value = valAPSInt.getSExtValue();
442 value = valAPSInt.getZExtValue();
449 DataMemberInfo_t* dmInfo = (DataMemberInfo_t*) tcDmInfo;
460 globals->
Add(enumConstant);
472 TEnum* enumType =
nullptr;
473 const clang::Decl* D =
static_cast<const clang::Decl*
>(VD);
475 if (
const EnumDecl* ED = llvm::dyn_cast<EnumDecl>(D)) {
477 PrintingPolicy Policy(ED->getASTContext().getPrintingPolicy());
478 llvm::raw_string_ostream stream(buf);
480 Policy.AnonymousTagLocations =
false;
481 ED->getNameForDiagnostic(stream, Policy,
false);
487 const char*
name = buf.c_str();
498 const clang::Decl* D =
static_cast<const clang::Decl*
>(DV);
500 if (!D->isCanonicalDecl() && !isa<clang::NamespaceDecl>(D)
501 && !dyn_cast<clang::RecordDecl>(D))
return;
503 if (isa<clang::FunctionDecl>(D->getDeclContext())
504 || isa<clang::TagDecl>(D->getDeclContext()))
508 if (
const clang::CXXRecordDecl* RD = dyn_cast<clang::CXXRecordDecl>(D)) {
509 if (RD->getDescribedClassTemplate())
511 }
else if (
const clang::FunctionDecl* FD = dyn_cast<clang::FunctionDecl>(D)) {
512 if (FD->getDescribedFunctionTemplate())
516 if (
const RecordDecl *TD = dyn_cast<RecordDecl>(D)) {
517 if (TD->isCanonicalDecl() || TD->isThisDeclarationADefinition())
520 else if (
const NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
522 if (
const TagDecl *TD = dyn_cast<TagDecl>(D)) {
526 }
else if (
const NamespaceDecl* NSD = dyn_cast<NamespaceDecl>(D)) {
531 if (!isa<TranslationUnitDecl>(ND->getDeclContext()))
535 if (isa<EnumDecl>(ND))
540 if (!(isa<VarDecl>(ND)))
544 if (
gROOT->GetListOfGlobals()->FindObject(ND->getNameAsString().c_str()))
548 gROOT->GetListOfGlobals()->Add(
new TGlobal((DataMemberInfo_t *)
550 cast<ValueDecl>(ND),
nullptr)));
582 const char* canonicalName) {
583 ((
TCling*)
gCling)->LibraryLoaded(dyLibHandle, canonicalName);
588 ((
TCling *)
gCling)->RegisterRdictForLoadPCM(pcmFileNameFullPath, pcmContent);
592 const char* canonicalName) {
593 ((
TCling*)
gCling)->LibraryUnloaded(dyLibHandle, canonicalName);
599 return ((
TCling*)
gCling)->GetObjectAddress(Name, LookupCtx);
609 auto tcling =
new TCling(
"C++",
"cling C++ Interpreter", argv, interpLibHandle);
633 return ((
TCling*)
gCling)->GetClassSharedLibs(className);
639 return ((
TCling*)
gCling)->IsAutoLoadNamespaceCandidate(nsDecl);
644 string file(fileName);
650 string &args,
string &io,
string &fname)
652 string file(fileName);
653 TString f, amode, arguments, aclicio;
656 io = aclicio.
Data(); fname =
f.Data();
666 char *__unDName(
char *demangled,
const char *mangled,
int out_len,
667 void * (* pAlloc )(
size_t),
void (* pFree )(
void *),
668 unsigned short int flags);
680 using namespace clang;
681 if (NamespaceDecl* nsd = llvm::dyn_cast<NamespaceDecl>(decl)){
685 if (ClassTemplateDecl* ctd = llvm::dyn_cast<ClassTemplateDecl>(decl)){
698 const std::vector<std::string> &headers,
699 const std::vector<std::string> &fwdDecls,
700 const std::vector<std::string> &unknown)
706 if (classes.empty()) {
710 const std::string& className = classes[0];
712 TString fileName =
"AutoDict_";
713 std::string::const_iterator sIt;
714 for (sIt = className.begin(); sIt != className.end(); ++sIt) {
715 if (*sIt ==
'<' || *sIt ==
'>' ||
716 *sIt ==
' ' || *sIt ==
'*' ||
717 *sIt ==
',' || *sIt ==
'&' ||
725 if (classes.size() > 1) {
727 std::vector<std::string>::const_iterator it = classes.begin();
728 while ((++it) != classes.end()) {
730 chk = chk * 3 + it->at(
cursor);
743 static const std::set<std::string> sSTLTypes {
744 "vector",
"list",
"forward_list",
"deque",
"map",
"unordered_map",
"multimap",
745 "unordered_multimap",
"set",
"unordered_set",
"multiset",
"unordered_multiset",
746 "queue",
"priority_queue",
"stack",
"iterator"};
747 std::vector<std::string>::const_iterator it;
748 std::string fileContent(
"");
749 for (it = headers.begin(); it != headers.end(); ++it) {
750 fileContent +=
"#include \"" + *it +
"\"\n";
752 for (it = unknown.begin(); it != unknown.end(); ++it) {
758 while (dirbase.
Length() && dirbase !=
"."
759 && dirbase !=
"include" && dirbase !=
"inc"
760 && dirbase !=
"prec_stl") {
764 fileContent +=
TString(
"#include \"") + header +
"\"\n";
767 for (it = fwdDecls.begin(); it != fwdDecls.end(); ++it) {
768 fileContent +=
"class " + *it +
";\n";
770 fileContent +=
"#ifdef __CLING__ \n";
771 fileContent +=
"#pragma link C++ nestedclasses;\n";
772 fileContent +=
"#pragma link C++ nestedtypedefs;\n";
773 for (it = classes.begin(); it != classes.end(); ++it) {
775 size_t posTemplate =
n.find(
'<');
776 std::set<std::string>::const_iterator iSTLType = sSTLTypes.end();
777 if (posTemplate != std::string::npos) {
778 n.erase(posTemplate, std::string::npos);
779 if (
n.compare(0, 5,
"std::") == 0) {
782 iSTLType = sSTLTypes.find(
n);
784 fileContent +=
"#pragma link C++ class ";
785 fileContent += *it +
"+;\n" ;
786 fileContent +=
"#pragma link C++ class ";
787 if (iSTLType != sSTLTypes.end()) {
791 fileContent += *it +
"::*;\n" ;
796 fileContent += *it +
"::*+;\n" ;
799 fileContent +=
"#endif\n";
803 filePointer = fopen(fileName,
"w");
804 if (filePointer ==
nullptr) {
810 fprintf(filePointer,
"%s", fileContent.c_str());
826 const std::vector<std::string> &headers,
827 const std::vector<std::string> &fwdDecls,
828 const std::vector<std::string> &unknown)
834 std::vector<std::string> classes;
835 classes.push_back(className);
863 void exceptionErrorHandler(
void * ,
864 const std::string& reason,
866 throw std::runtime_error(std::string(
">>> Interpreter compilation error:\n") + reason);
880 class clangDiagSuppr {
882 clangDiagSuppr(clang::DiagnosticsEngine& diag): fDiagEngine(diag){
883 fOldDiagValue = fDiagEngine.getIgnoreAllWarnings();
884 fDiagEngine.setIgnoreAllWarnings(
true);
888 fDiagEngine.setIgnoreAllWarnings(fOldDiagValue);
891 clang::DiagnosticsEngine& fDiagEngine;
914 if (strncmp(tname.c_str(),
"const ", 6) == 0) {
917 unsigned long end = tname.length();
918 while( end && (tname[end-1]==
'&' || tname[end-1]==
'*' || tname[end-1]==
']') ) {
919 if ( tname[end-1]==
']' ) {
921 while ( end && tname[end-1]!=
'[' ) --end;
925 std::string innerbuf;
927 if (end != tname.length()) {
929 inner = innerbuf.c_str();
931 inner = tname.c_str()+
offset;
935 if (
gROOT->GetListOfClasses()->FindObject(inner)
945 const char *newname =
type->GetFullTypeName();
947 newname =
"Long64_t";
949 newname =
"ULong64_t";
951 if (strcmp(inner,newname) == 0) {
956 if ( end != tname.length() ) {
957 result += tname.substr(end,tname.length()-end);
965 if (lastPos != inner)
969 const auto enName = lastPos;
970 const auto scopeNameSize = ((
Long64_t)lastPos - (
Long64_t)inner) /
sizeof(
decltype(*lastPos)) - 2;
971 char *scopeName =
new char[scopeNameSize + 1];
972 strncpy(scopeName, inner, scopeNameSize);
973 scopeName[scopeNameSize] =
'\0';
975 if (
auto scope =
static_cast<TClass *
>(
gROOT->GetListOfClasses()->FindObject(scopeName))) {
976 auto enumTable =
dynamic_cast<const THashList *
>(scope->GetListOfEnums(
false));
977 if (enumTable && enumTable->THashList::FindObject(enName)) {
delete [] scopeName;
return true; }
981 auto listOfEnums = scope->GetListOfEnums();
983 auto enumTable =
dynamic_cast<const THashList *
>(listOfEnums);
984 if (enumTable && enumTable->THashList::FindObject(enName)) {
delete [] scopeName;
return true; }
991 auto enumTable =
dynamic_cast<const THashList *
>(
gROOT->GetListOfEnums());
992 if (enumTable && enumTable->THashList::FindObject(inner))
return true;
1015 return fContent.c_str();
1023 bool notPresent = fLinesHashSet.emplace(fHashFunc(str)).second;
1037static bool LoadModule(
const std::string &ModuleName, cling::Interpreter &interp)
1047 assert(!currentDir.empty());
1050 ::Info(
"TCling::__LoadModule",
"Preloading module %s. \n",
1051 ModuleName.c_str());
1053 return interp.loadModule(ModuleName,
true);
1059static void LoadModules(
const std::vector<std::string> &modules, cling::Interpreter &interp)
1061 for (
const auto &modName : modules)
1067 const static bool foundSymbol = dlsym(RTLD_DEFAULT,
"usedToIdentifyRootClingByDlSym");
1072static bool HasASTFileOnDisk(clang::Module *M,
const clang::Preprocessor &PP, std::string *FullFileName =
nullptr)
1074 const HeaderSearchOptions &HSOpts = PP.getHeaderSearchInfo().getHeaderSearchOpts();
1076 std::string ModuleFileName;
1077 if (!HSOpts.PrebuiltModulePaths.empty())
1079 ModuleFileName = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(M->Name);
1081 *FullFileName = ModuleFileName;
1083 return !ModuleFileName.empty();
1089 CompilerInstance &CI = *interp.getCI();
1090 Preprocessor &PP = CI.getPreprocessor();
1091 auto ModuleManager = CI.getASTReader();
1092 assert(ModuleManager);
1097 if (ModuleIndexPath.empty())
1100 ModuleManager->resetForReload();
1101 ModuleManager->loadGlobalIndex();
1102 GlobalModuleIndex *GlobalIndex = ModuleManager->getGlobalIndex();
1107 ModuleMap &MMap = PP.getHeaderSearchInfo().getModuleMap();
1108 bool RecreateIndex =
false;
1109 for (ModuleMap::module_iterator
I = MMap.module_begin(), E = MMap.module_end();
I != E; ++
I) {
1110 Module *TheModule =
I->second;
1115 RecreateIndex =
true;
1117 if (RecreateIndex) {
1118 cling::Interpreter::PushTransactionRAII deserRAII(&interp);
1119 clang::GlobalModuleIndex::UserDefinedInterestingIDs IDs;
1121 struct DefinitionFinder :
public RecursiveASTVisitor<DefinitionFinder> {
1122 DefinitionFinder(clang::GlobalModuleIndex::UserDefinedInterestingIDs& IDs,
1123 clang::TranslationUnitDecl* TU) : DefinitionIDs(IDs) {
1126 bool VisitNamedDecl(NamedDecl *ND) {
1127 if (!ND->isFromASTFile())
1129 if (!ND->getIdentifier())
1132 if (ND->getAccess() == AS_protected || ND->getAccess() == AS_private)
1135 if (TagDecl *TD = llvm::dyn_cast<TagDecl>(ND)) {
1136 if (TD->isCompleteDefinition())
1138 }
else if (NamespaceDecl *NSD = llvm::dyn_cast<NamespaceDecl>(ND)) {
1139 Register(NSD,
false);
1141 else if (TypedefNameDecl *TND = dyn_cast<TypedefNameDecl>(ND))
1147 clang::GlobalModuleIndex::UserDefinedInterestingIDs &DefinitionIDs;
1148 void Register(
const NamedDecl* ND,
bool AddSingleEntry =
true) {
1149 assert(ND->isFromASTFile());
1152 if (!ND->hasOwningModule()) {
1154 SourceManager &SM = ND->getASTContext().getSourceManager();
1155 SourceLocation Loc = ND->getLocation();
1156 const FileEntry *FE = SM.getFileEntryForID(SM.getFileID(Loc));
1158 assert(FE->getName().contains(
"input_line_"));
1163 Module *OwningModule = ND->getOwningModule()->getTopLevelModule();
1164 assert(OwningModule);
1165 assert(!ND->getName().empty() &&
"Empty name");
1166 if (AddSingleEntry && DefinitionIDs.count(ND->getName()))
1172 DefinitionIDs[ND->getName()].push_back(OwningModule->getASTFile());
1175 DefinitionFinder defFinder(IDs, CI.getASTContext().getTranslationUnitDecl());
1177 llvm::cantFail(GlobalModuleIndex::writeIndex(CI.getFileManager(),
1178 CI.getPCHContainerReader(),
1181 ModuleManager->resetForReload();
1182 ModuleManager->loadGlobalIndex();
1183 GlobalIndex = ModuleManager->getGlobalIndex();
1192 if (!clingInterp.getCI()->getLangOpts().Modules)
1196 cling::Interpreter::PushTransactionRAII deserRAII(&clingInterp);
1214 LoadModule(
"_Builtin_intrinsics", clingInterp);
1218 std::vector<std::string> CoreModules = {
"ROOT_Foundation_C",
1221 "ROOT_Foundation_Stage1_NoRTTI",
1230 std::vector<std::string> CommonModules = {
"MathCore"};
1236 std::vector<std::string> FIXMEModules = {
"Hist"};
1237 clang::CompilerInstance &CI = *clingInterp.getCI();
1238 clang::Preprocessor &PP = CI.getPreprocessor();
1239 ModuleMap &MMap = PP.getHeaderSearchInfo().getModuleMap();
1240 if (MMap.findModule(
"RInterface"))
1241 FIXMEModules.push_back(
"RInterface");
1245 GlobalModuleIndex *GlobalIndex =
nullptr;
1249 GlobalIndex = CI.getASTReader()->getGlobalIndex();
1251 llvm::StringSet<> KnownModuleFileNames;
1253 GlobalIndex->getKnownModuleFileNames(KnownModuleFileNames);
1255 std::vector<std::string> PendingModules;
1256 PendingModules.reserve(256);
1257 for (
auto I = MMap.module_begin(), E = MMap.module_end();
I != E; ++
I) {
1258 clang::Module *M =
I->second;
1262 std::string FullASTFilePath;
1266 if (GlobalIndex && KnownModuleFileNames.count(FullASTFilePath))
1269 if (M->IsUnimportable)
1277 if (std::find(CoreModules.begin(), CoreModules.end(), M->Name) != CoreModules.end())
1285 PendingModules.push_back(M->Name);
1292 assert(clingInterp.getMacro(
"gROOT") &&
"Couldn't load gROOT macro?");
1296 clingInterp.declare(R
"CODE(
1308 std::string PreIncludes;
1309 bool hasCxxModules = clingInterp.getCI()->getLangOpts().Modules;
1315 PreIncludes +=
"#include \"RtypesCore.h\"\n";
1318 PreIncludes +=
"#include \"Rtypes.h\"\n";
1320 PreIncludes += gClassDefInterpMacro +
"\n"
1321 + gInterpreterClassDef +
"\n"
1323 "#define ClassImp(X);\n";
1326 PreIncludes +=
"#include <string>\n";
1331 PreIncludes +=
"#include <cassert>\n";
1333 PreIncludes +=
"using namespace std;\n";
1334 clingInterp.declare(PreIncludes);
1354#ifdef R__USE_CXXMODULES
1358 llvm::install_fatal_error_handler(&exceptionErrorHandler);
1362 std::vector<std::string> clingArgsStorage;
1363 clingArgsStorage.push_back(
"cling4root");
1364 for (
const char*
const* arg = argv; *arg; ++arg)
1365 clingArgsStorage.push_back(*arg);
1368 if (!fromRootCling) {
1373 clingArgsStorage.push_back(
"-I" + interpInclude);
1376 clingArgsStorage.push_back(
"-I" + interpInclude +
"/cling");
1379 clingArgsStorage.push_back(
"-I" + interpInclude +
"/cling/plugins/include");
1390 std::string pchFilename = interpInclude +
"/allDict.cxx.pch";
1395 clingArgsStorage.push_back(
"-include-pch");
1396 clingArgsStorage.push_back(pchFilename);
1399 clingArgsStorage.push_back(
"-Wno-undefined-inline");
1400 clingArgsStorage.push_back(
"-fsigned-char");
1403#if !defined(_MSC_VER) || defined(_WIN64)
1404 clingArgsStorage.push_back(
"-O1");
1407 clingArgsStorage.push_back(
"-mllvm");
1408 clingArgsStorage.push_back(
"-optimize-regalloc=0");
1413 llvm::Optional<std::string> EnvOpt = llvm::sys::Process::GetEnv(
"EXTRA_CLING_ARGS");
1414 if (EnvOpt.hasValue()) {
1415 StringRef Env(*EnvOpt);
1416 while (!Env.empty()) {
1418 std::tie(Arg, Env) = Env.split(
' ');
1419 clingArgsStorage.push_back(Arg.str());
1423 auto GetEnvVarPath = [](
const std::string &EnvVar,
1424 std::vector<std::string> &Paths) {
1425 llvm::Optional<std::string> EnvOpt = llvm::sys::Process::GetEnv(EnvVar);
1426 if (EnvOpt.hasValue()) {
1427 StringRef Env(*EnvOpt);
1428 while (!Env.empty()) {
1431 if (std::find(Paths.begin(), Paths.end(), Arg.str()) == Paths.end())
1432 Paths.push_back(Arg.str());
1438 std::vector<std::string> Paths;
1443 GetEnvVarPath(
"CLING_PREBUILT_MODULE_PATH", Paths);
1444 std::string EnvVarPath;
1445 for (
const std::string& P : Paths)
1448 gSystem->
Setenv(
"CLING_PREBUILT_MODULE_PATH", EnvVarPath.c_str());
1452 EnvOpt = llvm::sys::Process::GetEnv(
"ROOT_CLING_TIMING");
1453 if (EnvOpt.hasValue())
1454 clingArgsStorage.push_back(
"-ftime-report");
1461 std::vector<std::string> ModuleMaps;
1464 GetEnvVarPath(
"CLING_MODULEMAP_FILES", ModuleMaps);
1468 if (llvm::sys::fs::exists(cwd + ModuleMapSuffix))
1469 ModuleMaps.push_back(cwd + ModuleMapSuffix);
1471 for (
const std::string& M : ModuleMaps)
1472 clingArgsStorage.push_back(
"-fmodule-map-file=" + M);
1474 std::string ModulesCachePath;
1475 EnvOpt = llvm::sys::Process::GetEnv(
"CLING_MODULES_CACHE_PATH");
1476 if (EnvOpt.hasValue()){
1477 StringRef Env(*EnvOpt);
1478 assert(llvm::sys::fs::exists(Env) &&
"Path does not exist!");
1479 ModulesCachePath = Env.str();
1484 clingArgsStorage.push_back(
"-fmodules-cache-path=" + ModulesCachePath);
1487 std::vector<const char*> interpArgs;
1488 for (std::vector<std::string>::const_iterator iArg = clingArgsStorage.begin(),
1489 eArg = clingArgsStorage.end(); iArg != eArg; ++iArg)
1490 interpArgs.push_back(iArg->c_str());
1497 if (!fromRootCling) {
1499 interpArgs.push_back(
"-fmodules");
1500 interpArgs.push_back(
"-fno-implicit-module-maps");
1504 interpArgs.push_back(
"-Rmodule-build");
1510 interpArgs.push_back(
"-fno-autolink");
1515 interpArgs.push_back(
"-ffast-math");
1521 extraArgs && *extraArgs; ++extraArgs) {
1522 if (!strcmp(*extraArgs,
"-resource-dir")) {
1524 llvmResourceDir = *(++extraArgs);
1526 interpArgs.push_back(*extraArgs);
1530 std::vector<std::string> _empty;
1532 for (
const auto &arg: args)
1533 interpArgs.emplace_back(arg.c_str());
1536 cling::Interpreter::ModuleFileExtensions extensions;
1537 EnvOpt = llvm::sys::Process::GetEnv(
"ROOTDEBUG_RDICT");
1538 if (!EnvOpt.hasValue())
1539 extensions.push_back(std::make_shared<TClingRdictModuleFileExtension>());
1541 fInterpreter = std::make_unique<cling::Interpreter>(interpArgs.size(),
1543 llvmResourceDir, extensions,
1547 fInterpreter->getCI()->getPreprocessorOpts().DisablePCHOrModuleValidation =
1548 DisableValidationForModuleKind::All;
1552 fInterpreter->getCI()->getLangOpts().SpellChecking =
false;
1555 auto isModulesArg = [](
const char* arg) {
return !strcmp(arg,
"-fmodules"); };
1556 bool hasModulesArg = std::find_if(interpArgs.begin(), interpArgs.end(), isModulesArg) != interpArgs.end();
1557 fInterpreter->getCI()->getLangOpts().Modules = hasModulesArg;
1562 static llvm::raw_fd_ostream fMPOuts (STDOUT_FILENO,
false);
1582 if (!fromRootCling) {
1587 fInterpreter->getRuntimeOptions().AllowRedefinition = 1;
1588 auto &Policy =
const_cast<clang::PrintingPolicy &
>(
fInterpreter->getCI()->getASTContext().getPrintingPolicy());
1592 Policy.SplitTemplateClosers =
true;
1594 Policy.SuppressDefaultTemplateArgs =
false;
1600 std::unique_ptr<TClingCallbacks>
1606 if (!fromRootCling) {
1607 cling::DynamicLibraryManager& DLM = *
fInterpreter->getDynamicLibraryManager();
1612 auto ShouldPermanentlyIgnore = [](llvm::StringRef FileName) ->
bool{
1613 llvm::StringRef stem = llvm::sys::path::stem(FileName);
1614 return stem.startswith(
"libNew") || stem.startswith(
"libcppyy_backend");
1617 DLM.initializeDyld(ShouldPermanentlyIgnore);
1655 assert(
GetRootMapFiles() ==
nullptr &&
"Must be called before LoadLibraryMap!");
1674 auto setFactory = []() {
1678 static bool doneFactory = setFactory();
1690 if (llvm::sys::fs::exists(pcmFileNameFullPath)) {
1691 ::Error(
"TCling::RegisterRdictForLoadPCM",
"Rdict '%s' is both in Module extension and in File system.", pcmFileNameFullPath.c_str());
1708 if (listOfKeys && ((listOfKeys->GetSize() == 0) ||
1709 ((listOfKeys->GetSize() == 1) &&
1710 !strcmp(((
TKey *)listOfKeys->At(0))->GetName(),
"EMPTY")
1717 ::Info(
"TCling::LoadPCMImpl",
"reading protoclasses for %s \n", pcmFile.
GetName());
1723 auto listOfGlobals =
gROOT->GetListOfGlobals();
1724 auto listOfEnums =
dynamic_cast<THashList *
>(
gROOT->GetListOfEnums());
1726 for (
auto selEnum : *enums) {
1727 const char *enumScope = selEnum->
GetTitle();
1728 const char *enumName = selEnum->GetName();
1729 if (strcmp(enumScope,
"") == 0) {
1732 if (!listOfEnums->THashList::FindObject(enumName)) {
1733 ((
TEnum *)selEnum)->SetClass(
nullptr);
1734 listOfEnums->Add(selEnum);
1736 for (
auto enumConstant : *
static_cast<TEnum *
>(selEnum)->GetConstants()) {
1737 if (!listOfGlobals->FindObject(enumConstant)) {
1738 listOfGlobals->Add(enumConstant);
1745 if (!nsTClassEntry) {
1748 auto listOfEnums = nsTClassEntry->
fEnums.load();
1759 if (listOfEnums && !listOfEnums->THashList::FindObject(enumName)) {
1760 ((
TEnum *)selEnum)->SetClass(nsTClassEntry);
1761 listOfEnums->Add(selEnum);
1769 pcmFile.
GetObject(
"__ProtoClasses", protoClasses);
1772 for (
auto obj : *protoClasses) {
1782 for (
auto proto : *protoClasses) {
1790 ::Error(
"TCling::LoadPCM",
"Inconsistent TClassTable for %s",
proto->GetName());
1801 protoClasses->
Clear();
1802 delete protoClasses;
1806 pcmFile.
GetObject(
"__Typedefs", dataTypes);
1808 for (
auto typedf : *dataTypes)
1809 gROOT->GetListOfTypes()->Add(typedf);
1822 assert(!pcmFileNameFullPath.empty());
1823 assert(llvm::sys::path::is_absolute(pcmFileNameFullPath));
1826 TString pcmFileName = pcmFileNameFullPath;
1834 llvm::SaveAndRestore<Int_t> SaveGDebug(
gDebug);
1837 ::Info(
"TCling::LoadPCM",
"Loading ROOT PCM %s", pcmFileName.
Data());
1842 if (llvm::sys::fs::is_symlink_file(pcmFileNameFullPath))
1847 llvm::StringRef pcmContent = pendingRdict->second;
1849 std::string RDictFileOpts = pcmFileNameFullPath +
"?filetype=pcm";
1850 TMemFile pcmMemFile(RDictFileOpts.c_str(), range);
1865 if (!llvm::sys::fs::exists(pcmFileNameFullPath)) {
1866 ::Error(
"TCling::LoadPCM",
"ROOT PCM %s file does not exist",
1867 pcmFileNameFullPath.data());
1870 ::Info(
"TCling::LoadPCM",
"In-memory ROOT PCM candidate %s\n",
1871 rdict.first.c_str());
1875 if (!
gROOT->IsRootFile(pcmFileName)) {
1876 Fatal(
"LoadPCM",
"The file %s is not a ROOT as was expected\n", pcmFileName.
Data());
1879 TFile pcmFile(pcmFileName +
"?filetype=pcm",
"READ");
1886 using namespace clang;
1888 class ExtLexicalStorageAdder:
public RecursiveASTVisitor<ExtLexicalStorageAdder>{
1893 bool VisitRecordDecl(clang::RecordDecl* rcd){
1895 Info(
"ExtLexicalStorageAdder",
1896 "Adding external lexical storage to class %s",
1897 rcd->getNameAsString().c_str());
1898 auto reDeclPtr = rcd->getMostRecentDecl();
1900 reDeclPtr->setHasExternalLexicalStorage();
1901 }
while ((reDeclPtr = reDeclPtr->getPreviousDecl()));
1914 const std::string &ModuleMapName )
const
1916 assert(llvm::sys::path::is_absolute(FullPath));
1917 Preprocessor &PP =
fInterpreter->getCI()->getPreprocessor();
1918 FileManager &FM = PP.getFileManager();
1921 if (
auto DE = FM.getOptionalDirectoryRef(FullPath)) {
1922 HeaderSearch &HS = PP.getHeaderSearchInfo();
1923 HeaderSearchOptions &HSOpts = HS.getHeaderSearchOpts();
1924 const auto &ModPaths = HSOpts.PrebuiltModulePaths;
1925 bool pathExists = std::find(ModPaths.begin(), ModPaths.end(), FullPath) != ModPaths.end();
1927 HSOpts.AddPrebuiltModulePath(FullPath);
1932 llvm::SmallString<256> ModuleMapFileName(DE->getName());
1933 llvm::sys::path::append(ModuleMapFileName, ModuleMapName);
1934 if (
auto FE = FM.getOptionalFileRef(ModuleMapFileName,
false,
1936 if (!HS.loadModuleMapFile(*FE,
false))
1938 Error(
"RegisterPrebuiltModulePath",
"Could not load modulemap in %s", ModuleMapFileName.c_str());
1955 "libforward_listDict",
1963 "libunordered_setDict",
1964 "libunordered_multisetDict",
1965 "libunordered_mapDict",
1966 "libunordered_multimapDict",
1974 char dyLibError[1000];
1975 FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
1976 dyLibError,
sizeof(dyLibError), NULL);
1978 const char *dyLibError = dlerror();
1980 ::Error(
"TCling::RegisterModule",
"Cannot open shared library %s for dictionary %s:\n %s", dyLibName, modulename,
1981 (dyLibError) ? dyLibError :
"");
2018 const char** headers,
2019 const char** includePaths,
2020 const char* payloadCode,
2021 const char* fwdDeclsCode,
2022 void (*triggerFunc)(),
2024 const char** classesHeaders,
2025 Bool_t lateRegistration ,
2032 if (fromRootCling)
return;
2041 bool isACLiC = strstr(modulename,
"_ACLiC_dict") !=
nullptr;
2042 if (hasHeaderParsingOnDemand && isACLiC) {
2044 Info(
"TCling::RegisterModule",
2045 "Header parsing on demand is active but this is an Aclic library. Disabling it for this library.");
2046 hasHeaderParsingOnDemand =
false;
2060 for (
const char** inclPath = includePaths; *inclPath; ++inclPath) {
2063 cling::Transaction* T =
nullptr;
2065 for (
auto& fwdDeclArgToSkipPair : fwdDeclsArgToSkip){
2066 const std::string& fwdDecl = fwdDeclArgToSkipPair.first;
2067 const int nArgsToSkip = fwdDeclArgToSkipPair.second;
2068 auto compRes =
fInterpreter->declare(fwdDecl.c_str(), &T);
2069 assert(cling::Interpreter::kSuccess == compRes &&
2070 "A fwd declaration could not be compiled");
2071 if (compRes!=cling::Interpreter::kSuccess){
2072 Warning(
"TCling::RegisterModule",
2073 "Problems in declaring string '%s' were encountered.",
2088 TString code = gNonInterpreterClassDef;
2090 code += payloadCode;
2092 std::string dyLibName = cling::DynamicLibraryManager::getSymbolLocation(triggerFunc);
2093 assert(!llvm::sys::fs::is_symlink_file(dyLibName));
2095 if (dyLibName.empty()) {
2096 ::Error(
"TCling::RegisterModule",
"Dictionary trigger function for %s not found", modulename);
2101 bool isSharedLib = cling::DynamicLibraryManager::isSharedLibrary(dyLibName);
2103 bool wasDlopened =
false;
2108 if (!lateRegistration) {
2115 void* dyLibHandle = dlopen(dyLibName.c_str(), RTLD_LAZY | RTLD_GLOBAL);
2125 if (hasHeaderParsingOnDemand && fwdDeclsCode){
2128 std::string fwdDeclsCodeLessEnums;
2132 std::string fwdDeclsLine;
2133 std::istringstream fwdDeclsCodeStr(fwdDeclsCode);
2134 std::vector<std::string> scopes;
2135 while (std::getline(fwdDeclsCodeStr, fwdDeclsLine)) {
2136 const auto enumPos = fwdDeclsLine.find(
"enum __attribute__((annotate(\"");
2138 if (enumPos != std::string::npos) {
2145 auto nsPos = fwdDeclsLine.find(
"namespace");
2146 R__ASSERT(nsPos < enumPos &&
"Inconsistent enum and enclosing scope parsing!");
2147 while (nsPos < enumPos && nsPos != std::string::npos) {
2149 const auto nsNameStart = nsPos + 10;
2150 const auto nsNameEnd = fwdDeclsLine.find(
'{', nsNameStart);
2151 const auto nsName = fwdDeclsLine.substr(nsNameStart, nsNameEnd - nsNameStart);
2152 scopes.push_back(nsName);
2153 nsPos = fwdDeclsLine.find(
"namespace", nsNameEnd);
2156 clang::DeclContext* DC =
nullptr;
2157 for (
auto &&aScope: scopes) {
2158 DC = cling::utils::Lookup::Namespace(&
fInterpreter->getSema(), aScope.c_str(), DC);
2164 if (scopes.empty() || DC) {
2168 size_t posEnumName = fwdDeclsLine.rfind(
"\"))) ");
2169 R__ASSERT(posEnumName != std::string::npos &&
"Inconsistent enum fwd decl!");
2171 while (isspace(fwdDeclsLine[posEnumName]))
2173 size_t posEnumNameEnd = fwdDeclsLine.find(
" : ", posEnumName);
2174 R__ASSERT(posEnumNameEnd != std::string::npos &&
"Inconsistent enum fwd decl (end)!");
2175 while (isspace(fwdDeclsLine[posEnumNameEnd]))
2179 std::string enumName = fwdDeclsLine.substr(posEnumName,
2180 posEnumNameEnd - posEnumName + 1);
2182 if (clang::NamedDecl* enumDecl
2183 = cling::utils::Lookup::Named(&
fInterpreter->getSema(),
2184 enumName.c_str(), DC)) {
2187 R__ASSERT(llvm::dyn_cast<clang::EnumDecl>(enumDecl) &&
"not an enum decl!");
2194 fwdDeclsCodeLessEnums += fwdDeclsLine +
"\n";
2198 if (!fwdDeclsCodeLessEnums.empty()){
2199 auto compRes =
fInterpreter->declare(fwdDeclsCodeLessEnums, &T);
2200 assert(cling::Interpreter::kSuccess == compRes &&
2201 "The forward declarations could not be compiled");
2202 if (compRes!=cling::Interpreter::kSuccess){
2203 Warning(
"TCling::RegisterModule",
2204 "Problems in compiling forward declarations for module %s: '%s'",
2205 modulename, fwdDeclsCodeLessEnums.c_str()) ;
2213 ExtLexicalStorageAdder elsa;
2214 for (
auto dciIt = T->decls_begin();dciIt!=T->decls_end();dciIt++){
2215 cling::Transaction::DelayCallInfo& dci = *dciIt;
2216 for(
auto dit = dci.m_DGR.begin(); dit != dci.m_DGR.end(); ++dit) {
2217 clang::Decl* declPtr = *dit;
2218 elsa.TraverseDecl(declPtr);
2232 for (
const char** classesHeader = classesHeaders; *classesHeader; ++classesHeader) {
2233 temp=*classesHeader;
2235 size_t theTemplateHash = 0;
2236 bool addTemplate =
false;
2237 size_t posTemplate = temp.find(
'<');
2238 if (posTemplate != std::string::npos) {
2240 std::string templateName = temp.substr(0, posTemplate);
2246 for (
const char** classesHeader_inner = classesHeader; 0!=strcmp(*classesHeader_inner,
"@"); ++classesHeader_inner,++classesHeader){
2248 if (payloadCode == *classesHeader_inner ){
2250 if (addTemplate)
fPayloads.insert(theTemplateHash);
2253 Info(
"TCling::RegisterModule",
2254 "Adding a header for %s", temp.c_str());
2260 addTemplate =
false;
2268 bool ModuleWasSuccessfullyLoaded =
false;
2270 std::string ModuleName = modulename;
2271 if (llvm::StringRef(modulename).startswith(
"lib"))
2272 ModuleName = llvm::StringRef(modulename).substr(3).str();
2277 clang::Preprocessor &PP = TheSema.getPreprocessor();
2278 std::string ModuleMapName;
2280 ModuleMapName = ModuleName +
".modulemap";
2282 ModuleMapName =
"module.modulemap";
2290 if (!ModuleWasSuccessfullyLoaded) {
2292 clang::HeaderSearch &headerSearch = PP.getHeaderSearchInfo();
2293 clang::ModuleMap &moduleMap = headerSearch.getModuleMap();
2294 if (moduleMap.findModule(ModuleName))
2295 Info(
"TCling::RegisterModule",
"Module %s in modulemap failed to load.", ModuleName.c_str());
2300 llvm::SmallString<256> pcmFileNameFullPath(dyLibName);
2303 llvm::sys::fs::make_absolute(pcmFileNameFullPath);
2304 llvm::sys::path::remove_filename(pcmFileNameFullPath);
2305 llvm::sys::path::append(pcmFileNameFullPath,
2307 LoadPCM(pcmFileNameFullPath.str().str());
2314 clangDiagSuppr diagSuppr(TheSema.getDiagnostics());
2316#if defined(R__MUST_REVISIT)
2317#if R__MUST_REVISIT(6,2)
2318 Warning(
"TCling::RegisterModule",
"Diagnostics suppression should be gone by now.");
2322 if (!ModuleWasSuccessfullyLoaded && !hasHeaderParsingOnDemand){
2325 const cling::Transaction* watermark =
fInterpreter->getLastTransaction();
2326 cling::Interpreter::CompilationResult compRes =
fInterpreter->parseForModule(code.
Data());
2332 assert(cling::Interpreter::kSuccess == compRes &&
2333 "Payload code of a dictionary could not be parsed correctly.");
2334 if (compRes!=cling::Interpreter::kSuccess) {
2335 Warning(
"TCling::RegisterModule",
2336 "Problems declaring payload for module %s.", modulename) ;
2349 if (!ModuleWasSuccessfullyLoaded && !hasHeaderParsingOnDemand) {
2352 "#undef __ROOTCLING__\n"
2353 + gInterpreterClassDef +
2358 assert(isSharedLib);
2361 dlclose(dyLibHandle);
2367 ASTContext &C = CI.getASTContext();
2375 if (IdentifierInfoLookup *External = C.Idents.getExternalIdentifierLookup()) {
2376 std::unique_ptr<IdentifierIterator> Iter(External->getIdentifiers());
2377 for (llvm::StringRef Ident = Iter->Next(); !Ident.empty(); Ident = Iter->Next()) {
2378 std::string
I = Ident.str();
2402 typedef std::vector<std::pair<TClass*,DictFuncPtr_t> >::iterator iterator;
2408 if ( i->first == oldcl ) {
2431 const char* input_line,
2432 cling::Interpreter::CompilationResult& compRes,
2436 return metaProcessor->process(input_line, compRes,
result);
2438 catch (cling::InterpreterException&
ex)
2440 Error(
"HandleInterpreterException",
"%s\n%s",
ex.what(),
"Execution of your code was aborted.");
2442 compRes = cling::Interpreter::kFailure;
2451 if (
auto ie =
dynamic_cast<const cling::InterpreterException*
>(&
e)) {
2477 gROOT->SetLineIsProcessing();
2481 gROOT->SetLineHasBeenProcessed();
2494 gROOT->SetLineIsProcessing();
2496 struct InterpreterFlagsRAII {
2497 cling::Interpreter* fInterpreter;
2498 bool fWasDynamicLookupEnabled;
2500 InterpreterFlagsRAII(cling::Interpreter* interp):
2501 fInterpreter(interp),
2502 fWasDynamicLookupEnabled(interp->isDynamicLookupEnabled())
2504 fInterpreter->enableDynamicLookup(
true);
2506 ~InterpreterFlagsRAII() {
2507 fInterpreter->enableDynamicLookup(fWasDynamicLookupEnabled);
2508 gROOT->SetLineHasBeenProcessed();
2517 cling::Interpreter::CompilationResult compRes = cling::Interpreter::kSuccess;
2518 if (!strncmp(sLine.
Data(),
".L", 2) || !strncmp(sLine.
Data(),
".x", 2) ||
2519 !strncmp(sLine.
Data(),
".X", 2)) {
2527 aclicMode, arguments, io);
2528 if (aclicMode.
Length()) {
2530 R__ASSERT(aclicMode[0]==
'+' &&
"ACLiC mode must start with a +");
2532 if (aclicMode[1]==
'+') {
2538 compRes = cling::Interpreter::kFailure;
2540 if (strncmp(sLine.
Data(),
".L", 2) != 0) {
2543 if (arguments.
Length()==0) {
2552 mod_line = function + arguments + io;
2558 size_t unnamedMacroOpenCurly;
2561 std::string codeline;
2564 std::ifstream in(fname, std::ifstream::binary);
2566 std::getline(in, codeline);
2567 code += codeline +
"\n";
2569 unnamedMacroOpenCurly
2570 = cling::utils::isUnnamedMacro(code,
fInterpreter->getCI()->getLangOpts());
2574 if (unnamedMacroOpenCurly != std::string::npos) {
2576 unnamedMacroOpenCurly);
2586 if (0!=strncmp(sLine.
Data(),
".autodict ",10) && sLine !=
".autodict") {
2591 bool isInclusionDirective = sLine.
Contains(
"\n#include") || sLine.
BeginsWith(
"#include");
2592 if (isInclusionDirective) {
2609 case cling::Interpreter::kSuccess: *error =
kNoError;
break;
2610 case cling::Interpreter::kFailure: *error =
kRecoverable;
break;
2611 case cling::Interpreter::kMoreInputExpected: *error =
kProcessing;
break;
2614 if (compRes == cling::Interpreter::kSuccess
2645 if (path[0] ==
'-' && path[1] ==
'I')
2670 static const TClassRef clRefString(
"std::string");
2671 if (clRefString == cl) {
2690 const char* cobj = (
const char*) obj;
2697 auto inspInspect = [&] (ptrdiff_t
offset){
2703 switch(complexType) {
2710 inspInspect(
sizeof(
float));
2715 inspInspect(
sizeof(
double));
2720 inspInspect(
sizeof(
int));
2725 inspInspect(
sizeof(
long));
2730 static clang::PrintingPolicy
2732 if (printPol.Indentation) {
2734 printPol.Indentation = 0;
2735 printPol.SuppressInitializers =
true;
2738 const char* clname = cl->
GetName();
2741 const clang::ASTContext& astContext =
fInterpreter->getCI()->getASTContext();
2742 const clang::Decl *scopeDecl =
nullptr;
2743 const clang::Type *recordType =
nullptr;
2747 scopeDecl = clingCI->
GetDecl();
2748 recordType = clingCI->
GetType();
2750 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
2752 scopeDecl = lh.findScope(clname, cling::LookupHelper::NoDiagnostics,
2756 Error(
"InspectMembers",
"Cannot find Decl for class %s", clname);
2759 const clang::CXXRecordDecl* recordDecl
2760 = llvm::dyn_cast<const clang::CXXRecordDecl>(scopeDecl);
2762 Error(
"InspectMembers",
"Cannot find Decl for class %s is not a CXXRecordDecl.", clname);
2771 astContext.getASTRecordLayout(recordDecl);
2773 for (clang::RecordDecl::field_iterator iField = recordDecl->field_begin(),
2774 eField = recordDecl->field_end(); iField != eField; ++iField) {}
2777 const clang::ASTRecordLayout& recLayout
2778 = astContext.getASTRecordLayout(recordDecl);
2785 if (cl->
Size() != recLayout.getSize().getQuantity()) {
2786 Error(
"InspectMembers",
"TClass and cling disagree on the size of the class %s, respectively %d %lld\n",
2790 unsigned iNField = 0;
2793 for (clang::RecordDecl::field_iterator iField = recordDecl->field_begin(),
2794 eField = recordDecl->field_end(); iField != eField;
2795 ++iField, ++iNField) {
2798 clang::QualType memberQT = iField->getType();
2803 memberQT = cling::utils::Transform::GetPartiallyDesugaredType(astContext, memberQT,
fNormalizedCtxt->
GetConfig(),
false );
2804 if (memberQT.isNull()) {
2805 std::string memberName;
2806 llvm::raw_string_ostream stream(memberName);
2808 printPol.AnonymousTagLocations =
false;
2809 iField->getNameForDiagnostic(stream, printPol,
true );
2811 Error(
"InspectMembers",
2812 "Cannot retrieve QualType for member %s while inspecting class %s",
2813 memberName.c_str(), clname);
2816 const clang::Type* memType = memberQT.getTypePtr();
2818 std::string memberName;
2819 llvm::raw_string_ostream stream(memberName);
2821 printPol.AnonymousTagLocations =
false;
2822 iField->getNameForDiagnostic(stream, printPol,
true );
2824 Error(
"InspectMembers",
2825 "Cannot retrieve Type for member %s while inspecting class %s",
2826 memberName.c_str(), clname);
2830 const clang::Type* memNonPtrType = memType;
2831 Bool_t ispointer =
false;
2832 if (memNonPtrType->isPointerType()) {
2834 clang::QualType ptrQT
2835 = memNonPtrType->getAs<clang::PointerType>()->getPointeeType();
2840 ptrQT = cling::utils::Transform::GetPartiallyDesugaredType(astContext, ptrQT,
fNormalizedCtxt->
GetConfig(),
false );
2841 if (ptrQT.isNull()) {
2842 std::string memberName;
2843 llvm::raw_string_ostream stream(memberName);
2845 printPol.AnonymousTagLocations =
false;
2846 iField->getNameForDiagnostic(stream, printPol,
true );
2848 Error(
"InspectMembers",
2849 "Cannot retrieve pointee Type for member %s while inspecting class %s",
2850 memberName.c_str(), clname);
2853 memNonPtrType = ptrQT.getTypePtr();
2857 llvm::SmallString<8> arraySize;
2858 const clang::ArrayType* arrType = memNonPtrType->getAsArrayTypeUnsafe();
2859 unsigned arrLevel = 0;
2860 bool haveErrorDueToArray =
false;
2864 const clang::ConstantArrayType* constArrType =
2865 clang::dyn_cast<clang::ConstantArrayType>(arrType);
2867 constArrType->getSize().toStringUnsigned(arraySize);
2870 clang::QualType subArrQT = arrType->getElementType();
2871 if (subArrQT.isNull()) {
2872 std::string memberName;
2873 llvm::raw_string_ostream stream(memberName);
2875 printPol.AnonymousTagLocations =
false;
2876 iField->getNameForDiagnostic(stream, printPol,
true );
2878 Error(
"InspectMembers",
2879 "Cannot retrieve QualType for array level %d (i.e. element type of %s) for member %s while inspecting class %s",
2880 arrLevel, subArrQT.getAsString(printPol).c_str(),
2881 memberName.c_str(), clname);
2882 haveErrorDueToArray =
true;
2885 arrType = subArrQT.getTypePtr()->getAsArrayTypeUnsafe();
2887 if (haveErrorDueToArray) {
2892 std::string fieldName;
2893 if (memType->isPointerType()) {
2898 std::string ioname(iField->getName());
2900 fieldName += ioname;
2901 fieldName += arraySize;
2906 clang::CharUnits
offset(astContext.toCharUnitsFromBits(recLayout.getFieldOffset(iNField)));
2907 ptrdiff_t fieldOffset =
offset.getQuantity();
2917 auto iFiledQtype = iField->getType();
2918 if (
auto tagDecl = iFiledQtype->getAsTagDecl()){
2919 auto declAccess = tagDecl->getAccess();
2920 if (declAccess == AS_private || declAccess == AS_protected) {
2926 insp.
Inspect(
const_cast<TClass*
>(cl), insp.
GetParent(), fieldName.c_str(), cobj + fieldOffset, isTransient);
2929 const clang::CXXRecordDecl* fieldRecDecl = memNonPtrType->getAsCXXRecordDecl();
2930 if (fieldRecDecl && !fieldRecDecl->isAnonymousStructOrUnion()) {
2933 std::string sFieldRecName;
2936 clang::QualType(memNonPtrType,0),
2946 insp.
InspectMember(sFieldRecName.c_str(), cobj + fieldOffset,
2947 (fieldName +
'.').c_str(), transient);
2955 unsigned iNBase = 0;
2956 for (clang::CXXRecordDecl::base_class_const_iterator iBase
2957 = recordDecl->bases_begin(), eBase = recordDecl->bases_end();
2958 iBase != eBase; ++iBase, ++iNBase) {
2959 clang::QualType baseQT = iBase->getType();
2960 if (baseQT.isNull()) {
2961 Error(
"InspectMembers",
2962 "Cannot find QualType for base number %d while inspecting class %s",
2966 const clang::CXXRecordDecl* baseDecl
2967 = baseQT->getAsCXXRecordDecl();
2969 Error(
"InspectMembers",
2970 "Cannot find CXXRecordDecl for base number %d while inspecting class %s",
2975 std::string sBaseName;
2977 std::vector<TClass*> foundClasses;
2979 if (foundClasses.size()==1){
2980 baseCl=foundClasses[0];
2993 std::string qualNameForDiag;
2995 Error(
"InspectMembers",
2996 "Cannot find TClass for base class %s", qualNameForDiag.c_str() );
3001 if (iBase->isVirtual()) {
3004 Error(
"InspectMembers",
3005 "Base %s of class %s is virtual but no object provided",
3006 sBaseName.c_str(), clname);
3014 baseOffset = ci->
GetBaseOffset(baseCi,
const_cast<void*
>(obj),
3016 if (baseOffset == -1) {
3017 Error(
"InspectMembers",
3018 "Error calculating offset of virtual base %s of class %s",
3019 sBaseName.c_str(), clname);
3022 Error(
"InspectMembers",
3023 "Cannot calculate offset of virtual base %s of class %s",
3024 sBaseName.c_str(), clname);
3029 baseOffset = recLayout.getBaseClassOffset(baseDecl).getQuantity();
3076 bool oldDynLookup =
fInterpreter->isDynamicLookupEnabled();
3105 return fInterpreter->getDynamicLibraryManager()->isLibraryLoaded(tLibName.
Data());
3120 llvm::StringRef ModuleName(libname);
3121 ModuleName = llvm::sys::path::stem(ModuleName);
3122 ModuleName.consume_front(
"lib");
3130 clang::ModuleMap &moduleMap =
fInterpreter->getCI()->getPreprocessor().getHeaderSearchInfo().getModuleMap();
3131 clang::Module *M = moduleMap.findModule(ModuleName);
3132 return M && !M->IsUnimportable && M->getASTFile();
3151 size_t at = std::string::npos;
3152 while ((at = file_name.find(
"/./")) != std::string::npos)
3153 file_name.replace(at, 3,
"/");
3155 std::string filesStr =
"";
3156 llvm::raw_string_ostream filesOS(filesStr);
3157 clang::SourceManager &SM =
fInterpreter->getCI()->getSourceManager();
3158 cling::ClangInternalState::printIncludedFiles(filesOS, SM);
3161 llvm::SmallVector<llvm::StringRef, 100> files;
3162 llvm::StringRef(filesStr).split(files,
"\n");
3164 std::set<std::string> fileMap;
3165 llvm::StringRef file_name_ref(file_name);
3167 for (llvm::SmallVector<llvm::StringRef, 100>::const_iterator
3168 iF = files.begin(), iE = files.end(); iF != iE; ++iF) {
3169 if ((*iF) == file_name_ref)
return kTRUE;
3170 fileMap.insert(iF->str());
3173 if (fileMap.empty())
return kFALSE;
3176 TString sFilename(file_name.c_str());
3178 && fileMap.count(sFilename.
Data())) {
3186 while (incPath.
Index(
" :") != -1) {
3190 sFilename = file_name.c_str();
3192 && fileMap.count(sFilename.
Data())) {
3201 const clang::DirectoryLookup *CurDir =
nullptr;
3202 clang::Preprocessor &PP =
fInterpreter->getCI()->getPreprocessor();
3203 clang::HeaderSearch &HS = PP.getHeaderSearchInfo();
3204 auto FE = HS.LookupFile(file_name.c_str(),
3205 clang::SourceLocation(),
3208 clang::ArrayRef<std::pair<
const clang::FileEntry *,
3209 const clang::DirectoryEntry *>>(),
3220 if (FE && FE->isValid()) {
3222 clang::SourceManager &SM =
fInterpreter->getCI()->getSourceManager();
3224 clang::FileID FID = SM.translateFile(*FE);
3225 if (!FID.isInvalid() && FID.getHashValue() == 0)
3228 clang::SrcMgr::SLocEntry SLocE = SM.getSLocEntry(FID);
3229 if (SLocE.isFile() && !SLocE.getFile().getContentCache().getBufferIfLoaded())
3231 if (!FID.isInvalid())
3235 sFilename = FE->getName().str();
3237 && fileMap.count(sFilename.
Data())) {
3245#if defined(R__MACOSX)
3253static bool R__UpdateLibFileForLinking(
TString &lib)
3255 const char *mapfile =
nullptr;
3257 mapfile =
"/System/Library/dyld/dyld_shared_cache_x86_64.map";
3259 mapfile =
"/System/Library/dyld/dyld_shared_cache_arm64e.map";
3261 #error unsupported architecture
3263 if (std::ifstream cacheMap{mapfile}) {
3265 while (getline(cacheMap,
line)) {
3266 if (
line.find(lib) != std::string::npos) {
3278#if defined (R__LINUX) || defined (R__FBSD)
3284static int callback_for_dl_iterate_phdr(
struct dl_phdr_info *info,
size_t size,
void *
data)
3287 static std::unordered_set<
decltype(info->dlpi_addr)> sKnownLoadedLibBaseAddrs;
3289 auto newLibs =
static_cast<std::vector<std::string>*
>(
data);
3290 if (!sKnownLoadedLibBaseAddrs.count(info->dlpi_addr)) {
3292 if (info->dlpi_name && info->dlpi_name[0]
3297 && strncmp(info->dlpi_name,
"[vdso]", 6)
3301 && strncmp(info->dlpi_name,
"/libexec/ld-elf.so.1", 20)
3303 && strncmp(info->dlpi_name,
"linux-vdso.so", 13)
3304 && strncmp(info->dlpi_name,
"linux-vdso32.so", 15)
3305 && strncmp(info->dlpi_name,
"linux-vdso64.so", 15)
3306 && strncmp(info->dlpi_name,
"linux-gate.so", 13))
3307 newLibs->emplace_back(info->dlpi_name);
3308 sKnownLoadedLibBaseAddrs.insert(info->dlpi_addr);
3321#if defined(R__WIN32) || defined(__CYGWIN__)
3322 HMODULE hModules[1024];
3324 unsigned long cbModules;
3326 hProcess = (
void *)::GetCurrentProcess();
3327 ::EnumProcessModules(hProcess, hModules,
sizeof(hModules), &cbModules);
3329 for (i = 1; i < (cbModules /
sizeof(
void *)); i++) {
3330 static const int bufsize = 260;
3331 wchar_t winname[bufsize];
3332 char posixname[bufsize];
3333 ::GetModuleFileNameExW(hProcess, hModules[i], winname, bufsize);
3334#if defined(__CYGWIN__)
3335 cygwin_conv_path(CCP_WIN_W_TO_POSIX, winname, posixname, bufsize);
3337 std::wstring wpath = winname;
3338 std::replace(wpath.begin(), wpath.end(),
'\\',
'/');
3339 string path(wpath.begin(), wpath.end());
3340 strncpy(posixname, path.c_str(), bufsize);
3346#elif defined(R__MACOSX)
3350 while (
const mach_header* mh = _dyld_get_image_header(imageIndex)) {
3352 if (mh->filetype == MH_DYLIB) {
3353 if (
const char* imageName = _dyld_get_image_name(imageIndex)) {
3361#elif defined(R__LINUX) || defined(R__FBSD)
3365 std::vector<std::string> newLibs;
3366 dl_iterate_phdr(callback_for_dl_iterate_phdr, &newLibs);
3367 for (
auto &&lib: newLibs)
3370 Error(
"TCling::UpdateListOfLoadedSharedLibraries",
3371 "Platform not supported!");
3377static bool StartsWithStrLit(
const char *haystack,
const char (&needle)[
N]) {
3378 return !strncmp(haystack, needle,
N - 1);
3393 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
3394 if (!DLM->isLibraryLoaded(
filename)) {
3395 DLM->loadLibrary(
filename,
true ,
true );
3398#if defined(R__MACOSX)
3400 auto lenFilename = strlen(
filename);
3401 auto isInMacOSSystemDir = [](
const char *fn) {
3402 return StartsWithStrLit(fn,
"/usr/lib/") || StartsWithStrLit(fn,
"/System/Library/");
3404 if (!strcmp(
filename,
"cl_kernels")
3407 || StartsWithStrLit(
filename,
"/usr/lib/system/")
3408 || StartsWithStrLit(
filename,
"/usr/lib/libc++")
3409 || StartsWithStrLit(
filename,
"/System/Library/Frameworks/")
3410 || StartsWithStrLit(
filename,
"/System/Library/PrivateFrameworks/")
3411 || StartsWithStrLit(
filename,
"/System/Library/CoreServices/")
3412 || StartsWithStrLit(
filename,
"/usr/lib/libSystem")
3413 || StartsWithStrLit(
filename,
"/usr/lib/libstdc++")
3414 || StartsWithStrLit(
filename,
"/usr/lib/libicucore")
3415 || StartsWithStrLit(
filename,
"/usr/lib/libbsm")
3416 || StartsWithStrLit(
filename,
"/usr/lib/libobjc")
3417 || StartsWithStrLit(
filename,
"/usr/lib/libresolv")
3418 || StartsWithStrLit(
filename,
"/usr/lib/libauto")
3419 || StartsWithStrLit(
filename,
"/usr/lib/libcups")
3420 || StartsWithStrLit(
filename,
"/usr/lib/libDiagnosticMessagesClient")
3421 || StartsWithStrLit(
filename,
"/usr/lib/liblangid")
3422 || StartsWithStrLit(
filename,
"/usr/lib/libCRFSuite")
3423 || StartsWithStrLit(
filename,
"/usr/lib/libpam")
3424 || StartsWithStrLit(
filename,
"/usr/lib/libOpenScriptingUtil")
3425 || StartsWithStrLit(
filename,
"/usr/lib/libextension")
3426 || StartsWithStrLit(
filename,
"/usr/lib/libAudioToolboxUtility")
3427 || StartsWithStrLit(
filename,
"/usr/lib/liboah")
3428 || StartsWithStrLit(
filename,
"/usr/lib/libRosetta")
3429 || StartsWithStrLit(
filename,
"/usr/lib/libCoreEntitlements")
3430 || StartsWithStrLit(
filename,
"/usr/lib/libssl.")
3431 || StartsWithStrLit(
filename,
"/usr/lib/libcrypto.")
3437 || StartsWithStrLit(
filename,
"/usr/lib/system/libsystem_kernel")
3438 || StartsWithStrLit(
filename,
"/usr/lib/system/libsystem_platform")
3439 || StartsWithStrLit(
filename,
"/usr/lib/system/libsystem_pthread")
3444 || (lenFilename > 4 && !strcmp(
filename + lenFilename - 4,
".tbd")))
3447 R__UpdateLibFileForLinking(sFileName);
3449#elif defined(__CYGWIN__)
3451 static const int bufsize = 260;
3452 char posixwindir[bufsize];
3453 char *windir = getenv(
"WINDIR");
3455 cygwin_conv_path(CCP_WIN_A_TO_POSIX, windir, posixwindir, bufsize);
3457 snprintf(posixwindir,
sizeof(posixwindir),
"/Windows/");
3458 if (strstr(
filename, posixwindir) ||
3461#elif defined(R__WIN32)
3464#elif defined (R__LINUX)
3488 assert(!
IsFromRootCling() &&
"Trying to load library from rootcling!");
3492 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
3493 std::string canonLib = DLM->lookupLibrary(
filename);
3494 cling::DynamicLibraryManager::LoadLibResult res
3495 = cling::DynamicLibraryManager::kLoadLibNotFound;
3496 if (!canonLib.empty()) {
3498 res = DLM->loadLibrary(
filename, system,
true);
3502 cling::Interpreter::CompilationResult compRes;
3504 if (compRes == cling::Interpreter::kSuccess)
3505 res = cling::DynamicLibraryManager::kLoadLibSuccess;
3509 if (res == cling::DynamicLibraryManager::kLoadLibSuccess) {
3513 case cling::DynamicLibraryManager::kLoadLibSuccess:
return 0;
3514 case cling::DynamicLibraryManager::kLoadLibAlreadyLoaded:
return 1;
3564 Warning(
"Calc",
"waiting for cling thread to free");
3567 gROOT->SetLineIsProcessing();
3574 cling::Value valRef;
3575 cling::Interpreter::CompilationResult cr = cling::Interpreter::kFailure;
3579 catch (cling::InterpreterException&
ex)
3581 Error(
"Calc",
"%s.\n%s",
ex.what(),
"Evaluation of your expression was aborted.");
3583 cr = cling::Interpreter::kFailure;
3586 if (cr != cling::Interpreter::kSuccess) {
3594 if (!valRef.isValid()) {
3603 if (valRef.isVoid()) {
3610 gROOT->SetLineHasBeenProcessed();
3620 void (*histaddFunc)(
const char*
line))
3625#if defined(R__MUST_REVISIT)
3626#if R__MUST_REVISIT(6,2)
3627 Warning(
"SetGetline",
"Cling should support the equivalent of SetGetlineFunc(getlineFunc, histaddFunc)");
3640 if ((std::distance(T.decls_begin(), T.decls_end()) != 1)
3641 || T.deserialized_decls_begin() != T.deserialized_decls_end()
3642 || T.macros_begin() != T.macros_end()
3643 || ((!T.getFirstDecl().isNull()) && ((*T.getFirstDecl().begin()) != T.getWrapperFD()))) {
3666 std::set<TObject*>::iterator iSpecial = ((std::set<TObject*>*)
fgSetOfSpecials)->find(obj);
3684#if defined(R__MUST_REVISIT)
3685#if R__MUST_REVISIT(6,2)
3687 Warning(
"Reset",
"Cling should support the equivalent of scratch_upto(&fDictPos)");
3697#if defined(R__MUST_REVISIT)
3698#if R__MUST_REVISIT(6,2)
3700 Warning(
"ResetAll",
"Cling should support the equivalent of complete reset (unload everything but the startup decls.");
3727#if defined(R__MUST_REVISIT)
3728#if R__MUST_REVISIT(6,2)
3730 Warning(
"ResetGlobalVar",
"Cling should support the equivalent of resetglobalvar(obj)");
3742#if defined(R__MUST_REVISIT)
3743#if R__MUST_REVISIT(6,2)
3745 Warning(
"RewindDictionary",
"Cling should provide a way to revert transaction similar to rewinddictionary()");
3756#if defined(R__MUST_REVISIT)
3757#if R__MUST_REVISIT(6,2)
3759 Warning(
"DeleteGlobal",
"Cling should provide the equivalent of deleteglobal(obj), see also DeleteVariable.");
3771#if defined(R__MUST_REVISIT)
3772#if R__MUST_REVISIT(6,2)
3773 Warning(
"DeleteVariable",
"should do more that just reseting the value to zero");
3778 llvm::StringRef srName(
name);
3779 const char* unscopedName =
name;
3780 llvm::StringRef::size_type posScope = srName.rfind(
"::");
3781 const clang::DeclContext* declCtx =
nullptr;
3782 if (posScope != llvm::StringRef::npos) {
3783 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
3784 const clang::Decl* scopeDecl
3785 = lh.findScope(srName.substr(0, posScope),
3786 cling::LookupHelper::WithDiagnostics);
3788 Error(
"DeleteVariable",
"Cannot find enclosing scope for variable %s",
3792 declCtx = llvm::dyn_cast<clang::DeclContext>(scopeDecl);
3794 Error(
"DeleteVariable",
3795 "Enclosing scope for variable %s is not a declaration context",
3799 unscopedName += posScope + 2;
3803 clang::NamedDecl* nVarDecl
3804 = cling::utils::Lookup::Named(&
fInterpreter->getSema(), unscopedName, declCtx);
3806 Error(
"DeleteVariable",
"Unknown variable %s",
name);
3809 clang::VarDecl* varDecl = llvm::dyn_cast<clang::VarDecl>(nVarDecl);
3811 Error(
"DeleteVariable",
"Entity %s is not a variable",
name);
3815 clang::QualType qType = varDecl->getType();
3816 const clang::Type*
type = qType->getUnqualifiedDesugaredType();
3819 if (
type->isPointerType()) {
3820 int** ppInt = (
int**)
fInterpreter->getAddressOfGlobal(GlobalDecl(varDecl));
3822 if (ppInt) *ppInt =
nullptr;
3832#if defined(R__MUST_REVISIT)
3833#if R__MUST_REVISIT(6,2)
3835 Warning(
"SaveContext",
"Cling should provide a way to record a state watermark similar to store_dictposition(&fDictPos)");
3845#if defined(R__MUST_REVISIT)
3846#if R__MUST_REVISIT(6,2)
3848 Warning(
"SaveGlobalsContext",
"Cling should provide a way to record a watermark for the list of global variable similar to store_dictposition(&fDictPosGlobals)");
3896 std::tuple<int,double>
value;
3900 size_t offset0 = ((
char*)&(std::get<0>(
value))) - ((
char*)&
value);
3901 size_t offset1 = ((
char*)&(std::get<1>(
value))) - ((
char*)&
value);
3903 size_t ascOffset0 = ((
char*)&(asc.
_0)) - ((
char*)&asc);
3904 size_t ascOffset1 = ((
char*)&(asc.
_1)) - ((
char*)&asc);
3906 size_t desOffset0 = ((
char*)&(des.
_0)) - ((
char*)&des);
3907 size_t desOffset1 = ((
char*)&(des.
_1)) - ((
char*)&des);
3909 if (offset0 == ascOffset0 && offset1 == ascOffset1) {
3911 }
else if (offset0 == desOffset0 && offset1 == desOffset1) {
3921 std::string alternateName =
"TEmulatedTuple";
3922 alternateName.append( classname + 5 );
3924 std::string fullname =
"ROOT::Internal::" + alternateName;
3925 if (lh.findScope(fullname, cling::LookupHelper::NoDiagnostics,
3931 auto iter = tupleContent.
fElements.begin() + 1;
3932 auto theEnd = tupleContent.
fElements.end() - 1;
3933 auto deleter = [](TypeInfo_t *
type) {
3936 std::unique_ptr<TypeInfo_t,
decltype(deleter)>
type{
gInterpreter->TypeInfo_Factory(), deleter };
3937 while (iter != theEnd) {
3941 Error(
"Load",
"Could not declare alternate type for %s since %s (or one of its context) is private or protected",
3942 classname, iter->c_str());
3949 std::string guard_name;
3951 std::ostringstream guard;
3952 guard <<
"ROOT_INTERNAL_TEmulated_";
3953 guard << guard_name;
3955 std::ostringstream alternateTuple;
3956 alternateTuple <<
"#ifndef " << guard.str() <<
"\n";
3957 alternateTuple <<
"#define " << guard.str() <<
"\n";
3958 alternateTuple <<
"namespace ROOT { namespace Internal {\n";
3959 alternateTuple <<
"template <class... Types> struct TEmulatedTuple;\n";
3960 alternateTuple <<
"template <> struct " << alternateName <<
" {\n";
3965 unsigned int nMember = 0;
3966 auto iter = tupleContent.
fElements.begin() + 1;
3967 auto theEnd = tupleContent.
fElements.end() - 1;
3968 while (iter != theEnd) {
3969 alternateTuple <<
" " << *iter <<
" _" << nMember <<
";\n";
3976 unsigned int nMember = tupleContent.
fElements.size() - 3;
3977 auto iter = tupleContent.
fElements.rbegin() + 1;
3978 auto theEnd = tupleContent.
fElements.rend() - 1;
3979 while (iter != theEnd) {
3980 alternateTuple <<
" " << *iter <<
" _" << nMember <<
";\n";
3987 Fatal(
"TCling::SetClassInfo::AlternateTuple",
3988 "Layout of std::tuple on this platform is unexpected.");
3993 alternateTuple <<
"};\n";
3994 alternateTuple <<
"}}\n";
3995 alternateTuple <<
"#endif\n";
4000 Error(
"Load",
"Could not declare %s",alternateName.c_str());
4003 alternateName =
"ROOT::Internal::" + alternateName;
4004 return alternateName;
4044 auto SetWithoutClassInfoState = [](
TClass *cl)
4057 if (strncmp(cl->
GetName(),
"tuple<",strlen(
"tuple<"))==0) {
4060 if (reload ||
name.empty()) {
4062 SetWithoutClassInfoState(cl);
4074 SetWithoutClassInfoState(cl);
4091 zombieCandidate =
kTRUE;
4098 zombieCandidate =
kTRUE;
4151 static const char *anonEnum =
"anonymous enum ";
4152 static const int cmplen = strlen(anonEnum);
4179 const char *classname =
name;
4182 class MaybeSuspendAutoLoadParse {
4183 int fStoreAutoLoad = 0;
4184 int fStoreAutoParse = 0;
4185 bool fSuspendedAutoParse =
false;
4187 MaybeSuspendAutoLoadParse(
int autoload) {
4188 fStoreAutoLoad = ((
TCling*)
gCling)->SetClassAutoLoading(autoload);
4192 fSuspendedAutoParse =
true;
4193 fStoreAutoParse = ((
TCling*)
gCling)->SetSuspendAutoParsing(
true);
4196 ~MaybeSuspendAutoLoadParse() {
4197 if (fSuspendedAutoParse)
4198 ((
TCling*)
gCling)->SetSuspendAutoParsing(fStoreAutoParse);
4199 ((
TCling*)
gCling)->SetClassAutoLoading(fStoreAutoLoad);
4203 MaybeSuspendAutoLoadParse autoLoadParseRAII( autoload );
4205 autoLoadParseRAII.SuspendAutoParsing();
4214 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
4215 const clang::Type *
type =
nullptr;
4216 const clang::Decl *decl
4217 = lh.findScope(classname,
4218 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
4219 : cling::LookupHelper::NoDiagnostics,
4223 decl = lh.findScope(buf,
4224 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
4225 : cling::LookupHelper::NoDiagnostics,
4242 clang::ClassTemplateSpecializationDecl *tmpltDecl =
4243 llvm::dyn_cast_or_null<clang::ClassTemplateSpecializationDecl>
4244 (
type->getAsCXXRecordDecl());
4245 if (tmpltDecl && !tmpltDecl->getPointOfInstantiation().isValid()) {
4262 if (tci.
Property() & propertiesMask) {
4263 bool hasClassDefInline =
false;
4264 if (isClassOrNamespaceOnly) {
4270 if (hasDictionary.IsValid() && implLineFunc.IsValid()) {
4272 bool success =
false;
4273 std::tie(success, lineNumber) =
4275 hasClassDefInline = success && (lineNumber == -1);
4283 if (hasClassDefInline)
4322 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
4325 const clang::Decl *decl
4326 = lh.findClassTemplate(
name,
4327 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
4328 : cling::LookupHelper::NoDiagnostics);
4330 std::string strname =
"std::";
4332 decl = lh.findClassTemplate(strname,
4333 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
4334 : cling::LookupHelper::NoDiagnostics);
4336 return nullptr != decl;
4360 cl->
fBase = listOfBase;
4376 D =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
4379 if (
const clang::DeclContext* DC = dyn_cast<clang::DeclContext>(D)) {
4382 llvm::SmallVector< DeclContext *, 4> allDeclContexts;
4383 const_cast< clang::DeclContext *
>(DC)->collectAllContexts(allDeclContexts);
4384 for (llvm::SmallVector<DeclContext*, 4>::iterator declIter = allDeclContexts.begin(), declEnd = allDeclContexts.end();
4385 declIter != declEnd; ++declIter) {
4387 for (clang::DeclContext::decl_iterator DI = (*declIter)->decls_begin(),
4388 DE = (*declIter)->decls_end(); DI != DE; ++DI) {
4389 if (
const clang::EnumDecl* ED = dyn_cast<clang::EnumDecl>(*DI)) {
4392 PrintingPolicy Policy(ED->getASTContext().getPrintingPolicy());
4393 llvm::raw_string_ostream stream(buf);
4395 Policy.AnonymousTagLocations =
false;
4396 ED->getNameForDiagnostic(stream, Policy,
false);
4400 const char*
name = buf.c_str();
4424 D =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
4428 if (
const clang::DeclContext* DC = dyn_cast<clang::DeclContext>(D)) {
4431 llvm::SmallVector< DeclContext *, 4> allDeclContexts;
4432 const_cast< clang::DeclContext *
>(DC)->collectAllContexts(allDeclContexts);
4433 for (llvm::SmallVector<DeclContext*, 4>::iterator declIter = allDeclContexts.begin(),
4434 declEnd = allDeclContexts.end(); declIter != declEnd; ++declIter) {
4436 for (clang::DeclContext::decl_iterator DI = (*declIter)->decls_begin(),
4437 DE = (*declIter)->decls_end(); DI != DE; ++DI) {
4438 if (
const clang::FunctionTemplateDecl* FTD = dyn_cast<clang::FunctionTemplateDecl>(*DI)) {
4439 funcTempList->
Get(FTD);
4497 if (
m->fMethodArgs) {
4508 m->fMethodArgs = arglist;
4553 if (llvm::isa<clang::NamespaceDecl>(cli->
GetDecl())) {
4562 Error(
"GenerateTClass",
4563 "Cannot find %s::Class_Version()! Class version might be wrong.",
4570 if (newvers == -1) {
4578 newvers = callfunc.
ExecInt(
nullptr);
4580 Error(
"GenerateTClass",
4581 "Cannot invoke %s::Class_Version()! Class version might be wrong.",
4585 if (newvers != oldvers) {
4602static void GenerateTClass_GatherInnerIncludes(cling::Interpreter *interp,
TString &includes,
TClingClassInfo *info)
4606 const clang::ClassTemplateSpecializationDecl *templateCl
4607 = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(info->
GetDecl());
4609 for(
unsigned int i=0; i < templateCl->getTemplateArgs().
size(); ++i) {
4610 const clang::TemplateArgument &arg( templateCl->getTemplateArgs().get(i) );
4611 if (arg.getKind() == clang::TemplateArgument::Type) {
4614 if (!uType->isFundamentalType() && !uType->isEnumeralType()) {
4616 const clang::CXXRecordDecl *argdecl = uType->getAsCXXRecordDecl();
4619 TClingClassInfo subinfo(interp,*(argdecl->getASTContext().getRecordType(argdecl).getTypePtr()));
4620 GenerateTClass_GatherInnerIncludes(interp, includes, &subinfo);
4623 llvm::raw_string_ostream OS(Result);
4624 arg.print(argdecl->getASTContext().getPrintingPolicy(),OS);
4625 Warning(
"TCling::GenerateTClass",
"Missing header file for %s",OS.str().c_str());
4640 if (!info || !info->
IsValid()) {
4641 Fatal(
"GenerateTClass",
"Requires a valid ClassInfo object");
4646 std::string classname;
4650 Info(
"GenerateTClass",
"Will (try to) generate the compiled TClass for %s.",classname.c_str());
4654 GenerateTClass_GatherInnerIncludes(
fInterpreter,includes,info);
4660 Error(
"GenerateTClass",
"Even though the dictionary generation for %s seemed successful we can't find the TClass bootstrap!",classname.c_str());
4664 if (cl ==
nullptr) {
4666 cl =
new TClass(classinfo, version,
nullptr,
nullptr, -1, -1, silent);
4671 cl =
new TClass(classinfo, 1,
nullptr,
nullptr, -1, -1, silent);
4696 if (classes ==
nullptr || classes[0] == 0) {
4697 Error(
"TCling::GenerateDictionary",
"Cannot generate dictionary without passing classes.");
4701 std::vector<std::string> listClasses;
4703 const char* current = classes, *prev = classes;
4707 if (*current ==
';') {
4708 listClasses.push_back(std::string(prev, current - prev));
4711 else if (*(current + 1) == 0) {
4712 listClasses.push_back(std::string(prev, current + 1 - prev));
4716 std::vector<std::string> listIncludes;
4720 const char* current = includes, *prev = includes;
4724 if (*current ==
';') {
4725 listIncludes.push_back(std::string(prev, current - prev));
4728 else if (*(current + 1) == 0) {
4729 listIncludes.push_back(std::string(prev, current + 1 - prev));
4735 std::vector<std::string>(), std::vector<std::string>());
4759 if (
const ValueDecl* decl = (
const ValueDecl*)
d){
4762 if (hasIoName && ioName !=
name)
return nullptr;
4774 using namespace clang;
4776 DeclarationName DName = &SemaR.Context.Idents.get(
name);
4778 LookupResult
R(SemaR, DName, SourceLocation(), Sema::LookupOrdinaryName,
4779 Sema::ForExternalRedeclaration);
4781 cling::utils::Lookup::Named(&SemaR,
R);
4783 LookupResult::Filter
F =
R.makeFilter();
4785 while (
F.hasNext()) {
4786 NamedDecl *D =
F.next();
4787 if (isa<VarDecl>(D) || isa<FieldDecl>(D) || isa<EnumConstantDecl>(D) ||
4788 isa<IndirectFieldDecl>(D))
4794 if (
R.isSingleResult())
4795 return R.getFoundDecl();
4807 const clang::Decl* possibleEnum =
nullptr;
4812 const clang::DeclContext* dc =
nullptr;
4813 if (
const clang::Decl* D = cci->
GetDecl()) {
4814 if (!(dc = dyn_cast<clang::NamespaceDecl>(D))) {
4815 dc = dyn_cast<clang::RecordDecl>(D);
4822 possibleEnum = cling::utils::Lookup::Tag(&
fInterpreter->getSema(),
name, dc);
4824 Error(
"TCling::GetEnum",
"DeclContext not found for %s .\n",
name);
4833 if (possibleEnum && (possibleEnum != (clang::Decl*)-1)
4834 && isa<clang::EnumDecl>(possibleEnum)) {
4835 return possibleEnum;
4845 if (!gv)
return nullptr;
4847 llvm::StringRef mangled_name = gv->getName();
4862 std::string scopename(demangled_name_c);
4863 free(demangled_name_c);
4869 std::string dataname;
4871 if (!strncmp(scopename.c_str(),
"typeinfo for ",
sizeof(
"typeinfo for ")-1)) {
4872 scopename.erase(0,
sizeof(
"typeinfo for ")-1);
4873 }
else if (!strncmp(scopename.c_str(),
"vtable for ",
sizeof(
"vtable for ")-1)) {
4874 scopename.erase(0,
sizeof(
"vtable for ")-1);
4877 std::string::size_type pos = scopename.rfind(
'(');
4878 if (pos != std::string::npos) {
4882 pos = scopename.rfind(
':');
4883 if (pos != std::string::npos) {
4884 if ((pos != 0) && (scopename[pos-1] ==
':')) {
4885 dataname = scopename.substr(pos+1);
4886 scopename.erase(pos-1);
4890 dataname = scopename;
4898 if (scopename.size()) {
4914 Error(
"GetDataMemberWithValue()",
"not implemented");
4924 Error(
"GetDataMemberAtAddr()",
"not implemented");
4934 const char* params,
Bool_t objectIsConst )
4952 return mangled_name;
4967 GetMethod(method,
proto, objectIsConst,
nullptr ,
mode).GetMangledName();
4979 const char* params,
Bool_t objectIsConst )
5020 std::vector<DeclId_t>& res)
const
5023 clang::ASTContext& Ctx = S.Context;
5024 const clang::Decl* CtxDecl
5026 Ctx.getTranslationUnitDecl();
5027 auto RecDecl = llvm::dyn_cast<const clang::RecordDecl>(CtxDecl);
5028 const clang::DeclContext* DeclCtx = RecDecl;
5031 DeclCtx = dyn_cast<clang::NamespaceDecl>(CtxDecl);
5032 if (!DeclCtx)
return;
5034 clang::DeclarationName DName;
5039 if (RecDecl->getNameAsString() == funcname) {
5040 clang::QualType QT = Ctx.getTypeDeclType(RecDecl);
5041 DName = Ctx.DeclarationNames.getCXXConstructorName(Ctx.getCanonicalType(QT));
5042 }
else if (funcname[0] ==
'~' && RecDecl->getNameAsString() == funcname + 1) {
5043 clang::QualType QT = Ctx.getTypeDeclType(RecDecl);
5044 DName = Ctx.DeclarationNames.getCXXDestructorName(Ctx.getCanonicalType(QT));
5046 DName = &Ctx.Idents.get(funcname);
5049 DName = &Ctx.Idents.get(funcname);
5053 clang::LookupResult
R(S, DName, clang::SourceLocation(),
5054 Sema::LookupOrdinaryName, clang::Sema::NotForRedeclaration);
5055 R.suppressDiagnostics();
5056 S.LookupQualifiedName(
R,
const_cast<DeclContext*
>(DeclCtx));
5057 if (
R.empty())
return;
5059 res.reserve(res.size() + (
R.end() -
R.begin()));
5060 for (clang::LookupResult::iterator IR =
R.begin(), ER =
R.end();
5062 if (
const clang::FunctionDecl* FD
5063 = llvm::dyn_cast<const clang::FunctionDecl>(*IR)) {
5064 if (!FD->getDescribedFunctionTemplate()) {
5067 }
else if (
const auto *USD = llvm::dyn_cast<const clang::UsingShadowDecl>(*IR)) {
5069 if (llvm::isa<clang::FunctionDecl>(USD->getTargetDecl())) {
5090 GetMethod(method,
proto, objectIsConst,
nullptr ,
mode).InterfaceMethod();
5229 const char* params,
Bool_t objectIsConst,
int* error)
5249 const char* params,
int* error)
5251 Execute(obj,cl,method,params,
false,error);
5266 Error(
"Execute",
"No method was defined");
5275 if (argc > nparms) {
5276 Error(
"Execute",
"Too many parameters to call %s, got %d but expected at most %d.",method->
GetName(),argc,nparms);
5279 if (nparms != argc) {
5289 Int_t firstDefault = -1;
5290 for (
Int_t i = 0; i < nparms; i ++) {
5297 if (firstDefault >= 0) {
5298 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);
5300 Error(
"Execute",
"Too few arguments to call %s, got only %d but expected %d.",method->
GetName(),argc,nparms);
5306 const char* listpar =
"";
5311 for (
Int_t i = 0; i < argc; i ++) {
5320 chpar += (nxtpar->
String()).ReplaceAll(
"\"",
"\\\"");
5327 complete += nxtpar->
String();
5330 listpar = complete.
Data();
5357 const void* args[] ,
5362 Error(
"ExecuteWithArgsAndReturn",
"No method was defined");
5389 Warning(
"GetTopLevelMacroName",
"Must change return type!");
5436#if defined(R__MUST_REVISIT)
5437#if R__MUST_REVISIT(6,0)
5438 Warning(
"GetCurrentMacroName",
"Must change return type!");
5451 TTHREAD_TLS_DECL(std::string,t);
5453 if (!strstr(typeDesc,
"(*)(")) {
5454 const char *s = strchr(typeDesc,
' ');
5455 const char *template_start = strchr(typeDesc,
'<');
5456 if (!strcmp(typeDesc,
"long long")) {
5459 else if (!strncmp(typeDesc,
"unsigned ", s + 1 - typeDesc)) {
5466 else if (s && (template_start ==
nullptr || (s < template_start))) {
5476 auto l = t.length();
5477 while (
l > 0 && (t[
l - 1] ==
'*' || t[
l - 1] ==
'&'))
5485 assert(rootmapfile && *rootmapfile);
5487 llvm::StringRef libName = llvm::sys::path::filename(rootmapfile);
5488 libName.consume_back(
".rootmap");
5490 return !
gInterpreter->HasPCMForLibrary(libName.str().c_str());
5501 if (!(rootmapfile && *rootmapfile))
5508 const std::map<char, unsigned int> keyLenMap = {{
'c',6},{
'n',10},{
't',8},{
'h',7},{
'e',5},{
'v',4}};
5510 std::string rootmapfileNoBackslash(rootmapfile);
5512 std::replace(rootmapfileNoBackslash.begin(), rootmapfileNoBackslash.end(),
'\\',
'/');
5519 std::string lineDirective = std::string(
"\n#line 2 \"Forward declarations from ") + rootmapfileNoBackslash +
"\"\n";
5521 std::ifstream
file(rootmapfileNoBackslash);
5524 std::string lib_name;
5526 bool newFormat =
false;
5527 while (getline(
file,
line,
'\n')) {
5528 if (!newFormat && (
line.compare(0, 8,
"Library.") == 0 ||
line.compare(0, 8,
"Declare.") == 0)) {
5534 if (
line.compare(0, 9,
"{ decls }") == 0) {
5537 while (getline(
file,
line,
'\n')) {
5540 if (!uniqueString) {
5541 Error(
"ReadRootmapFile",
"Cannot handle \"{ decls }\" sections in custom rootmap file %s",
5542 rootmapfileNoBackslash.c_str());
5545 if (!lineDirective.empty())
5546 uniqueString->
Append(lineDirective);
5550 const char firstChar =
line[0];
5551 if (firstChar ==
'[') {
5553 auto brpos =
line.find(
']');
5554 if (brpos == string::npos)
5556 lib_name =
line.substr(1, brpos - 1);
5558 lib_name.erase(lib_name.find_last_not_of(
' ') + 1);
5559 lib_name.erase(0, lib_name.find_first_not_of(
' '));
5561 TString lib_nameTstr(lib_name.c_str());
5566 Info(
"ReadRootmapFile",
"%s: New section for %s", rootmapfile, lib_nameTstr.
Data());
5568 Info(
"ReadRootmapFile",
"%s: Section for %s (library does not exist)", rootmapfile, lib_nameTstr.
Data());
5574 auto keyLenIt = keyLenMap.find(firstChar);
5575 if (keyLenIt == keyLenMap.end())
5577 unsigned int keyLen = keyLenIt->second;
5579 const char *keyname =
line.c_str() + keyLen;
5581 Info(
"ReadRootmapFile",
"%s: class %s in %s", rootmapfile, keyname, lib_name.c_str());
5584 if (lib_name != isThere->
GetValue()) {
5585 if (firstChar ==
'n') {
5587 Info(
"ReadRootmapFile",
5588 "While processing %s, namespace %s was found to be associated to %s although it is already "
5590 rootmapfile, keyname, lib_name.c_str(), isThere->
GetValue());
5591 }
else if (firstChar ==
'h') {
5597 "While processing %s, %s %s was found to be associated to %s although it is already "
5599 rootmapfile,
line.substr(0, keyLen - 1).c_str(), keyname, lib_name.c_str(),
5604 Info(
"ReadRootmapFile",
"While processing %s, key %s was found to be already defined for %s",
5605 rootmapfile, keyname, lib_name.c_str());
5666 using namespace clang;
5668 class ExtVisibleStorageAdder:
public RecursiveASTVisitor<ExtVisibleStorageAdder>{
5674 ExtVisibleStorageAdder(std::unordered_set<const NamespaceDecl*>& nsSet): fNSSet(nsSet) {};
5675 bool VisitNamespaceDecl(NamespaceDecl* nsDecl) {
5680 nsDecl->setHasExternalVisibleStorage();
5681 fNSSet.insert(nsDecl);
5684 bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl* specDecl) {
5687 if (specDecl->getTemplateSpecializationKind() == TSK_ExplicitSpecialization)
5689 specDecl->setHasExternalLexicalStorage();
5701 std::unordered_set<const NamespaceDecl*>& fNSSet;
5748 for (
Int_t j = 0; j < i; j++) {
5759 Info(
"LoadLibraryMap",
"%s",
d.Data());
5764 if (
f.EndsWith(
".rootmap")) {
5770 Info(
"LoadLibraryMap",
" rootmap file: %s",
p.Data());
5788 if (
f.BeginsWith(
"rootmap")) {
5793 Warning(
"LoadLibraryMap",
"please rename %s to end with \".rootmap\"",
p.Data());
5806 if (rootmapfile && *rootmapfile) {
5813 else if (res == -3) {
5823 while ((rec = (
TEnvRec*) next())) {
5825 if (!strncmp(cls.
Data(),
"Library.", 8) && cls.
Length() > 8) {
5827 TString libs = rec->GetValue();
5844 Info(
"LoadLibraryMap",
"class %s in %s", cls.
Data(), wlib);
5847 Info(
"LoadLibraryMap",
"class %s in %s (library does not exist)", cls.
Data(), lib);
5853 else if (!strncmp(cls.
Data(),
"Declare.", 8) && cls.
Length() > 8) {
5863 cling::Transaction* T =
nullptr;
5865 assert(cling::Interpreter::kSuccess == compRes &&
"A declaration in a rootmap could not be compiled");
5867 if (compRes!=cling::Interpreter::kSuccess){
5869 "Problems in %s declaring '%s' were encountered.", rootmapfile, uniqueString.
Data()) ;
5874 for (
auto declIt = T->decls_begin(); declIt < T->decls_end(); ++declIt) {
5875 if (declIt->m_DGR.isSingleDecl()) {
5876 if (Decl* D = declIt->m_DGR.getSingleDecl()) {
5877 if (clang::isa<TagDecl>(D) || clang::isa<NamespaceDecl>(D)) {
5878 evsAdder.TraverseDecl(D);
5913 for (
Int_t ilib = 0; ilib < nrSharedLibs; ilib++) {
5920 TString rootMapBaseStr = sharedLibBaseStr;
5921 if (sharedLibBaseStr.
EndsWith(
".dll")) {
5924 else if (sharedLibBaseStr.
EndsWith(
".DLL")) {
5927 else if (sharedLibBaseStr.
EndsWith(
".so")) {
5930 else if (sharedLibBaseStr.
EndsWith(
".sl")) {
5933 else if (sharedLibBaseStr.
EndsWith(
".dl")) {
5936 else if (sharedLibBaseStr.
EndsWith(
".a")) {
5940 Error(
"ReloadAllSharedLibraryMaps",
"Unknown library type %s", sharedLibBaseStr.
Data());
5944 rootMapBaseStr +=
".rootmap";
5947 Error(
"ReloadAllSharedLibraryMaps",
"Could not find rootmap %s in path", rootMapBaseStr.
Data());
5954 Error(
"ReloadAllSharedLibraryMaps",
"Error loading map %s", rootMap);
5989 if (!
fMapfile || !library || !*library) {
6002 while ((rec = (
TEnvRec *) next())) {
6006 TString libs = rec->GetValue();
6013 if (!strncmp(cls.
Data(),
"Library.", 8) && cls.
Length() > 8) {
6022 if (!strncmp(lib, libname.
Data(),
len)) {
6024 Error(
"UnloadLibraryMap",
"entry for <%s, %s> not found in library map table", cls.
Data(), lib);
6032 TString library_rootmap(library);
6033 if (!library_rootmap.
EndsWith(
".rootmap"))
6034 library_rootmap.
Append(
".rootmap");
6085 if (err)
return nullptr;
6087 free(demangled_name);
6105 std::string demangled_name(demangled_name_c);
6106 free(demangled_name_c);
6138 if (
gROOT->LoadClass(cls, deplib) == 0) {
6141 "loaded dependent library %s for %s", deplib, cls);
6146 "failure loading dependent library %s for %s",
6151 if (lib && lib[0]) {
6152 if (
gROOT->LoadClass(cls, lib) == 0) {
6155 "loaded library %s for %s", lib, cls);
6161 "failure loading library %s for %s", lib, cls);
6176 bool nameIsNormalized)
6182 if (!visited.insert(std::string(cls)).second)
6192 for (
auto element :
proto->GetData()) {
6193 if (element->IsBasic())
6195 const char *subtypename = element->GetTypeName();
6211 if (classinfo &&
gInterpreter->ClassInfo_IsValid(classinfo)
6215 while (
gInterpreter->DataMemberInfo_Next(memberinfo)) {
6248 Info(
"TCling::AutoLoad",
"Explicitly disabled (the class name is %s)", cls);
6268 Info(
"TCling::AutoLoad",
6269 "Trying to autoload for %s", cls);
6274 Info(
"TCling::AutoLoad",
6275 "Disabled due to gROOT or gInterpreter being invalid/not ready (the class name is %s)", cls);
6296 std::unordered_set<std::string> visited;
6305 cling::Interpreter *interpreter)
6307 std::string code = gNonInterpreterClassDef ;
6314 code += (
"#include \"");
6318 code += (
"#ifdef __ROOTCLING__\n"
6319 "#undef __ROOTCLING__\n"
6320 + gInterpreterClassDef +
6323 cling::Interpreter::CompilationResult cr;
6329 Sema &SemaR = interpreter->getSema();
6331 clangDiagSuppr diagSuppr(SemaR.getDiagnostics());
6333 #if defined(R__MUST_REVISIT)
6334 #if R__MUST_REVISIT(6,2)
6335 Warning(
"TCling::RegisterModule",
"Diagnostics suppression should be gone by now.");
6339 cr = interpreter->parseForModule(code);
6357 Int_t nHheadersParsed = 0;
6358 unsigned long offset = 0;
6359 if (strncmp(cls,
"const ", 6) == 0) {
6364 bool skipFirstEntry =
false;
6365 std::vector<std::string> autoparseKeys;
6366 if (strchr(cls,
'<')) {
6372 if (!autoparseKeys.empty() && !autoparseKeys[0].empty()) {
6377 TString templateName(autoparseKeys[0]);
6378 auto tokens = templateName.
Tokenize(
"::");
6379 clang::NamedDecl* previousScopeAsNamedDecl =
nullptr;
6380 clang::DeclContext* previousScopeAsContext =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
6382 previousScopeAsContext =
fInterpreter->getSema().getStdNamespace();
6384 for (
Int_t tk = 0; tk < nTokens; ++tk) {
6385 auto scopeObj = tokens->UncheckedAt(tk);
6386 auto scopeName = ((
TObjString*) scopeObj)->String().Data();
6387 previousScopeAsNamedDecl = cling::utils::Lookup::Named(&
fInterpreter->getSema(), scopeName, previousScopeAsContext);
6389 if ((clang::NamedDecl*)-1 == previousScopeAsNamedDecl)
break;
6390 previousScopeAsContext = llvm::dyn_cast_or_null<clang::DeclContext>(previousScopeAsNamedDecl);
6391 if (!previousScopeAsContext)
break;
6395 if ((clang::NamedDecl*)-1 != previousScopeAsNamedDecl) {
6396 if (
auto templateDecl = llvm::dyn_cast_or_null<clang::ClassTemplateDecl>(previousScopeAsNamedDecl)) {
6397 if (
auto templatedDecl = templateDecl->getTemplatedDecl()) {
6398 skipFirstEntry = templatedDecl->hasDefinition();
6405 if (topLevel) autoparseKeys.emplace_back(cls);
6407 for (
const auto & apKeyStr : autoparseKeys) {
6408 if (skipFirstEntry) {
6409 skipFirstEntry=
false;
6412 if (apKeyStr.empty())
continue;
6413 const char *apKey = apKeyStr.c_str();
6417 Info(
"TCling::AutoParse",
6418 "Starting autoparse for %s\n", apKey);
6423 const cling::Transaction *T =
fInterpreter->getCurrentTransaction();
6425 auto const &hNamesPtrs = iter->second;
6427 Info(
"TCling::AutoParse",
6428 "We can proceed for %s. We have %s headers.", apKey, std::to_string(hNamesPtrs.size()).c_str());
6430 for (
auto & hName : hNamesPtrs) {
6432 if (0 !=
fPayloads.count(normNameHash)) {
6433 float initRSSval=0.f, initVSIZEval=0.f;
6435 (void) initVSIZEval;
6438 "Parsing full payload for %s", apKey);
6445 if (cRes != cling::Interpreter::kSuccess) {
6446 if (hName[0] ==
'\n')
6447 Error(
"AutoParse",
"Error parsing payload code for class %s with content:\n%s", apKey, hName);
6456 Info(
"Autoparse",
">>> RSS key %s - before %.3f MB - after %.3f MB - delta %.3f MB", apKey, initRSSval, endRSSval, endRSSval-initRSSval);
6457 Info(
"Autoparse",
">>> VSIZE key %s - before %.3f MB - after %.3f MB - delta %.3f MB", apKey, initVSIZEval, endVSIZEval, endVSIZEval-initVSIZEval);
6463 "Parsing single header %s", hName);
6466 if (cRes != cling::Interpreter::kSuccess) {
6467 Error(
"AutoParse",
"Error parsing headerfile %s for class %s.", hName, apKey);
6479 if (strchr(apKey,
'<')) {
6486 return nHheadersParsed;
6496 if (llvm::StringRef(cls).contains(
"(lambda)"))
6510 Info(
"TCling::AutoParse",
6511 "Trying to autoparse for %s", cls);
6533 return nHheadersParsed > 0 ? 1 : 0;
6541 StringRef errMsg(errmessage);
6542 if (errMsg.contains(
"undefined symbol: ")) {
6544 std::string mangled_name = std::string(errMsg.split(
"undefined symbol: ").second);
6545 void* res = ((
TCling*)
gCling)->LazyFunctionCreatorAutoload(mangled_name);
6546 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
6547 if (res && DLM && (DLM->loadLibrary(libStem, permanent, resolved) == cling::DynamicLibraryManager::kLoadLibSuccess))
6566 if (
void* Addr = llvm::sys::DynamicLibrary::SearchForAddressOfSymbol(dlsym_mangled_name))
6569 const cling::DynamicLibraryManager &DLM = *
GetInterpreterImpl()->getDynamicLibraryManager();
6572 auto LibLoader = [](
const std::string& LibName) ->
bool {
6573 if (
gSystem->
Load(LibName.c_str(),
"",
false) < 0) {
6574 ::Error(
"TCling__LazyFunctionCreatorAutoloadForModule",
6575 "Failed to load library %s", LibName.c_str());
6581 std::string libName = DLM.searchLibrariesForSymbol(mangled_name,
6584 assert(!llvm::StringRef(libName).startswith(
"libNew") &&
6585 "We must not resolve symbols from libNew!");
6587 if (libName.empty())
6590 if (!LibLoader(libName))
6593 return llvm::sys::DynamicLibrary::SearchForAddressOfSymbol(dlsym_mangled_name);
6613 const NamedDecl *oldDef = llvm::dyn_cast_or_null<NamedDecl>(cci->
GetDecl());
6614 if (!oldDef || (def && def != oldDef)) {
6628 if (!alias && def !=
nullptr)
6650 const TagDecl *td = dyn_cast<TagDecl>(ND);
6651 const NamespaceDecl *ns = dyn_cast<NamespaceDecl>(ND);
6652 const NamedDecl *canon =
nullptr;
6655 TagDecl* tdDef =
nullptr;
6657 canon = tdDef = td->getDefinition();
6661 if (!tdDef->isCompleteDefinition() || llvm::isa<clang::FunctionDecl>(tdDef->getDeclContext())) {
6667 auto declName = tdDef->getNameAsString();
6678 clang::QualType
type(tdDef->getTypeForDecl(), 0);
6681 canon = ns->getCanonicalDecl();
6682 name = ND->getQualifiedNameAsString();
6684 name = ND->getQualifiedNameAsString();
6733 std::set<TClass*> modifiedTClasses;
6738 bool isTUTransaction =
false;
6739 if (!T.empty() && T.decls_begin() + 1 == T.decls_end() && !T.hasNestedTransactions()) {
6740 clang::Decl* FirstDecl = *(T.decls_begin()->m_DGR.begin());
6741 if (llvm::isa<clang::TranslationUnitDecl>(FirstDecl)) {
6744 isTUTransaction =
true;
6748 std::set<const void*> TransactionDeclSet;
6749 if (!isTUTransaction && T.decls_end() - T.decls_begin()) {
6750 const clang::Decl* WrapperFD = T.getWrapperFD();
6751 for (cling::Transaction::const_iterator
I = T.decls_begin(), E = T.decls_end();
6753 if (
I->m_Call != cling::Transaction::kCCIHandleTopLevelDecl
6754 &&
I->m_Call != cling::Transaction::kCCIHandleTagDeclDefinition)
6757 for (DeclGroupRef::const_iterator DI =
I->m_DGR.begin(),
6758 DE =
I->m_DGR.end(); DI != DE; ++DI) {
6759 if (*DI == WrapperFD)
6761 TransactionDeclSet.insert(*DI);
6762 ((
TCling*)
gCling)->HandleNewDecl(*DI,
false, modifiedTClasses);
6769 for (cling::Transaction::const_iterator
I = T.deserialized_decls_begin(),
6770 E = T.deserialized_decls_end();
I != E; ++
I) {
6771 for (DeclGroupRef::const_iterator DI =
I->m_DGR.begin(),
6772 DE =
I->m_DGR.end(); DI != DE; ++DI)
6773 if (TransactionDeclSet.find(*DI) == TransactionDeclSet.end()) {
6789 std::vector<TClass*> modifiedTClassesDiff(modifiedTClasses.size());
6790 std::vector<TClass*>::iterator it;
6791 it = set_difference(modifiedTClasses.begin(), modifiedTClasses.end(),
6794 modifiedTClassesDiff.begin());
6795 modifiedTClassesDiff.resize(it - modifiedTClassesDiff.begin());
6798 ((
TCling*)
gCling)->GetModTClasses().insert(modifiedTClassesDiff.begin(),
6799 modifiedTClassesDiff.end());
6800 for (std::vector<TClass*>::const_iterator
I = modifiedTClassesDiff.begin(),
6801 E = modifiedTClassesDiff.end();
I != E; ++
I) {
6803 if (!
gROOT->GetListOfClasses()->FindObject(*
I)) {
6825 cling::Transaction::const_nested_iterator iNested = T.nested_begin();
6826 for (cling::Transaction::const_iterator
I = T.decls_begin(), E = T.decls_end();
6828 if (
I->m_Call == cling::Transaction::kCCIHandleVTable)
6830 if (
I->m_Call == cling::Transaction::kCCINone) {
6836 for (
auto &D :
I->m_DGR)
6862 if (D->isFromASTFile())
6870 if (isa<VarDecl>(D) || isa<FieldDecl>(D) || isa<EnumConstantDecl>(D)) {
6876 }
else if (isa<FunctionDecl>(D)) {
6878 }
else if (isa<FunctionTemplateDecl>(D)) {
6880 }
else if (isa<EnumDecl>(D)) {
6891 }
else if (isa<RecordDecl>(D) || isa<NamespaceDecl>(D)) {
6892 if (isa<RecordDecl>(D) && !cast<RecordDecl>(D)->isCompleteDefinition())
6895 std::vector<TClass *> Classes;
6898 for (
auto &C : Classes) {
6903 for (
auto &
I : cast<DeclContext>(D)->decls())
6907 if (D->getKind() != Decl::Namespace
6908 || cast<NamespaceDecl>(D)->isOriginalNamespace())
6909 C->ResetClassInfo();
6921 std::size_t normNameHash = triter->second;
6927 auto const &hNamesPtrs = iter->second;
6928 for (
auto &hName : hNamesPtrs) {
6930 Info(
"TransactionRollback",
6931 "Restoring ability to autoaparse: %s", hName);
6968 using namespace clang;
6969 if (
const Decl *D = LH.findScope(cls, cling::LookupHelper::NoDiagnostics,
6971 if (!D->isFromASTFile()) {
6973 Warning(
"GetClassSharedLibsForModule",
"Decl found for %s is not part of a module", cls);
6976 class ModuleCollector :
public ConstDeclVisitor<ModuleCollector> {
6977 llvm::DenseSet<Module *> &m_TopLevelModules;
6980 ModuleCollector(llvm::DenseSet<Module *> &TopLevelModules) : m_TopLevelModules(TopLevelModules) {}
6981 void Collect(
const Decl *D) { Visit(D); }
6983 void VisitDecl(
const Decl *D)
6993 if (!D->hasOwningModule())
6995 if (Module *M = D->getOwningModule()->getTopLevelModule())
6996 m_TopLevelModules.insert(M);
6999 void VisitTemplateArgument(
const TemplateArgument &
TA)
7001 switch (
TA.getKind()) {
7002 case TemplateArgument::Null:
7003 case TemplateArgument::Integral:
7004 case TemplateArgument::Pack:
7005 case TemplateArgument::NullPtr:
7006 case TemplateArgument::Expression:
7007 case TemplateArgument::Template:
7008 case TemplateArgument::TemplateExpansion:
return;
7009 case TemplateArgument::Type:
7010 if (
const TagType *TagTy = dyn_cast<TagType>(
TA.getAsType()))
7011 return Visit(TagTy->getDecl());
7013 case TemplateArgument::Declaration:
return Visit(
TA.getAsDecl());
7015 llvm_unreachable(
"Invalid TemplateArgument::Kind!");
7018 void VisitClassTemplateSpecializationDecl(
const ClassTemplateSpecializationDecl *CTSD)
7020 if (CTSD->getOwningModule())
7023 VisitDecl(CTSD->getSpecializedTemplate());
7024 const TemplateArgumentList &ArgList = CTSD->getTemplateArgs();
7025 for (
const TemplateArgument *Arg = ArgList.data(), *ArgEnd = Arg + ArgList.size(); Arg != ArgEnd; ++Arg) {
7026 VisitTemplateArgument(*Arg);
7031 llvm::DenseSet<Module *> TopLevelModules;
7032 ModuleCollector
m(TopLevelModules);
7035 for (
auto M : TopLevelModules) {
7038 if (!M->LinkLibraries.size())
7041 if (M->Name ==
"Core")
7043 assert(M->LinkLibraries.size() == 1);
7046 result += M->LinkLibraries[0].Library;
7067 llvm::StringRef className = cls;
7073 if (className.contains(
"(lambda)"))
7077 cling::LookupHelper &LH =
fInterpreter->getLookupHelper();
7079 if (!libs.empty()) {
7085 if (!cls || !*cls) {
7090 TEnvRec* libs_record =
nullptr;
7093 const char* libs = libs_record->
GetValue();
7094 return (*libs) ? libs :
nullptr;
7108 TEnvRec* libs_record =
nullptr;
7111 const char* libs = libs_record->
GetValue();
7112 return (*libs) ? libs :
nullptr;
7126 cling::Interpreter *interp,
7127 bool skipLoadedLibs =
true)
7130 if (!llvm::sys::path::is_absolute(lib)) {
7132 Error(
"TCling__GetSharedLibImmediateDepsSlow",
"Cannot find library '%s'", lib.c_str());
7136 assert(llvm::sys::fs::exists(lib) &&
"Must exist!");
7137 lib = llvm::sys::path::filename(lib).str();
7140 auto ObjF = llvm::object::ObjectFile::createObjectFile(LibFullPath.
Data());
7142 Warning(
"TCling__GetSharedLibImmediateDepsSlow",
"Failed to read object file %s", lib.c_str());
7146 llvm::object::ObjectFile *BinObjFile = ObjF.get().getBinary();
7148 std::set<string> DedupSet;
7149 std::string Result = lib +
' ';
7150 for (
const auto &S : BinObjFile->symbols()) {
7151 uint32_t Flags = llvm::cantFail(S.getFlags());
7153 if (!(Flags & llvm::object::SymbolRef::SF_Undefined))
7157 if (Flags & llvm::object::SymbolRef::SF_Weak)
7159 llvm::Expected<StringRef> SymNameErr = S.getName();
7161 Warning(
"GetSharedLibDepsForModule",
"Failed to read symbol");
7164 llvm::StringRef SymName = SymNameErr.get();
7165 if (SymName.empty())
7168 if (BinObjFile->isELF()) {
7172 if (SymName.contains(
"@GLIBCXX") || SymName.contains(
"@CXXABI") ||
7173 SymName.contains(
"@GLIBC") || SymName.contains(
"@GCC"))
7181 static constexpr llvm::StringRef RegisterClasses(
"_Jv_RegisterClasses");
7182 static constexpr llvm::StringRef RegisterCloneTable(
"_ITM_registerTMCloneTable");
7183 static constexpr llvm::StringRef DeregisterCloneTable(
"_ITM_deregisterTMCloneTable");
7184 if (SymName == RegisterClasses ||
7185 SymName == RegisterCloneTable ||
7186 SymName == DeregisterCloneTable)
7191 if (skipLoadedLibs) {
7193 if (llvm::sys::DynamicLibrary::SearchForAddressOfSymbol(SymNameForDlsym))
7198 std::string found = interp->getDynamicLibraryManager()->searchLibrariesForSymbol(SymName,
false);
7204 if (!found.empty()) {
7205 std::string cand = llvm::sys::path::filename(found).str();
7206 if (!DedupSet.insert(cand).second)
7209 Result += cand +
' ';
7219 llvm::SmallString<256> rootmapName;
7220 if (!lib.startswith(
"lib"))
7221 rootmapName.append(
"lib");
7223 rootmapName.append(llvm::sys::path::filename(lib));
7224 llvm::sys::path::replace_extension(rootmapName,
"rootmap");
7230 llvm::StringRef rootmapNameNoLib = rootmapName.str();
7231 if (rootmapNameNoLib.consume_front(
"lib"))
7255 if (llvm::sys::path::is_absolute(lib) && !llvm::sys::fs::exists(lib))
7259 llvm::SmallString<512> rootmapName(lib);
7260 llvm::sys::path::replace_extension(rootmapName,
"rootmap");
7261 if (llvm::sys::fs::exists(rootmapName)) {
7263 Info(
"Load",
"loading %s", rootmapName.c_str());
7270 Warning(
"TCling::GetSharedLibDeps",
"Precomputed dependencies available but scanning '%s'", lib);
7275 if (!libs.empty()) {
7281 if (!
fMapfile || !lib || !lib[0]) {
7292 while ((rec = (
TEnvRec*) next())) {
7293 const char* libs = rec->GetValue();
7294 if (!strncmp(libs, libname.
Data(),
len) && strlen(libs) >=
len
7295 && (!libs[
len] || libs[
len] ==
' ' || libs[
len] ==
'.')) {
7308#if defined(R__MUST_REVISIT)
7309#if R__MUST_REVISIT(6,2)
7310 Warning(
"IsErrorMessagesEnabled",
"Interface not available yet.");
7322#if defined(R__MUST_REVISIT)
7323#if R__MUST_REVISIT(6,2)
7324 Warning(
"SetErrorMessages",
"Interface not available yet.");
7340 llvm::SmallVector<std::string, 10> includePaths;
7342 fInterpreter->GetIncludePaths(includePaths,
false,
true);
7343 if (
const size_t nPaths = includePaths.size()) {
7344 assert(!(nPaths & 1) &&
"GetIncludePath, number of paths and options is not equal");
7346 for (
size_t i = 0; i < nPaths; i += 2) {
7351 if (includePaths[i] !=
"-I")
7385 assert(fout !=
nullptr &&
"DisplayIncludePath, 'fout' parameter is null");
7387 llvm::SmallVector<std::string, 10> includePaths;
7389 fInterpreter->GetIncludePaths(includePaths,
false,
true);
7390 if (
const size_t nPaths = includePaths.size()) {
7391 assert(!(nPaths & 1) &&
"DisplayIncludePath, number of paths and options is not equal");
7393 std::string allIncludes(
"include path:");
7394 for (
size_t i = 0; i < nPaths; i += 2) {
7396 allIncludes += includePaths[i];
7398 if (includePaths[i] !=
"-I")
7400 allIncludes += includePaths[i + 1];
7403 fprintf(fout,
"%s\n", allIncludes.c_str());
7423#if defined(R__MUST_REVISIT)
7424#if R__MUST_REVISIT(6,2)
7425 Warning(
"GenericError",
"Interface not available yet.");
7453#if defined(R__MUST_REVISIT)
7454#if R__MUST_REVISIT(6,2)
7455 Warning(
"GetSecurityError",
"Interface not available yet.");
7468 cling::Interpreter::CompilationResult compRes;
7470 return compRes == cling::Interpreter::kFailure;
7489 TTHREAD_TLS_DECL(std::string,buffer);
7491 return buffer.c_str();
7572#if defined(R__MUST_REVISIT)
7573#if R__MUST_REVISIT(6,2)
7574 Warning(
"SetErrmsgcallback",
"Interface not available yet.");
7583 &
fInterpreter->getDiagnostics().getDiagnosticOptions(),
7585 [] (clang::DiagnosticsEngine::Level Level,
const std::string &
Info) {
7586 if (Level == clang::DiagnosticsEngine::Warning) {
7587 ::Warning(
"cling",
"%s", Info.c_str());
7588 }
else if (Level == clang::DiagnosticsEngine::Error
7589 || Level == clang::DiagnosticsEngine::Fatal) {
7595 fInterpreter->replaceDiagnosticConsumer(consumer,
true);
7597 fInterpreter->replaceDiagnosticConsumer(
nullptr);
7616 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
7617 std::string canonical = DLM->lookupLibrary(path);
7618 if (canonical.empty()) {
7622 cling::Interpreter::CompilationResult compRes;
7624 return compRes == cling::Interpreter::kFailure;
7628 return std::unique_ptr<TInterpreterValue>(
new TClingValue);
7635 std::vector<std::string>& completions)
7644 auto V =
reinterpret_cast<cling::Value*
>(
value.GetValAddr());
7646 return compRes!=cling::Interpreter::kSuccess ? 0 : 1 ;
7653 using namespace cling;
7667 if (
value.isValid() &&
value.needsManagedAllocation()) {
7688 auto iSpecObj = iSpecObjMap->second.find(Name);
7689 if (iSpecObj != iSpecObjMap->second.end()) {
7691 return iSpecObj->second;
7698 ASTContext& C = SemaR.getASTContext();
7699 Preprocessor &PP = SemaR.getPreprocessor();
7700 Parser& P =
const_cast<Parser&
>(
fInterpreter->getParser());
7701 Preprocessor::CleanupAndRestoreCacheRAII cleanupRAII(PP);
7702 Parser::ParserCurTokRestoreRAII savedCurToken(P);
7705 Token& Tok =
const_cast<Token&
>(P.getCurToken());
7706 Tok.setKind(tok::semi);
7712 Sema::ContextAndScopeRAII pushedDCAndS(SemaR, C.getTranslationUnitDecl(),
7715 TObject* specObj =
gROOT->FindSpecialObject(Name, LookupCtx);
7718 Error(
"GetObjectAddress",
"Got a special object without LookupCtx!");
7732 clang::CXXRecordDecl* klass)
const
7734 using namespace clang;
7735 ASTContext& Ctx = klass->getASTContext();
7736 FriendDecl::FriendUnion friendUnion(function);
7739 FriendDecl* friendDecl = FriendDecl::Create(Ctx, klass, sl, friendUnion, sl);
7740 klass->pushFriendDecl(friendDecl);
7754 if (func)
return ((
TClingCallFunc*)func)->GetDecl()->getCanonicalDecl();
7825 f->
Exec(address, &val);
7839 const void* args[] ,
8006 f->SetFunc(ci, method, params,
offset);
8015 f->SetFunc(ci, method, params, objectIsConst,
offset);
8053 llvm::SmallVector<clang::QualType, 4> funcProto;
8054 for (std::vector<TypeInfo_t*>::const_iterator iter =
proto.begin(), end =
proto.end();
8055 iter != end; ++iter) {
8056 funcProto.push_back( ((
TClingTypeInfo*)(*iter))->GetQualType() );
8058 f->SetFuncProto(ci, method, funcProto,
offset,
mode);
8068 llvm::SmallVector<clang::QualType, 4> funcProto;
8069 for (std::vector<TypeInfo_t*>::const_iterator iter =
proto.begin(), end =
proto.end();
8070 iter != end; ++iter) {
8071 funcProto.push_back( ((
TClingTypeInfo*)(*iter))->GetQualType() );
8073 f->SetFuncProto(ci, method, funcProto, objectIsConst,
offset,
mode);
8079 std::string wrapper_name;
8080 std::string wrapper;
8100 const clang::DeclContext *ctxt =
nullptr;
8102 ctxt = clang::Decl::castToDeclContext(((
TClingClassInfo*)info)->GetDecl());
8104 ctxt =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
8109 const clang::Decl *decl =
reinterpret_cast<const clang::Decl*
>(declid);
8113 const clang::DeclContext *declDC = decl->getDeclContext();
8116 if (declDC->isTransparentContext()) {
8117 declDC = declDC->getParent();
8120 if (
const auto *declRD = llvm::dyn_cast<clang::RecordDecl>(declDC)) {
8121 if (declRD->isAnonymousStructOrUnion()) {
8122 declDC = declRD->getParent();
8126 if (
const auto *declNS = llvm::dyn_cast<clang::NamespaceDecl>(declDC)) {
8127 if (declNS->isAnonymousNamespace() || declNS->isInlineNamespace()) {
8128 declDC = declNS->getParent();
8135 return declDC->Equals(ctxt);
8246 TClinginfo->
Init(tagnum);
8319 return TClinginfo->
Next();
8367 return TClinginfo->
Size();
8375 return TClinginfo->
Tagnum();
8391 TTHREAD_TLS_DECL(std::string,
output);
8401 return TClinginfo->
Name();
8409 return TClinginfo->
Title();
8446 ClassInfo_t* base)
const
8459 return TClinginfo->
Next();
8467 return TClinginfo->
Next(onlyDirect);
8475 return TClinginfo->
Offset(address, isDerivedObject);
8488 return TClinginfo->
GetBaseOffset(TClinginfoBase, address, isDerivedObject);
8504 return (ClassInfo_t *)TClinginfo->
GetBase();
8512 return TClinginfo->
Tagnum();
8520 TTHREAD_TLS_DECL(std::string,
output);
8530 return TClinginfo->
Name();
8575 const clang::Decl* decl =
reinterpret_cast<const clang::Decl*
>(declid);
8576 const clang::ValueDecl* vd = llvm::dyn_cast_or_null<clang::ValueDecl>(decl);
8609 return TClinginfo->
Next();
8617 return TClinginfo->
Offset();
8665 return TClinginfo->
Name();
8673 return TClinginfo->
Title();
8680 TTHREAD_TLS_DECL(std::string,
result);
8691 Decl* decl =
static_cast<Decl*
>(
const_cast<void*
>(declId));
8692 ASTContext &C = decl->getASTContext();
8693 decl->addAttr(AnnotateAttr::CreateImplicit(C, attribute));
8704 cling::Interpreter &interp,
8707 const clang::TypeDecl* td = llvm::dyn_cast<clang::TypeDecl>(decl->getDeclContext());
8710 clang::QualType qualType(td->getTypeForDecl(),0);
8712 unsigned int level = 0;
8715 else if (
name[
cursor] ==
'<' && level) --level;
8716 else if (level == 0 &&
name[
cursor] ==
':') {
8729 const auto *FD = llvm::dyn_cast<clang::FunctionDecl>(decl);
8730 if (
const auto *USD = llvm::dyn_cast<clang::UsingShadowDecl>(decl)) {
8731 FD = llvm::dyn_cast<clang::FunctionDecl>(USD->getTargetDecl());
8734 Error(
"GetFunctionName",
"NULL Decl!");
8741 if (llvm::isa<clang::CXXConstructorDecl>(FD))
8745 }
else if (llvm::isa<clang::CXXDestructorDecl>(decl))
8750 llvm::raw_string_ostream stream(
output);
8751 auto printPolicy = decl->getASTContext().getPrintingPolicy();
8753 printPolicy.AnonymousTagLocations =
false;
8754 FD->getNameForDiagnostic(stream, printPolicy,
false);
8784 return (FuncTempInfo_t*)
const_cast<void*
>(declid);
8795 return (FuncTempInfo_t*)ft_info;
8806 return t_info !=
nullptr;
8815 if (!ft_info)
return 0;
8816 const clang::FunctionTemplateDecl *ft = (
const clang::FunctionTemplateDecl*)ft_info;
8817 return ft->getTemplateParameters()->size();
8826 if (!ft_info)
return 0;
8827 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
8828 return ft->getTemplateParameters()->getMinRequiredArguments();
8836 if (!ft_info)
return 0;
8841 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
8843 switch (ft->getAccess()) {
8844 case clang::AS_public:
8847 case clang::AS_protected:
8850 case clang::AS_private:
8853 case clang::AS_none:
8854 if (ft->getDeclContext()->isNamespace())
8859 assert(
false &&
"Unexpected value for the access property value in Clang");
8863 const clang::FunctionDecl *fd = ft->getTemplatedDecl();
8864 if (
const clang::CXXMethodDecl *md =
8865 llvm::dyn_cast<clang::CXXMethodDecl>(fd)) {
8866 if (md->getMethodQualifiers().hasConst()) {
8869 if (md->isVirtual()) {
8875 if (
const clang::CXXConstructorDecl *cd =
8876 llvm::dyn_cast<clang::CXXConstructorDecl>(md)) {
8877 if (cd->isExplicit()) {
8881 else if (
const clang::CXXConversionDecl *cd =
8882 llvm::dyn_cast<clang::CXXConversionDecl>(md)) {
8883 if (cd->isExplicit()) {
8897 if (!ft_info)
return 0;
8902 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
8903 const clang::FunctionDecl *fd = ft->getTemplatedDecl();
8905 if (fd->isOverloadedOperator())
8907 if (llvm::isa<clang::CXXConversionDecl>(fd))
8909 if (llvm::isa<clang::CXXConstructorDecl>(fd))
8911 if (llvm::isa<clang::CXXDestructorDecl>(fd))
8913 if (fd->isInlined())
8924 if (!ft_info)
return;
8925 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
8937 if (!ft_info)
return;
8938 const clang::FunctionTemplateDecl *ft = (
const clang::FunctionTemplateDecl*)ft_info;
8942 if (
const RedeclarableTemplateDecl *AnnotFD
8944 if (AnnotateAttr *A = AnnotFD->getAttr<AnnotateAttr>()) {
8945 output = A->getAnnotation().str();
8949 if (!ft->isFromASTFile()) {
9000 const clang::Decl* decl =
reinterpret_cast<const clang::Decl*
>(declid);
9034 return info->
NArg();
9050 return info->
Next();
9077 return (TypeInfo_t*)info->
Type();
9085 TTHREAD_TLS_DECL(
TString, mangled_name);
9088 return mangled_name;
9106 return info->
Name();
9136 return info->
Title();
9144 return MethodInfo_MethodCallReturnType(func->fInfo);
9146 return EReturnType::kOther;
9155 if (info && info->
IsValid()) {
9157 clang::QualType QT( typeinfo->
GetQualType().getCanonicalType() );
9158 if (QT->isEnumeralType()) {
9159 return EReturnType::kLong;
9160 }
else if (QT->isPointerType()) {
9162 QT = llvm::cast<clang::PointerType>(QT)->getPointeeType();
9163 if ( QT->isCharType() ) {
9164 return EReturnType::kString;
9166 return EReturnType::kOther;
9168 }
else if ( QT->isFloatingType() ) {
9169 int sz = typeinfo->
Size();
9170 if (sz == 4 || sz == 8) {
9172 return EReturnType::kDouble;
9174 return EReturnType::kOther;
9176 }
else if ( QT->isIntegerType() ) {
9177 int sz = typeinfo->
Size();
9186 return EReturnType::kLong;
9188 return EReturnType::kOther;
9191 return EReturnType::kOther;
9194 return EReturnType::kOther;
9230 return (MethodArgInfo_t*)
9247 return info->
Next();
9271 return info->
Name();
9295 return (TypeInfo_t*) info->
Type();
9355 return TClinginfo->
Name();
9379 return TClinginfo->
Size();
9437 const char*
name)
const
9457 return TClinginfo->
Next();
9473 return TClinginfo->
Size();
9489 return TClinginfo->
Name();
9497 return TClinginfo->
Title();
9504 clang::QualType QT1 = clang::QualType::getFromOpaquePtr(QualTypePtr1);
9505 clang::QualType QT2 = clang::QualType::getFromOpaquePtr(QualTypePtr2);
9506 return fInterpreter->getCI()->getASTContext().hasSameType(QT1, QT2);
9513 clang::QualType QT = clang::QualType::getFromOpaquePtr(QualTypePtr);
9514 return QT->hasIntegerRepresentation();
9521 clang::QualType QT = clang::QualType::getFromOpaquePtr(QualTypePtr);
9522 return QT->hasSignedIntegerRepresentation();
9529 clang::QualType QT = clang::QualType::getFromOpaquePtr(QualTypePtr);
9530 return QT->hasUnsignedIntegerRepresentation();
9537 clang::QualType QT = clang::QualType::getFromOpaquePtr(QualTypePtr);
9538 return QT->hasFloatingRepresentation();
9545 clang::QualType QT = clang::QualType::getFromOpaquePtr(QualTypePtr);
9546 return QT->hasPointerRepresentation();
9553 clang::QualType QT = clang::QualType::getFromOpaquePtr(QualTypePtr);
9554 return QT->isVoidPointerType();
9561 clang::FunctionDecl *FD = (clang::FunctionDecl *) fdeclid;
9562 return llvm::isa_and_nonnull<clang::CXXMethodDecl>(FD);
9571 Error(
"SnapshotMutexState",
"fRecurseCount != 0 even though initial mutex state is unset!");
9587 Error(
"ForgetMutexState",
"mutex state's recurse count already 0!");
9603 std::unique_ptr<MutexStateAndRecurseCountDelta> uniqueP{typedDelta};
9617 Error(
"ApplyToInterpreterMutex",
9618 "After returning from user code that turned on thread safety support, we notice that fInitialMutex is already used ... "
9619 "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.");
9635 return uniqueP.release();
The file contains utilities which are foundational and could be used across the core component of ROO...
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
unsigned long long ULong64_t
TClass *(* DictFuncPtr_t)()
R__EXTERN TApplication * gApplication
R__EXTERN TClassTable * gClassTable
static bool IsFromRootCling()
static void indent(ostringstream &buf, int indent_level)
The file contains facilities to work with C++ module files extensions used to store rdict files.
void TCling__RestoreInterpreterMutex(void *delta)
Re-apply the lock count delta that TCling__ResetInterpreterMutex() caused.
void TCling__TransactionRollback(const cling::Transaction &T)
static void RegisterPreIncludedHeaders(cling::Interpreter &clingInterp)
static bool hasParsedRootmapForLibrary(llvm::StringRef lib)
static std::string GetClassSharedLibsForModule(const char *cls, cling::LookupHelper &LH)
void TCling__InvalidateGlobal(const clang::Decl *D)
bool TClingLookupHelper__AutoParse(const char *cname)
Allow calling autoparsing from TMetaUtils.
void * TCling__LockCompilationDuringUserCodeExecution()
Lock the interpreter.
void TCling__UpdateListsOnUnloaded(const cling::Transaction &T)
void TCling__GetNormalizedContext(const ROOT::TMetaUtils::TNormalizedCtxt *&normCtxt)
int TCling__LoadLibrary(const char *library)
Load a library.
void TCling__DEBUG__dump(clang::DeclContext *DC)
ETupleOrdering
Check in what order the member of a tuple are layout.
bool TCling__LibraryLoadingFailed(const std::string &errmessage, const std::string &libStem, bool permanent, bool resolved)
Lookup libraries in LD_LIBRARY_PATH and DYLD_LIBRARY_PATH with mangled_name, which is extracted by er...
static const std::unordered_set< std::string > gIgnoredPCMNames
List of dicts that have the PCM information already in the PCH.
static Bool_t s_IsLibraryLoaded(const char *libname, cling::Interpreter *fInterpreter)
static GlobalModuleIndex * loadGlobalModuleIndex(cling::Interpreter &interp)
bool TClingLookupHelper__ExistingTypeCheck(const std::string &tname, std::string &result)
Try hard to avoid looking up in the Cling database as this could enduce an unwanted autoparsing.
static bool HasASTFileOnDisk(clang::Module *M, const clang::Preprocessor &PP, std::string *FullFileName=nullptr)
Checks if there is an ASTFile on disk for the given module M.
void TCling__UnlockCompilationDuringUserCodeExecution(void *)
Unlock the interpreter.
const char * TCling__GetClassSharedLibs(const char *className)
static std::string AlternateTuple(const char *classname, const cling::LookupHelper &lh, Bool_t silent)
static bool R__InitStreamerInfoFactory()
Helper to initialize TVirtualStreamerInfo's factor early.
int TCling__AutoParseCallback(const char *className)
clang::RecordDecl * TCling__DEBUG__DCtoRecordDecl(clang::DeclContext *DC)
int TCling_GenerateDictionary(const std::vector< std::string > &classes, const std::vector< std::string > &headers, const std::vector< std::string > &fwdDecls, const std::vector< std::string > &unknown)
static bool HaveFullGlobalModuleIndex
bool TCling__TEST_isInvalidDecl(clang::Decl *D)
void TCling__LibraryUnloadedRTTI(const void *dyLibHandle, const char *canonicalName)
void TCling__UpdateListsOnCommitted(const cling::Transaction &T, cling::Interpreter *)
const Decl * TCling__GetObjectDecl(TObject *obj)
static ETupleOrdering IsTupleAscending()
void TCling__RegisterRdictForLoadPCM(const std::string &pcmFileNameFullPath, llvm::StringRef *pcmContent)
static void TCling__UpdateClassInfo(const NamedDecl *TD)
Update TClingClassInfo for a class (e.g. upon seeing a definition).
clang::DeclContext * TCling__DEBUG__getDeclContext(clang::Decl *D)
int TCling__CompileMacro(const char *fileName, const char *options)
void * TCling__ResetInterpreterMutex()
Reset the interpreter lock to the state it had before interpreter-related calls happened.
void TCling__DEBUG__decl_dump(void *D)
int TCling__AutoLoadCallback(const char *className)
static bool LoadModule(const std::string &ModuleName, cling::Interpreter &interp)
static void RegisterCxxModules(cling::Interpreter &clingInterp)
static void ConstructorName(std::string &name, const clang::Decl *decl, cling::Interpreter &interp, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt)
void TCling__PrintStackTrace()
Print a StackTrace!
static int HandleInterpreterException(cling::MetaProcessor *metaProcessor, const char *input_line, cling::Interpreter::CompilationResult &compRes, cling::Value *result)
Let cling process a command line.
static std::string GetSharedLibImmediateDepsSlow(std::string lib, cling::Interpreter *interp, bool skipLoadedLibs=true)
This interface returns a list of dependent libraries in the form: lib libA.so libB....
void TCling__DEBUG__printName(clang::Decl *D)
static clang::ClassTemplateDecl * FindTemplateInNamespace(clang::Decl *decl)
Find a template decl within N nested namespaces, 0<=N<inf Assumes 1 and only 1 template present and 1...
static void PrintDlError(const char *dyLibName, const char *modulename)
TInterpreter * CreateInterpreter(void *interpLibHandle, const char *argv[])
void TCling__LibraryLoadedRTTI(const void *dyLibHandle, const char *canonicalName)
static cling::Interpreter::CompilationResult ExecAutoParse(const char *what, Bool_t header, cling::Interpreter *interpreter)
Parse the payload or header.
static bool requiresRootMap(const char *rootmapfile)
clang::NamespaceDecl * TCling__DEBUG__DCtoNamespace(clang::DeclContext *DC)
TObject * TCling__GetObjectAddress(const char *Name, void *&LookupCtx)
static void LoadModules(const std::vector< std::string > &modules, cling::Interpreter &interp)
Loads the C++ modules that we require to run any ROOT program.
int TCling__IsAutoLoadNamespaceCandidate(const clang::NamespaceDecl *nsDecl)
void DestroyInterpreter(TInterpreter *interp)
static bool hasPrecomputedLibraryDeps(llvm::StringRef lib)
void TCling__SplitAclicMode(const char *fileName, string &mode, string &args, string &io, string &fname)
void Info(const char *location, const char *msgfmt,...)
Use this function for informational messages.
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
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.
const char * GetClassSharedLibs(const char *cls) final
Get the list of shared libraries containing the code for class cls.
FuncTempInfo_t * FuncTempInfo_FactoryCopy(FuncTempInfo_t *) const final
Construct a FuncTempInfo_t.
int DataMemberInfo_MaxIndex(DataMemberInfo_t *dminfo, Int_t dim) const final
Bool_t FuncTempInfo_IsValid(FuncTempInfo_t *) const final
Check validity of a FuncTempInfo_t.
void AddIncludePath(const char *path) final
Add a directory to the list of directories in which the interpreter looks for include files.
bool ClassInfo_IsBase(ClassInfo_t *info, const char *name) const final
void RecursiveRemove(TObject *obj) final
Delete object from cling symbol table so it can not be used anymore.
const char * DataMemberInfo_TypeName(DataMemberInfo_t *dminfo) const final
DeclId_t GetDataMemberAtAddr(const void *addr) const final
Return pointer to cling DeclId for a data member with a given name.
void CallFunc_SetArgArray(CallFunc_t *func, Longptr_t *paramArr, Int_t nparam) const final
std::string CallFunc_GetWrapperCode(CallFunc_t *func) const final
void * RewindInterpreterMutex()
Reset the interpreter lock to the state it had before interpreter-related calls happened.
const char * MethodArgInfo_Name(MethodArgInfo_t *marginfo) const final
Bool_t HasPCMForLibrary(const char *libname) const final
Return true if ROOT has cxxmodules pcm for a given library name.
void TypedefInfo_Init(TypedefInfo_t *tinfo, const char *name) const final
const char * DataMemberInfo_Title(DataMemberInfo_t *dminfo) const final
Longptr_t CallFunc_ExecInt(CallFunc_t *func, void *address) const final
void ClearStack() final
Delete existing temporary values.
void SetAlloclockfunc(void(*)()) const final
[Place holder for Mutex Lock] Provide the interpreter with a way to acquire a lock used to protect cr...
Bool_t SetErrorMessages(Bool_t enable=kTRUE) final
If error messages are disabled, the interpreter should suppress its failures and warning messages fro...
MethodInfo_t * CallFunc_FactoryMethod(CallFunc_t *func) const final
bool IsUnsignedIntegerType(const void *QualTypePtr) const
TypedefInfo_t * TypedefInfo_FactoryCopy(TypedefInfo_t *tinfo) const final
void GetFunctionOverloads(ClassInfo_t *cl, const char *funcname, std::vector< DeclId_t > &res) const final
Insert overloads of name in cl to res.
void UnRegisterTClassUpdate(const TClass *oldcl) final
If the dictionary is loaded, we can remove the class from the list (otherwise the class might be load...
std::string MethodArgInfo_TypeNormalizedName(MethodArgInfo_t *marginfo) const final
DeclId_t GetEnum(TClass *cl, const char *name) const final
Return pointer to cling Decl of global/static variable that is located at the address given by addr.
Long_t MethodArgInfo_Property(MethodArgInfo_t *marginfo) const final
int TypedefInfo_Size(TypedefInfo_t *tinfo) const final
void CallFunc_ExecWithArgsAndReturn(CallFunc_t *func, void *address, const void *args[]=nullptr, int nargs=0, void *ret=nullptr) const final
void GetInterpreterTypeName(const char *name, std::string &output, Bool_t full=kFALSE) final
The 'name' is known to the interpreter, this function returns the internal version of this name (usua...
std::map< std::string, llvm::StringRef > fPendingRdicts
static void UpdateClassInfoWork(const char *name)
Int_t Load(const char *filenam, Bool_t system=kFALSE) final
Load a library file in cling's memory.
int TypedefInfo_Next(TypedefInfo_t *tinfo) const final
void * GetInterfaceMethod(TClass *cl, const char *method, const char *params, Bool_t objectIsConst=kFALSE) final
Return pointer to cling interface function for a method of a class with parameters params (params is ...
void TypeInfo_Init(TypeInfo_t *tinfo, const char *funcname) const final
Bool_t SetSuspendAutoParsing(Bool_t value) final
Suspend the Autoparsing of headers.
int DataMemberInfo_TypeSize(DataMemberInfo_t *dminfo) const final
static void * fgSetOfSpecials
const char * ClassInfo_Title(ClassInfo_t *info) const final
const char * DataMemberInfo_Name(DataMemberInfo_t *dminfo) const final
const char * TypeName(const char *typeDesc) final
Return the absolute type of typeDesc.
ROOT::TMetaUtils::TNormalizedCtxt * fNormalizedCtxt
bool IsSignedIntegerType(const void *QualTypePtr) const
void ForgetMutexState() final
int MethodInfo_Next(MethodInfo_t *minfo) const final
Long_t ClassInfo_ClassProperty(ClassInfo_t *info) const final
void MethodInfo_Delete(MethodInfo_t *minfo) const final
Interface to cling function.
void MethodArgInfo_Delete(MethodArgInfo_t *marginfo) const final
DataMemberInfo_t * DataMemberInfo_Factory(ClassInfo_t *clinfo, TDictionary::EMemberSelection selection) const final
void ClassInfo_Destruct(ClassInfo_t *info, void *arena) const final
TClass * GetClass(const std::type_info &typeinfo, Bool_t load) const final
Demangle the name (from the typeinfo) and then request the class via the usual name based interface (...
Int_t UnloadAllSharedLibraryMaps() final
Unload the library map entries coming from all the loaded shared libraries.
void ClassInfo_Init(ClassInfo_t *info, const char *funcname) const final
std::set< TClass * > & GetModTClasses()
ClassInfo_t * BaseClassInfo_ClassInfo(BaseClassInfo_t *) const final
TClingCallbacks * fClingCallbacks
Long64_t CallFunc_ExecInt64(CallFunc_t *func, void *address) const final
Long_t ClassInfo_Property(ClassInfo_t *info) const final
Longptr_t ClassInfo_GetBaseOffset(ClassInfo_t *fromDerived, ClassInfo_t *toBase, void *address, bool isDerivedObject) const final
void UpdateEnumConstants(TEnum *enumObj, TClass *cl) const final
void ExecuteWithArgsAndReturn(TMethod *method, void *address, const void *args[]=nullptr, int nargs=0, void *ret=nullptr) const final
Bool_t IsErrorMessagesEnabled() const final
If error messages are disabled, the interpreter should suppress its failures and warning messages fro...
int DisplayIncludePath(FILE *fout) const final
Interface to cling function.
void TransactionRollback(const cling::Transaction &T)
Long_t FuncTempInfo_Property(FuncTempInfo_t *) const final
Return the property of the function template.
TEnum * CreateEnum(void *VD, TClass *cl) const final
const char * TypeInfo_TrueName(TypeInfo_t *tinfo) const final
Int_t UnloadLibraryMap(const char *library) final
Unload library map entries coming from the specified library.
void RegisterTemporary(const TInterpreterValue &value)
MutexStateAndRecurseCount fInitialMutex
const char * GetSharedLibs() final
Return the list of shared libraries loaded into the process.
int MethodArgInfo_Next(MethodArgInfo_t *marginfo) const final
void SnapshotMutexState(ROOT::TVirtualRWMutex *mtx) final
Long_t TypeInfo_Property(TypeInfo_t *tinfo) const final
const char * MethodInfo_GetPrototype(MethodInfo_t *minfo) const final
UInt_t FuncTempInfo_TemplateMinReqArgs(FuncTempInfo_t *) const final
Return the number of required template arguments of the function template described by ft_info.
std::vector< cling::Value > * fTemporaries
void RegisterModule(const char *modulename, const char **headers, const char **includePaths, const char *payloadCode, const char *fwdDeclsCode, void(*triggerFunc)(), const FwdDeclArgsToKeepCollection_t &fwdDeclsArgToSkip, const char **classesHeaders, Bool_t lateRegistration=false, Bool_t hasCxxModule=false) final
Inject the module named "modulename" into cling; load all headers.
static Int_t ShallowAutoLoadImpl(const char *cls)
void MethodInfo_CreateSignature(MethodInfo_t *minfo, TString &signature) const final
Bool_t CheckClassTemplate(const char *name) final
Return true if there is a class template by the given name ...
void LibraryLoaded(const void *dyLibHandle, const char *canonicalName)
void RegisterTClassUpdate(TClass *oldcl, DictFuncPtr_t dict) final
Register classes that already existed prior to their dictionary loading and that already had a ClassI...
TObjArray * GetRootMapFiles() const final
bool DataMemberInfo_IsValid(DataMemberInfo_t *dminfo) const final
bool ClassInfo_IsEnum(const char *name) const final
int MethodInfo_NDefaultArg(MethodInfo_t *minfo) const final
void CreateListOfMethods(TClass *cl) const final
Create list of pointers to methods for TClass cl.
Int_t RescanLibraryMap() final
Scan again along the dynamic path for library maps.
std::map< const cling::Transaction *, size_t > fTransactionHeadersMap
void ReportDiagnosticsToErrorHandler(bool enable=true) final
Report diagnostics to the ROOT error handler (see TError.h).
const char * MethodInfo_GetMangledName(MethodInfo_t *minfo) const final
Bool_t fHeaderParsingOnDemand
bool IsIntegerType(const void *QualTypePtr) const
std::hash< std::string > fStringHashFunction
static void RemoveAndInvalidateObject(List &L, Object *O)
void * GetInterfaceMethodWithPrototype(TClass *cl, const char *method, const char *proto, Bool_t objectIsConst=kFALSE, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch) final
Return pointer to cling interface function for a method of a class with a certain prototype,...
void * ClassInfo_New(ClassInfo_t *info) const final
int DisplayClass(FILE *fout, const char *name, int base, int start) const final
virtual void GetFunctionName(const clang::Decl *decl, std::string &name) const
void CreateListOfMethodArgs(TFunction *m) const final
Create list of pointers to method arguments for TMethod m.
virtual const char * GetSTLIncludePath() const final
Return the directory containing CINT's stl cintdlls.
MethodArgInfo_t * MethodArgInfo_FactoryCopy(MethodArgInfo_t *marginfo) const final
Longptr_t BaseClassInfo_Offset(BaseClassInfo_t *toBaseClassInfo, void *address, bool isDerivedObject) const final
ECheckClassInfo CheckClassInfo(const char *name, Bool_t autoload, Bool_t isClassOrNamespaceOnly=kFALSE) final
Checks if an entity with the specified name is defined in Cling.
void * FindSym(const char *entry) const final
Interface to cling function.
void RegisterLoadedSharedLibrary(const char *name)
Register a new shared library name with the interpreter; add it to fSharedLibs.
void TypeInfo_Delete(TypeInfo_t *tinfo) const final
int MethodInfo_NArg(MethodInfo_t *minfo) const final
DeclId_t GetDataMemberWithValue(const void *ptrvalue) const final
NOT IMPLEMENTED.
std::unordered_set< const clang::NamespaceDecl * > fNSFromRootmaps
EReturnType MethodCallReturnType(TFunction *func) const final
void ProcessClassesToUpdate()
DeclId_t GetFunctionWithValues(ClassInfo_t *cl, const char *method, const char *params, Bool_t objectIsConst=kFALSE) final
Return pointer to cling DeclId for a method of a class with a certain prototype, i....
TString GetMangledName(TClass *cl, const char *method, const char *params, Bool_t objectIsConst=kFALSE) final
Return the cling mangled name for a method of a class with parameters params (params is a string of a...
const char * MethodInfo_Title(MethodInfo_t *minfo) const final
const char * BaseClassInfo_TmpltName(BaseClassInfo_t *bcinfo) const final
Bool_t Declare(const char *code) final
Declare code to the interpreter, without any of the interpreter actions that could trigger a re-inter...
const char * BaseClassInfo_FullName(BaseClassInfo_t *bcinfo) const final
void CallFunc_SetArgs(CallFunc_t *func, const char *param) const final
int UnloadFile(const char *path) const final
void SetClassInfo(TClass *cl, Bool_t reload=kFALSE, Bool_t silent=kFALSE) final
Set pointer to the TClingClassInfo in TClass.
void CallFunc_Exec(CallFunc_t *func, void *address) const final
bool IsPointerType(const void *QualTypePtr) const
bool IsFloatingType(const void *QualTypePtr) const
Long_t FuncTempInfo_ExtraProperty(FuncTempInfo_t *) const final
Return the property not already defined in Property See TDictionary's EFunctionProperty.
bool CallFunc_IsValid(CallFunc_t *func) const final
const char * BaseClassInfo_Name(BaseClassInfo_t *bcinfo) const final
ROOT::TMetaUtils::TClingLookupHelper * fLookupHelper
const char * DataMemberInfo_ValidArrayIndex(DataMemberInfo_t *dminfo) const final
Int_t GetMore() const final
Return whether we are waiting for more input either because the collected input contains unbalanced b...
Bool_t fIsAutoParsingSuspended
std::string ToString(const char *type, void *obj) final
DeclId_t GetDeclId(const llvm::GlobalValue *gv) const
Return pointer to cling DeclId for a global value.
void Execute(const char *function, const char *params, int *error=nullptr) final
Execute a global function with arguments params.
bool ClassInfo_IsLoaded(ClassInfo_t *info) const final
Longptr_t ClassInfo_Tagnum(ClassInfo_t *info) const final
Long_t BaseClassInfo_Property(BaseClassInfo_t *bcinfo) const final
void CallFunc_SetFunc(CallFunc_t *func, ClassInfo_t *info, const char *method, const char *params, Longptr_t *Offset) const final
std::vector< std::string > GetUsingNamespaces(ClassInfo_t *cl) const final
Get the scopes representing using declarations of namespace.
const char * ClassInfo_FileName(ClassInfo_t *info) const final
void FuncTempInfo_Title(FuncTempInfo_t *, TString &name) const final
Return the comments associates with this function template.
const char * ClassInfo_TmpltName(ClassInfo_t *info) const final
void SaveContext() final
Save the current Cling state.
void LoadPCMImpl(TFile &pcmFile)
Tries to load a PCM from TFile; returns true on success.
Bool_t IsAutoLoadNamespaceCandidate(const clang::NamespaceDecl *nsDecl)
void ResetGlobals() final
Reset in Cling the list of global variables to the state saved by the last call to TCling::SaveGlobal...
void CodeComplete(const std::string &, size_t &, std::vector< std::string > &) final
The call to Cling's tab complition.
void ResetGlobalVar(void *obj) final
Reset the Cling 'user' global objects/variables state to the state saved by the last call to TCling::...
const char * MapCppName(const char *) const final
Interface to cling function.
Longptr_t Calc(const char *line, EErrorCode *error=nullptr) final
Directly execute an executable statement (e.g.
Int_t ReloadAllSharedLibraryMaps() final
Reload the library map entries coming from all the loaded shared libraries, after first unloading the...
void UpdateListOfGlobalFunctions() final
No op: see TClingCallbacks (used to update the list of global functions)
void DataMemberInfo_Delete(DataMemberInfo_t *dminfo) const final
const char * GetTopLevelMacroName() const final
Return the file name of the current un-included interpreted file.
void * fPrevLoadedDynLibInfo
void UpdateListOfDataMembers(TClass *cl) const
Update the list of pointers to data members for TClass cl This is now a nop.
void InspectMembers(TMemberInspector &, const void *obj, const TClass *cl, Bool_t isTransient) final
Visit all members over members, recursing over base classes.
Int_t SetClassSharedLibs(const char *cls, const char *libs) final
Register the AutoLoading information for a class.
MethodInfo_t * MethodInfo_FactoryCopy(MethodInfo_t *minfo) const final
std::set< const char * > fParsedPayloadsAddresses
CallFuncIFacePtr_t CallFunc_IFacePtr(CallFunc_t *func) const final
MethodArgInfo_t * MethodArgInfo_Factory() const final
static void UpdateClassInfo(char *name, Long_t tagnum)
No op: see TClingCallbacks.
DeclId_t GetFunction(ClassInfo_t *cl, const char *funcname) final
Return pointer to cling interface function for a method of a class with a certain name.
void ClassInfo_Delete(ClassInfo_t *info) const final
std::unique_ptr< cling::Interpreter > fInterpreter
EDataType ClassInfo_GetUnderlyingType(ClassInfo_t *info) const final
void FuncTempInfo_Delete(FuncTempInfo_t *) const final
Delete the FuncTempInfo_t.
DeclId_t GetFunctionTemplate(ClassInfo_t *cl, const char *funcname) final
Return pointer to cling interface function for a method of a class with a certain name.
Int_t DeleteVariable(const char *name) final
Undeclare obj called name.
Longptr_t DataMemberInfo_Offset(DataMemberInfo_t *dminfo) const final
CallFunc_t * CallFunc_Factory() const final
MethodInfo_t * MethodInfo_Factory() const final
Long_t DataMemberInfo_TypeProperty(DataMemberInfo_t *dminfo) const final
void ClearFileBusy() final
Reset the interpreter internal state in case a previous action was not correctly terminated.
cling::MetaProcessor * GetMetaProcessorImpl() const
bool DiagnoseIfInterpreterException(const std::exception &e) const final
void SetAllocunlockfunc(void(*)()) const final
[Place holder for Mutex Unlock] Provide the interpreter with a way to release a lock used to protect ...
std::set< size_t > fLookedUpClasses
virtual void AddAvailableIndentifiers(TSeqCollection &Idents) final
void TypedefInfo_Delete(TypedefInfo_t *tinfo) const final
void Reset() final
Pressing Ctrl+C should forward here.
const char * TypedefInfo_TrueName(TypedefInfo_t *tinfo) const final
int SetClassAutoLoading(int) const final
Enable/Disable the AutoLoading of libraries.
const char * ClassInfo_FullName(ClassInfo_t *info) const final
UInt_t AutoParseImplRecurse(const char *cls, bool topLevel)
Helper routine for TCling::AutoParse implementing the actual call to the parser and looping over temp...
const char * MethodInfo_TypeName(MethodInfo_t *minfo) const final
void CallFunc_SetArg(CallFunc_t *func, Long_t param) const final
const char * GetIncludePath() final
Refresh the list of include paths known to the interpreter and return it with -I prepended.
void UpdateListsOnUnloaded(const cling::Transaction &T)
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 composed of a header, followed by consecutive data records (TKey instances) with a wel...
Global functions class (global functions are obtained from CINT).
Global variables class (global variables are obtained from CINT).
THashList implements a hybrid collection class consisting of a hash table and a list to store TObject...
TObject * Remove(TObject *obj) override
Remove object from the list.
THashTable implements a hash table to store TObject's.
This class defines an abstract interface to a generic command line interpreter.
virtual bool RegisterPrebuiltModulePath(const std::string &FullPath, const std::string &ModuleMapName="module.modulemap") const =0
virtual Bool_t HasPCMForLibrary(const char *libname) const =0
virtual Int_t AutoParse(const char *cls)=0
int(* AutoLoadCallBack_t)(const char *)
virtual const char * GetClassSharedLibs(const char *cls)=0
virtual Bool_t Declare(const char *code)=0
std::vector< std::pair< std::string, int > > FwdDeclArgsToKeepCollection_t
TDictionary::DeclId_t DeclId_t
virtual TObjArray * GetRootMapFiles() const =0
Book space in a file, create I/O buffers, to fill them, (un)compress them.
A collection of TDataMember objects designed for fast access given a DeclId_t and for keep track of T...
TObject * FindObject(const char *name) const override
Specialize FindObject to do search for the a data member just by name or create it if its not already...
TDictionary * Find(DeclId_t id) const
Return (after creating it if necessary) the TDataMember describing the data member corresponding to t...
TClass * GetClass() const
A collection of TEnum objects designed for fast access given a DeclId_t and for keep track of TEnum t...
A collection of TEnum objects designed for fast access given a DeclId_t and for keep track of TEnum t...
TEnum * Find(DeclId_t id) const
Return the TEnum corresponding to the Decl 'id' or NULL if it does not exist.
TEnum * Get(DeclId_t id, const char *name)
Return (after creating it if necessary) the TEnum describing the enum corresponding to the Decl 'id'.
TClass * GetClass() const
A collection of TFunction objects designed for fast access given a DeclId_t and for keep track of TFu...
TFunctionTemplate * Get(DeclId_t id)
Return (after creating it if necessary) the TMethod or TFunction describing the function correspondin...
A collection of TFunction objects designed for fast access given a DeclId_t and for keep track of TFu...
TFunction * Find(DeclId_t id) const
Return the TMethod or TFunction describing the function corresponding to the Decl 'id'.
void Add(TObject *obj) override
TObject * At(Int_t idx) const override
Returns the object at position idx. Returns 0 if idx is out of range.
A TMemFile is like a normal TFile except that it reads and writes only from memory.
Abstract base class for accessing the data-members of a class.
const char * GetParent() const
virtual void Inspect(TClass *cl, const char *parent, const char *name, const void *addr)
EObjectPointerState GetObjectValidity() const
virtual Bool_t IsTreatingNonAccessibleTypes()
void SetObjectValidity(EObjectPointerState val)
void InspectMember(const T &obj, const char *name, Bool_t isTransient)
Each ROOT method (see TMethod) has a linked list of its arguments.
const char * GetFullTypeName() const
Get full type description of method argument, e.g.: "class TDirectory*".
const char * GetDefault() const
Get default value of method argument.
Each ROOT class (see TClass) has a linked list of methods.
virtual TList * GetListOfMethodArgs()
Returns methodarg list and additionally updates fDataMember in TMethod by calling FindDataMember();.
The TNamed class is the base class for all named ROOT classes.
const char * GetName() const override
Returns name of object.
Int_t GetEntriesFast() const
virtual void Expand(Int_t newSize)
Expand or shrink the array to newSize elements.
void Clear(Option_t *option="") override
Remove all objects from the array.
virtual void Compress()
Remove empty slots from array.
Int_t GetEntries() const override
Return the number of objects in array (i.e.
TObject * At(Int_t idx) const override
TObject * Remove(TObject *obj) override
Remove object from array.
TObject * FindObject(const char *name) const override
Find an object in this collection using its name.
void Add(TObject *obj) override
Collectable string class.
Mother of all ROOT objects.
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
R__ALWAYS_INLINE Bool_t IsOnHeap() const
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual TObject * FindObject(const char *name) const
Must be redefined in derived classes.
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()
This file contains a specialised ROOT message handler to test for diagnostic in unit tests.
R__EXTERN TVirtualRWMutex * gCoreMutex
bool IsStdPairBase(std::string_view name)
bool IsStdArray(std::string_view name)
bool IsStdClass(const char *type)
return true if the class belongs to the std namespace
bool IsStdPair(std::string_view name)
std::string InsertStd(const char *tname)
std::string GetLong64_Name(const char *original)
Replace 'long long' and 'unsigned long long' by 'Long64_t' and 'ULong64_t'.
char * DemangleTypeIdName(const std::type_info &ti, int &errorCode)
Demangle in a portable way the type id name.
const char * GetUnqualifiedName(const char *name)
Return the start of the unqualified name include in 'original'.
void Init(TClassEdit::TInterpreterLookupHelper *helper)
ROOT::ESTLType IsSTLCont(std::string_view type)
type : type name: vector<list<classA,allocator>,allocator> result: 0 : not stl container code of cont...
char * DemangleName(const char *mangled_name, int &errorCode)
int GetSplit(const char *type, std::vector< std::string > &output, int &nestedLoc, EModType mode=TClassEdit::kNone)
Stores in output (after emptying it) the split type.
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.