59 #include "RConfigure.h"
60 #include "compiledata.h"
75 #include "clang/AST/ASTContext.h"
76 #include "clang/AST/Decl.h"
77 #include "clang/AST/DeclarationName.h"
78 #include "clang/AST/GlobalDecl.h"
79 #include "clang/AST/RecordLayout.h"
80 #include "clang/AST/RecursiveASTVisitor.h"
81 #include "clang/AST/Type.h"
82 #include "clang/Basic/SourceLocation.h"
83 #include "clang/Basic/Specifiers.h"
84 #include "clang/Basic/TargetInfo.h"
85 #include "clang/CodeGen/ModuleBuilder.h"
86 #include "clang/Frontend/CompilerInstance.h"
87 #include "clang/Frontend/FrontendDiagnostic.h"
88 #include "clang/Lex/HeaderSearch.h"
89 #include "clang/Lex/Preprocessor.h"
90 #include "clang/Sema/Lookup.h"
91 #include "clang/Sema/Sema.h"
92 #include "clang/Parse/Parser.h"
94 #include "cling/Interpreter/ClangInternalState.h"
95 #include "cling/Interpreter/DynamicLibraryManager.h"
96 #include "cling/Interpreter/Interpreter.h"
97 #include "cling/Interpreter/LookupHelper.h"
98 #include "cling/Interpreter/Value.h"
99 #include "cling/Interpreter/Transaction.h"
100 #include "cling/MetaProcessor/MetaProcessor.h"
101 #include "cling/Utils/AST.h"
103 #include "llvm/IR/GlobalValue.h"
104 #include "llvm/IR/Module.h"
106 #include "llvm/Support/DynamicLibrary.h"
107 #include "llvm/Support/raw_ostream.h"
108 #include "llvm/Support/Path.h"
121 #include <unordered_map>
134 #include <mach-o/dyld.h>
141 #if defined(__CYGWIN__)
142 #include <sys/cygwin.h>
143 #define HMODULE void *
145 __declspec(dllimport)
void * __stdcall GetCurrentProcess();
146 __declspec(dllimport)
bool __stdcall EnumProcessModules(
void *,
void **,
unsigned long,
unsigned long *);
147 __declspec(dllimport)
unsigned long __stdcall GetModuleFileNameExW(
void *,
void *,
wchar_t *,
unsigned long);
152 #if defined(_MSC_VER)
154 # define STDIN_FILENO 0
156 #ifndef STDOUT_FILENO
157 # define STDOUT_FILENO 1
159 #ifndef STDERR_FILENO
160 # define STDERR_FILENO 2
169 #undef GetModuleFileName
170 #define RTLD_DEFAULT ((void *)::GetModuleHandle(NULL))
171 #define dlsym(library, function_name) ::GetProcAddress((HMODULE)library, function_name)
172 #define dlopen(library_name, flags) ::LoadLibrary(library_name)
173 #define dlclose(library) ::FreeLibrary((HMODULE)library)
174 #define R__DLLEXPORT __declspec(dllexport)
182 class TCling_UnloadMarker {
184 ~TCling_UnloadMarker() {
190 static TCling_UnloadMarker gTClingUnloadMarker;
199 return D->getDeclContext();
202 return llvm::dyn_cast<clang::NamespaceDecl>(DC);
205 return llvm::dyn_cast<clang::RecordDecl>(DC);
208 return DC->dumpDeclContext();
217 return ((clang::Decl*)D)->dump();
220 if (clang::NamedDecl* ND = llvm::dyn_cast<clang::NamedDecl>(D)) {
223 llvm::raw_string_ostream OS(name);
224 ND->getNameForDiagnostic(OS, D->getASTContext().getPrintingPolicy(),
227 printf(
"%s\n", name.c_str());
235 return D->isInvalidDecl();
240 return info->
GetDecl()->isInvalidDecl();
244 using namespace clang;
245 using namespace ROOT;
248 static const std::string gInterpreterClassDef = R
"ICF(
250 #define ClassDef(name, id) \
251 _ClassDefInterp_(name,id,virtual,) \
252 static int DeclFileLine() { return __LINE__; }
254 #define ClassDefNV(name, id) \
255 _ClassDefInterp_(name,id,,) \
256 static int DeclFileLine() { return __LINE__; }
257 #undef ClassDefOverride
258 #define ClassDefOverride(name, id) \
259 _ClassDefInterp_(name,id,,override) \
260 static int DeclFileLine() { return __LINE__; }
263 static const std::string gNonInterpreterClassDef = R
"ICF(
264 #define __ROOTCLING__ 1
266 #define ClassDef(name,id) \
267 _ClassDef_(name,id,virtual,) \
268 static int DeclFileLine() { return __LINE__; }
270 #define ClassDefNV(name, id)\
271 _ClassDef_(name,id,,)\
272 static int DeclFileLine() { return __LINE__; }
273 #undef ClassDefOverride
274 #define ClassDefOverride(name, id)\
275 _ClassDef_(name,id,,override)\
276 static int DeclFileLine() { return __LINE__; }
280 static const std::string gClassDefInterpMacro = R
"ICF(
285 #define _ClassDefInterp_(name,id,virtual_keyword, overrd) \
288 static TClass *Class() { static TClass* sIsA = 0; if (!sIsA) sIsA = TClass::GetClass(#name); return sIsA; } \
289 static const char *Class_Name() { return #name; } \
290 static Version_t Class_Version() { return id; } \
291 static TClass *Dictionary() { return 0; } \
292 virtual_keyword TClass *IsA() const overrd { return name::Class(); } \
293 virtual_keyword void ShowMembers(TMemberInspector&insp) const overrd { ::ROOT::Class_ShowMembers(name::Class(), this, insp); } \
294 virtual_keyword void Streamer(TBuffer&) overrd { ::Error("Streamer", "Cannot stream interpreted class."); } \
295 void StreamerNVirtual(TBuffer&ClassDef_StreamerNVirtual_b) { name::Streamer(ClassDef_StreamerNVirtual_b); } \
296 static const char *DeclFileName() { return __FILE__; } \
297 static int ImplFileLine() { return 0; } \
298 static const char *ImplFileName() { return __FILE__; }
309 class EnumVisitor :
public RecursiveASTVisitor<EnumVisitor> {
311 llvm::SmallVector<EnumDecl*,128> &fClassEnums;
313 EnumVisitor(llvm::SmallVector<EnumDecl*,128> &enums) : fClassEnums(enums)
316 bool TraverseStmt(Stmt*) {
321 bool shouldVisitTemplateInstantiations()
const {
return true; }
323 bool TraverseClassTemplateDecl(ClassTemplateDecl*) {
328 bool TraverseClassTemplatePartialSpecializationDecl(ClassTemplatePartialSpecializationDecl*) {
333 bool VisitEnumDecl(EnumDecl *TEnumD) {
334 if (!TEnumD->getDeclContext()->isDependentContext())
335 fClassEnums.push_back(TEnumD);
346 static vector<const NamedDecl*> updateList;
349 if (entered) topLevel =
kFALSE;
364 updateList.push_back(TD);
367 while (!updateList.empty()) {
369 updateList.pop_back();
376 const clang::Decl* D =
static_cast<const clang::Decl*
>(enumObj->
GetDeclId());
377 if(
const clang::EnumDecl* ED = dyn_cast<clang::EnumDecl>(D)) {
379 for (EnumDecl::enumerator_iterator EDI = ED->enumerator_begin(),
380 EDE = ED->enumerator_end(); EDI != EDE; ++EDI) {
382 std::string constbuf;
383 if (
const NamedDecl* END = llvm::dyn_cast<NamedDecl>(*EDI)) {
384 PrintingPolicy Policy((*EDI)->getASTContext().getPrintingPolicy());
385 llvm::raw_string_ostream stream(constbuf);
386 (END)->getNameForDiagnostic(stream, Policy,
false);
388 const char* constantName = constbuf.c_str();
392 const llvm::APSInt valAPSInt = (*EDI)->getInitVal();
393 if (valAPSInt.isSigned()) {
394 value = valAPSInt.getSExtValue();
396 value = valAPSInt.getZExtValue();
403 DataMemberInfo_t* dmInfo = (DataMemberInfo_t*) tcDmInfo;
407 enumConstant =
new TEnumConstant(dmInfo, constantName, value, enumObj);
414 globals->
Add(enumConstant);
427 const clang::Decl* D =
static_cast<const clang::Decl*
>(VD);
429 if (
const EnumDecl* ED = llvm::dyn_cast<EnumDecl>(D)) {
431 PrintingPolicy Policy(ED->getASTContext().getPrintingPolicy());
432 llvm::raw_string_ostream stream(buf);
433 ED->getNameForDiagnostic(stream, Policy,
false);
439 const char*
name = buf.c_str();
441 enumType =
new TEnum(name, VD, cl);
443 enumType =
new TEnum(name, VD, cl);
445 UpdateEnumConstants(enumType, cl);
454 const clang::Decl* D =
static_cast<const clang::Decl*
>(DV);
456 if (!D->isCanonicalDecl() && !isa<clang::NamespaceDecl>(D)
457 && !dyn_cast<clang::RecordDecl>(D))
return;
459 if (isa<clang::FunctionDecl>(D->getDeclContext())
460 || isa<clang::TagDecl>(D->getDeclContext()))
464 if (
const clang::CXXRecordDecl* RD = dyn_cast<clang::CXXRecordDecl>(D)) {
465 if (RD->getDescribedClassTemplate())
467 }
else if (
const clang::FunctionDecl* FD = dyn_cast<clang::FunctionDecl>(D)) {
468 if (FD->getDescribedFunctionTemplate())
472 if (
const RecordDecl *TD = dyn_cast<RecordDecl>(D)) {
473 if (TD->isCanonicalDecl() || TD->isThisDeclarationADefinition())
476 else if (
const NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
478 if (
const TagDecl *TD = dyn_cast<TagDecl>(D)) {
482 }
else if (
const NamespaceDecl* NSD = dyn_cast<NamespaceDecl>(D)) {
490 if (
const NamespaceDecl* NCtx = dyn_cast<NamespaceDecl>(ND->getDeclContext())) {
491 if (NCtx->getIdentifier()) {
494 std::string NCtxName;
495 PrintingPolicy Policy(NCtx->getASTContext().getPrintingPolicy());
496 llvm::raw_string_ostream stream(NCtxName);
497 NCtx->getNameForDiagnostic(stream, Policy,
true);
501 modifiedTClasses.insert(cl);
508 if (!isa<TranslationUnitDecl>(ND->getDeclContext()))
512 if (isa<EnumDecl>(ND))
517 if (!(isa<VarDecl>(ND)))
521 if (
gROOT->GetListOfGlobals()->FindObject(ND->getNameAsString().c_str()))
525 gROOT->GetListOfGlobals()->Add(
new TGlobal((DataMemberInfo_t *)
527 cast<ValueDecl>(ND), 0)));
554 const char* canonicalName) {
556 ((
TCling*)
gCling)->LibraryLoaded(dyLibHandle, canonicalName);
560 const char* canonicalName) {
562 ((
TCling*)
gCling)->LibraryUnloaded(dyLibHandle, canonicalName);
568 return ((
TCling*)
gCling)->GetObjectAddress(Name, LookupCtx);
577 cling::DynamicLibraryManager::ExposeHiddenSharedLibrarySymbols(interpLibHandle);
578 return new TCling(
"C++",
"cling C++ Interpreter");
600 return ((
TCling*)
gCling)->GetClassSharedLibs(className);
612 return ((
TCling*)
gCling)->IsAutoLoadNamespaceCandidate(nsDecl);
617 string file(fileName);
623 string &args,
string &io,
string &fname)
625 string file(fileName);
626 TString f, amode, arguments, aclicio;
628 mode = amode.
Data(); args = arguments.Data();
629 io = aclicio.
Data(); fname = f.
Data();
639 char *__unDName(
char *demangled,
const char *mangled,
int out_len,
640 void * (* pAlloc )(
size_t),
void (* pFree )(
void *),
641 unsigned short int flags);
653 using namespace clang;
654 if (NamespaceDecl* nsd = llvm::dyn_cast<NamespaceDecl>(decl)){
658 if (ClassTemplateDecl* ctd = llvm::dyn_cast<ClassTemplateDecl>(decl)){
670 return ((
TCling*)
gCling)->LazyFunctionCreatorAutoload(mangled_name);
679 const std::vector<std::string> &headers,
680 const std::vector<std::string> &fwdDecls,
681 const std::vector<std::string> &unknown)
687 if (classes.empty()) {
691 const std::string& className = classes[0];
693 TString fileName =
"AutoDict_";
694 std::string::const_iterator sIt;
695 for (sIt = className.begin(); sIt != className.end(); sIt++) {
696 if (*sIt ==
'<' || *sIt ==
'>' ||
697 *sIt ==
' ' || *sIt ==
'*' ||
698 *sIt ==
',' || *sIt ==
'&' ||
706 if (classes.size() > 1) {
708 std::vector<std::string>::const_iterator it = classes.begin();
709 while ((++it) != classes.end()) {
710 for (
UInt_t cursor = 0; cursor != it->length(); ++cursor) {
711 chk = chk * 3 + it->at(cursor);
724 static const std::set<std::string> sSTLTypes {
"vector",
"list",
"unordered_list",
"deque",
"map",
"multimap",
"set",
"unordered_set",
"multiset",
"queue",
"priority_queue",
"stack",
"iterator"};
725 std::vector<std::string>::const_iterator it;
726 std::string fileContent(
"");
727 for (it = headers.begin(); it != headers.end(); ++it) {
728 fileContent +=
"#include \"" + *it +
"\"\n";
730 for (it = unknown.begin(); it != unknown.end(); ++it) {
736 while (dirbase.Length() && dirbase !=
"."
737 && dirbase !=
"include" && dirbase !=
"inc"
738 && dirbase !=
"prec_stl") {
742 fileContent +=
TString(
"#include \"") + header +
"\"\n";
745 for (it = fwdDecls.begin(); it != fwdDecls.end(); ++it) {
746 fileContent +=
"class " + *it +
";\n";
748 fileContent +=
"#ifdef __CINT__ \n";
749 fileContent +=
"#pragma link C++ nestedclasses;\n";
750 fileContent +=
"#pragma link C++ nestedtypedefs;\n";
751 for (it = classes.begin(); it != classes.end(); ++it) {
753 size_t posTemplate = n.find(
'<');
754 std::set<std::string>::const_iterator iSTLType = sSTLTypes.end();
755 if (posTemplate != std::string::npos) {
756 n.erase(posTemplate, std::string::npos);
757 if (n.compare(0, 5,
"std::") == 0) {
760 iSTLType = sSTLTypes.find(n);
762 fileContent +=
"#pragma link C++ class ";
763 fileContent += *it +
"+;\n" ;
764 fileContent +=
"#pragma link C++ class ";
765 if (iSTLType != sSTLTypes.end()) {
769 fileContent += *it +
"::*;\n" ;
774 fileContent += *it +
"::*+;\n" ;
776 std::string oprLink(
"#pragma link C++ operators ");
780 if (iSTLType != sSTLTypes.end()) {
782 fileContent +=
"#ifdef G__VECTOR_HAS_CLASS_ITERATOR\n";
784 fileContent += oprLink +
"::iterator;\n";
785 fileContent += oprLink +
"::const_iterator;\n";
786 fileContent += oprLink +
"::reverse_iterator;\n";
788 fileContent +=
"#endif\n";
792 fileContent +=
"#endif\n";
796 filePointer = fopen(fileName,
"w");
797 if (filePointer ==
NULL) {
803 fprintf(filePointer,
"%s", fileContent.c_str());
819 const std::vector<std::string> &headers,
820 const std::vector<std::string> &fwdDecls,
821 const std::vector<std::string> &unknown)
827 std::vector<std::string> classes;
828 classes.push_back(className);
839 const char* fantomline =
"TRint::EndOfLineAction();";
846 void* TCling::fgSetOfSpecials = 0;
856 void exceptionErrorHandler(
void * ,
857 const std::string& reason,
859 throw std::runtime_error(std::string(
">>> Interpreter compilation error:\n") + reason);
873 class clangDiagSuppr {
875 clangDiagSuppr(clang::DiagnosticsEngine& diag): fDiagEngine(diag){
876 fOldDiagValue = fDiagEngine.getIgnoreAllWarnings();
877 fDiagEngine.setIgnoreAllWarnings(
true);
881 fDiagEngine.setIgnoreAllWarnings(fOldDiagValue);
884 clang::DiagnosticsEngine& fDiagEngine;
906 unsigned long offset = 0;
907 if (strncmp(tname.c_str(),
"const ", 6) == 0) {
910 unsigned long end = tname.length();
911 while( end && (tname[end-1]==
'&' || tname[end-1]==
'*' || tname[end-1]==
']') ) {
912 if ( tname[end-1]==
']' ) {
914 while ( end && tname[end-1]!=
'[' ) --end;
918 std::string innerbuf;
920 if (end != tname.length()) {
921 innerbuf = tname.substr(offset,end-offset);
922 inner = innerbuf.c_str();
924 inner = tname.c_str()+offset;
928 if (
gROOT->GetListOfClasses()->FindObject(inner)
940 newname =
"Long64_t";
942 newname =
"ULong64_t";
944 if (strcmp(inner,newname) == 0) {
947 if (offset) result =
"const ";
949 if ( end != tname.length() ) {
950 result += tname.substr(end,tname.length()-end);
952 if (result == tname) result.clear();
958 if (lastPos != inner)
962 const auto enName = lastPos;
963 const auto scopeNameSize = ((
Long64_t)lastPos - (
Long64_t)inner) /
sizeof(decltype(*lastPos)) - 2;
965 char *scopeName =
new char[scopeNameSize + 1];
967 char scopeName[scopeNameSize + 1];
969 strncpy(scopeName, inner, scopeNameSize);
970 scopeName[scopeNameSize] =
'\0';
972 if (
auto scope = static_cast<TClass *>(
gROOT->GetListOfClasses()->FindObject(scopeName))) {
973 auto enumTable =
dynamic_cast<const THashList *
>(scope->GetListOfEnums(
false));
974 if (enumTable && enumTable->THashList::FindObject(enName))
return true;
978 auto listOfEnums = scope->GetListOfEnums();
980 auto enumTable =
dynamic_cast<const THashList *
>(listOfEnums);
981 if (enumTable && enumTable->THashList::FindObject(enName))
return true;
990 auto enumTable =
dynamic_cast<const THashList *
>(
gROOT->GetListOfEnums());
991 if (enumTable && enumTable->THashList::FindObject(inner))
return true;
1007 fContent.reserve(size);
1014 return fContent.c_str();
1022 bool notPresent = fLinesHashSet.emplace(fHashFunc(str)).second;
1033 :
TInterpreter(name, title), fGlobalsListSerial(-1), fInterpreter(0),
1034 fMetaProcessor(0), fNormalizedCtxt(0), fPrevLoadedDynLibInfo(0),
1035 fClingCallbacks(0), fAutoLoadCallBack(0),
1036 fTransactionCount(0), fHeaderParsingOnDemand(true), fIsAutoParsingSuspended(
kFALSE)
1039 bool fromRootCling = dlsym(RTLD_DEFAULT,
"usedToIdentifyRootClingByDlSym");
1041 llvm::install_fatal_error_handler(&exceptionErrorHandler);
1045 std::vector<std::string> clingArgsStorage;
1046 clingArgsStorage.push_back(
"cling4root");
1048 std::string interpInclude;
1050 if (!fromRootCling) {
1054 clingArgsStorage.push_back(interpInclude);
1056 std::string pchFilename = interpInclude.substr(2) +
"/allDict.cxx.pch";
1060 clingArgsStorage.push_back(
"-include-pch");
1061 clingArgsStorage.push_back(pchFilename);
1066 std::string include;
1069 include +=
"/include";
1071 include = ROOTINCDIR;
1072 #endif // ROOTINCDIR
1073 clingArgsStorage.push_back(
"-I");
1074 clingArgsStorage.push_back(include);
1075 clingArgsStorage.push_back(
"-Wno-undefined-inline");
1076 clingArgsStorage.push_back(
"-fsigned-char");
1079 std::vector<const char*> interpArgs;
1080 for (std::vector<std::string>::const_iterator iArg = clingArgsStorage.begin(),
1081 eArg = clingArgsStorage.end(); iArg != eArg; ++iArg)
1082 interpArgs.push_back(iArg->c_str());
1087 extraArgs && *extraArgs; ++extraArgs) {
1088 if (!strcmp(*extraArgs,
"-resource-dir")) {
1090 llvmResourceDir = *(++extraArgs);
1092 interpArgs.push_back(*extraArgs);
1096 fInterpreter =
new cling::Interpreter(interpArgs.size(),
1098 llvmResourceDir.c_str());
1100 if (!fromRootCling) {
1117 fInterpreter->getCI()->getPreprocessorOpts().DisablePCHValidation =
true;
1121 fInterpreter->getCI()->getLangOpts().SpellChecking =
false;
1127 static llvm::raw_fd_ostream fMPOuts (STDOUT_FILENO,
false);
1133 if (fromRootCling) {
1135 "#include <string>\n"
1136 "using std::string;");
1139 + gClassDefInterpMacro +
"\n"
1140 + gInterpreterClassDef +
"\n"
1141 +
"#undef ClassImp\n"
1142 "#define ClassImp(X)\n"
1143 "#include <string>\n"
1144 "using namespace std;");
1172 std::unique_ptr<TClingCallbacks>
1178 if (!fromRootCling) {
1198 #if defined(R__MUST_REVISIT)
1199 #if R__MUST_REVISIT(6,2)
1200 Warning(
"~TCling",
"Interface not available yet.");
1201 #ifdef R__COMPLETE_MEM_TERMINATION
1222 #if defined(__CYGWIN__) && defined(__GNUC__)
1224 #elif defined(G__WIN32)
1225 MEMORY_BASIC_INFORMATION mbi;
1226 if (!VirtualQuery (
func, &mbi,
sizeof (mbi)))
1231 HMODULE hMod = (HMODULE) mbi.AllocationBase;
1232 TTHREAD_TLS_ARRAY(
char, MAX_PATH, moduleName);
1234 if (!GetModuleFileNameA (hMod, moduleName,
sizeof (moduleName)))
1241 if (dladdr((
void*)
func,&info)==0) {
1246 return info.dli_fname;
1258 auto setFactory = []() {
1262 static bool doneFactory = setFactory();
1271 const char** headers,
1272 void (*triggerFunc)())
const {
1280 searchPath = llvm::sys::path::parent_path(libraryName);
1300 if (
gROOT->IsRootFile(pcmFileName)) {
1304 ::Info(
"TCling::LoadPCM",
"Loading ROOT PCM %s", pcmFileName.
Data());
1311 TFile *pcmFile =
new TFile(pcmFileName+
"?filetype=pcm",
"READ");
1319 (listOfKeys->GetSize() == 0) ||
1321 (listOfKeys->GetSize() == 1) &&
1322 !strcmp(((
TKey*)listOfKeys->At(0))->
GetName(),
"EMPTY")
1333 ::Info(
"TCling::LoadPCM",
"reading protoclasses for %s \n",pcmFileName.
Data());
1335 pcmFile->
GetObject(
"__ProtoClasses", protoClasses);
1338 for (
auto obj : *protoClasses) {
1348 for (
auto proto : *protoClasses) {
1350 = (
TClass*)
gROOT->GetListOfClasses()->FindObject(proto->GetName())) {
1357 ::Error(
"TCling::LoadPCM",
"Inconsistent TClassTable for %s",
1369 protoClasses->Clear();
1370 delete protoClasses;
1374 pcmFile->
GetObject(
"__Typedefs", dataTypes);
1376 for (
auto typedf: *dataTypes)
1377 gROOT->GetListOfTypes()->Add(typedf);
1386 auto listOfGlobals =
gROOT->GetListOfGlobals();
1387 auto listOfEnums =
dynamic_cast<THashList*
>(
gROOT->GetListOfEnums());
1389 for (
auto selEnum: *enums){
1390 const char* enumScope = selEnum->
GetTitle();
1391 const char* enumName = selEnum->GetName();
1392 if (strcmp(enumScope,
"") == 0){
1395 if (!listOfEnums->THashList::FindObject(enumName)){
1396 ((
TEnum*) selEnum)->SetClass(
nullptr);
1397 listOfEnums->Add(selEnum);
1399 for (
auto enumConstant: *static_cast<TEnum*>(selEnum)->GetConstants()){
1400 if (!listOfGlobals->FindObject(enumConstant)){
1401 listOfGlobals->Add(enumConstant);
1409 if (!nsTClassEntry){
1412 auto listOfEnums = nsTClassEntry->
fEnums.load();
1423 if (listOfEnums && !listOfEnums->THashList::FindObject(enumName)){
1424 ((
TEnum*) selEnum)->SetClass(nsTClassEntry);
1425 listOfEnums->Add(selEnum);
1438 ::Info(
"TCling::LoadPCM",
"Loading clang PCM %s", pcmFileName.
Data());
1452 using namespace clang;
1454 class ExtLexicalStorageAdder:
public RecursiveASTVisitor<ExtLexicalStorageAdder>{
1459 bool VisitRecordDecl(clang::RecordDecl* rcd){
1461 Info(
"ExtLexicalStorageAdder",
1462 "Adding external lexical storage to class %s",
1463 rcd->getNameAsString().c_str());
1464 auto reDeclPtr = rcd->getMostRecentDecl();
1466 reDeclPtr->setHasExternalLexicalStorage();
1467 }
while ((reDeclPtr = reDeclPtr->getPreviousDecl()));
1487 const char** headers,
1488 const char** includePaths,
1489 const char* payloadCode,
1490 const char* fwdDeclsCode,
1491 void (*triggerFunc)(),
1493 const char** classesHeaders)
1496 static const bool fromRootCling = dlsym(RTLD_DEFAULT,
"usedToIdentifyRootClingByDlSym");
1500 if (fromRootCling)
return;
1504 bool isACLiC =
false;
1505 if (hasHeaderParsingOnDemand &&
1506 strstr(modulename,
"_ACLiC_dict") !=
nullptr){
1508 Info(
"TCling::RegisterModule",
1509 "Header parsing on demand is active but this is an Aclic library. Disabling it for this library.");
1510 hasHeaderParsingOnDemand =
false;
1527 for (
const char** inclPath = includePaths; *inclPath; ++inclPath) {
1530 cling::Transaction* T = 0;
1532 for (
auto& fwdDeclArgToSkipPair : fwdDeclsArgToSkip){
1533 const std::string& fwdDecl = fwdDeclArgToSkipPair.first;
1534 const int nArgsToSkip = fwdDeclArgToSkipPair.second;
1536 assert(cling::Interpreter::kSuccess == compRes &&
1537 "A fwd declaration could not be compiled");
1538 if (compRes!=cling::Interpreter::kSuccess){
1539 Warning(
"TCling::RegisterModule",
1540 "Problems in declaring string '%s' were encountered.",
1555 TString code = gNonInterpreterClassDef;
1556 code += payloadCode;
1565 void* dyLibHandle = dlopen(dyLibName, RTLD_LAZY | RTLD_GLOBAL);
1568 char dyLibError[1000];
1569 FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
NULL, GetLastError(),
1570 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), dyLibError,
1571 sizeof(dyLibError),
NULL);
1574 const char* dyLibError = dlerror();
1578 ::Info(
"TCling::RegisterModule",
1579 "Cannot open shared library %s for dictionary %s:\n %s",
1580 dyLibName, modulename, dyLibError);
1589 if (hasHeaderParsingOnDemand && fwdDeclsCode){
1592 std::string fwdDeclsCodeLessEnums;
1596 std::string fwdDeclsLine;
1597 std::istringstream fwdDeclsCodeStr(fwdDeclsCode);
1598 std::vector<std::string> scope;
1599 while (std::getline(fwdDeclsCodeStr, fwdDeclsLine)) {
1600 if (fwdDeclsLine.find(
"namespace ") == 0
1601 || fwdDeclsLine.find(
"inline namespace ") == 0) {
1603 scope.push_back(fwdDeclsLine.substr(10,
1604 fwdDeclsLine.length() - 10 - 2));
1605 }
else if (fwdDeclsLine ==
"}") {
1607 }
else if (fwdDeclsLine.find(
"enum __attribute__((annotate(\"") == 0) {
1608 clang::DeclContext* DC = 0;
1609 for (
auto &&aScope: scope) {
1616 if (scope.empty() || DC) {
1618 size_t posEnumName = fwdDeclsLine.find(
"\"))) ", 32);
1619 R__ASSERT(posEnumName != std::string::npos &&
"Inconsistent enum fwd decl!");
1621 while (isspace(fwdDeclsLine[posEnumName]))
1623 size_t posEnumNameEnd = fwdDeclsLine.find(
" : ", posEnumName);
1624 R__ASSERT(posEnumNameEnd != std::string::npos &&
"Inconsistent enum fwd decl (end)!");
1625 while (isspace(fwdDeclsLine[posEnumNameEnd]))
1629 std::string enumName = fwdDeclsLine.substr(posEnumName,
1630 posEnumNameEnd - posEnumName + 1);
1632 if (clang::NamedDecl* enumDecl
1633 = cling::utils::Lookup::Named(&
fInterpreter->getSema(),
1634 enumName.c_str(), DC)) {
1637 R__ASSERT(llvm::dyn_cast<clang::EnumDecl>(enumDecl) &&
"not an enum decl!");
1643 fwdDeclsCodeLessEnums += fwdDeclsLine +
"\n";
1647 if (fwdDeclsCodeLessEnums.size() != 0){
1648 auto compRes =
fInterpreter->declare(fwdDeclsCodeLessEnums, &T);
1649 assert(cling::Interpreter::kSuccess == compRes &&
1650 "The forward declarations could not be compiled");
1651 if (compRes!=cling::Interpreter::kSuccess){
1652 Warning(
"TCling::RegisterModule",
1653 "Problems in compiling forward declarations for module %s: '%s'",
1654 modulename, fwdDeclsCodeLessEnums.c_str()) ;
1662 ExtLexicalStorageAdder elsa;
1663 for (
auto dciIt = T->decls_begin();dciIt!=T->decls_end();dciIt++){
1664 cling::Transaction::DelayCallInfo& dci = *dciIt;
1665 for(
auto dit = dci.m_DGR.begin(); dit != dci.m_DGR.end(); ++dit) {
1666 clang::Decl* declPtr = *dit;
1667 elsa.TraverseDecl(declPtr);
1681 for (
const char** classesHeader = classesHeaders; *classesHeader; ++classesHeader) {
1682 temp=*classesHeader;
1684 size_t theTemplateHash = 0;
1685 bool addTemplate =
false;
1686 size_t posTemplate = temp.find(
'<');
1687 if (posTemplate != std::string::npos) {
1689 std::string templateName = temp.substr(0, posTemplate);
1695 for (
const char** classesHeader_inner = classesHeader; 0!=strcmp(*classesHeader_inner,
"@"); ++classesHeader_inner,++classesHeader){
1697 if (payloadCode == *classesHeader_inner ){
1699 if (addTemplate)
fPayloads.insert(theTemplateHash);
1702 Info(
"TCling::RegisterModule",
1703 "Adding a header for %s", temp.c_str());
1709 addTemplate =
false;
1716 if (strcmp(modulename,
"libCore")!=0 && strcmp(modulename,
"libRint")!=0
1717 && strcmp(modulename,
"libThread")!=0 && strcmp(modulename,
"libRIO")!=0
1718 && strcmp(modulename,
"libcomplexDict")!=0 && strcmp(modulename,
"libdequeDict")!=0
1719 && strcmp(modulename,
"liblistDict")!=0 && strcmp(modulename,
"libforward_listDict")!=0
1720 && strcmp(modulename,
"libvectorDict")!=0
1721 && strcmp(modulename,
"libmapDict")!=0 && strcmp(modulename,
"libmultimap2Dict")!=0
1722 && strcmp(modulename,
"libmap2Dict")!=0 && strcmp(modulename,
"libmultimapDict")!=0
1723 && strcmp(modulename,
"libsetDict")!=0 && strcmp(modulename,
"libmultisetDict")!=0
1724 && strcmp(modulename,
"libunordered_setDict")!=0 && strcmp(modulename,
"libunordered_multisetDict")!=0
1725 && strcmp(modulename,
"libunordered_mapDict")!=0 && strcmp(modulename,
"libunordered_multimapDict")!=0
1726 && strcmp(modulename,
"libvalarrayDict")!=0
1727 && strcmp(modulename,
"G__GenVector32")!=0 && strcmp(modulename,
"G__Smatrix32")!=0
1731 if (!
LoadPCM(pcmFileName, headers, triggerFunc)) {
1732 ::Error(
"TCling::RegisterModule",
"cannot find dictionary module %s",
1737 bool oldValue =
false;
1745 clangDiagSuppr diagSuppr(
fInterpreter->getSema().getDiagnostics());
1747 #if defined(R__MUST_REVISIT)
1748 #if R__MUST_REVISIT(6,2)
1749 Warning(
"TCling::RegisterModule",
"Diagnostics suppression should be gone by now.");
1753 if (!hasHeaderParsingOnDemand){
1754 const cling::Transaction* watermark =
fInterpreter->getLastTransaction();
1755 cling::Interpreter::CompilationResult compRes =
fInterpreter->parseForModule(code.
Data());
1761 assert(cling::Interpreter::kSuccess == compRes &&
1762 "Payload code of a dictionary could not be parsed correctly.");
1763 if (compRes!=cling::Interpreter::kSuccess) {
1764 Warning(
"TCling::RegisterModule",
1765 "Problems declaring payload for module %s.", modulename) ;
1774 if (!hasHeaderParsingOnDemand) {
1801 if (!hasHeaderParsingOnDemand) {
1804 "#undef __ROOTCLING__\n"
1805 + gInterpreterClassDef +
1812 dlclose(dyLibHandle);
1834 typedef std::vector<std::pair<TClass*,DictFuncPtr_t> >::iterator iterator;
1840 if ( i->first == oldcl ) {
1863 if (strstr(line,fantomline)) {
1878 gROOT->SetLineIsProcessing();
1882 gROOT->SetLineHasBeenProcessed();
1895 gROOT->SetLineIsProcessing();
1897 struct InterpreterFlagsRAII_t {
1899 bool fWasDynamicLookupEnabled;
1901 InterpreterFlagsRAII_t(cling::Interpreter* interp):
1903 fWasDynamicLookupEnabled(interp->isDynamicLookupEnabled())
1905 fInterpreter->enableDynamicLookup(
true);
1907 ~InterpreterFlagsRAII_t() {
1908 fInterpreter->enableDynamicLookup(fWasDynamicLookupEnabled);
1917 cling::Interpreter::CompilationResult compRes = cling::Interpreter::kSuccess;
1918 if (!strncmp(sLine.
Data(),
".L", 2) || !strncmp(sLine.
Data(),
".x", 2) ||
1919 !strncmp(sLine.
Data(),
".X", 2)) {
1927 aclicMode, arguments, io);
1928 if (aclicMode.
Length()) {
1930 R__ASSERT(aclicMode[0]==
'+' &&
"ACLiC mode must start with a +");
1932 if (aclicMode[1]==
'+') {
1938 compRes = cling::Interpreter::kFailure;
1940 if (strncmp(sLine.
Data(),
".L", 2) != 0) {
1943 if (arguments.Length()==0) {
1952 mod_line =
function + arguments + io;
1953 cling::MetaProcessor::MaybeRedirectOutputRAII RAII(
fMetaProcessor);
1959 bool unnamedMacro =
false;
1962 std::ifstream in(fname);
1963 static const char whitespace[] =
" \t\r\n";
1965 std::getline(in, line);
1966 std::string::size_type posNonWS = line.find_first_not_of(whitespace);
1967 if (posNonWS == std::string::npos)
continue;
1968 if (line[posNonWS] ==
'/' && line[posNonWS + 1] ==
'/')
1971 unnamedMacro = (line[posNonWS] ==
'{');
1977 cling::MetaProcessor::MaybeRedirectOutputRAII RAII(
fMetaProcessor);
1990 if (0!=strncmp(sLine.
Data(),
".autodict ",10) && sLine !=
".autodict") {
1993 cling::MetaProcessor::MaybeRedirectOutputRAII RAII(
fMetaProcessor);
1996 bool isInclusionDirective = sLine.
Contains(
"\n#include") || sLine.
BeginsWith(
"#include");
1997 if (isInclusionDirective) {
2005 if (result.isValid())
2014 case cling::Interpreter::kSuccess: *error =
kNoError;
break;
2015 case cling::Interpreter::kFailure: *error =
kRecoverable;
break;
2016 case cling::Interpreter::kMoreInputExpected: *error =
kProcessing;
break;
2019 if (compRes == cling::Interpreter::kSuccess
2021 && !result.isVoid())
2023 gROOT->SetLineHasBeenProcessed();
2024 return result.simplisticCastAs<
long>();
2026 gROOT->SetLineHasBeenProcessed();
2066 static const TClassRef clRefString(
"std::string");
2067 if (clRefString == cl) {
2072 const char* cobj = (
const char*) obj;
2079 auto inspInspect = [&] (ptrdiff_t offset){
2080 insp.
Inspect(const_cast<TClass*>(cl), insp.
GetParent(),
"_real", cobj, isTransient);
2081 insp.
Inspect(const_cast<TClass*>(cl), insp.
GetParent(),
"_imag", cobj + offset, isTransient);
2085 switch(complexType) {
2092 inspInspect(
sizeof(
float));
2097 inspInspect(
sizeof(
double));
2102 inspInspect(
sizeof(
int));
2107 inspInspect(
sizeof(
long));
2112 static clang::PrintingPolicy
2114 if (printPol.Indentation) {
2116 printPol.Indentation = 0;
2117 printPol.SuppressInitializers =
true;
2120 const char* clname = cl->
GetName();
2123 const clang::ASTContext& astContext =
fInterpreter->getCI()->getASTContext();
2124 const clang::Decl *scopeDecl = 0;
2129 scopeDecl = clingCI->
GetDecl();
2130 recordType = clingCI->
GetType();
2132 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
2134 scopeDecl = lh.findScope(clname, cling::LookupHelper::NoDiagnostics,
2138 Error(
"InspectMembers",
"Cannot find Decl for class %s", clname);
2141 const clang::CXXRecordDecl* recordDecl
2142 = llvm::dyn_cast<
const clang::CXXRecordDecl>(scopeDecl);
2144 Error(
"InspectMembers",
"Cannot find Decl for class %s is not a CXXRecordDecl.", clname);
2151 cling::Interpreter::PushTransactionRAII deserRAII(
fInterpreter);
2153 astContext.getASTRecordLayout(recordDecl);
2155 for (clang::RecordDecl::field_iterator iField = recordDecl->field_begin(),
2156 eField = recordDecl->field_end(); iField != eField; ++iField) {}
2159 const clang::ASTRecordLayout& recLayout
2160 = astContext.getASTRecordLayout(recordDecl);
2167 if (cl->
Size() != recLayout.getSize().getQuantity()) {
2168 Error(
"InspectMembers",
"TClass and cling disagree on the size of the class %s, respectively %d %lld\n",
2172 unsigned iNField = 0;
2175 for (clang::RecordDecl::field_iterator iField = recordDecl->field_begin(),
2176 eField = recordDecl->field_end(); iField != eField;
2177 ++iField, ++iNField) {
2180 clang::QualType memberQT = iField->getType();
2185 memberQT = cling::utils::Transform::GetPartiallyDesugaredType(astContext, memberQT,
fNormalizedCtxt->
GetConfig(),
false );
2186 if (memberQT.isNull()) {
2187 std::string memberName;
2188 llvm::raw_string_ostream stream(memberName);
2189 iField->getNameForDiagnostic(stream, printPol,
true );
2191 Error(
"InspectMembers",
2192 "Cannot retrieve QualType for member %s while inspecting class %s",
2193 memberName.c_str(), clname);
2196 const clang::Type* memType = memberQT.getTypePtr();
2198 std::string memberName;
2199 llvm::raw_string_ostream stream(memberName);
2200 iField->getNameForDiagnostic(stream, printPol,
true );
2202 Error(
"InspectMembers",
2203 "Cannot retrieve Type for member %s while inspecting class %s",
2204 memberName.c_str(), clname);
2209 Bool_t ispointer =
false;
2210 if (memNonPtrType->isPointerType()) {
2212 clang::QualType ptrQT
2213 = memNonPtrType->getAs<clang::PointerType>()->getPointeeType();
2218 ptrQT = cling::utils::Transform::GetPartiallyDesugaredType(astContext, ptrQT,
fNormalizedCtxt->
GetConfig(),
false );
2219 if (ptrQT.isNull()) {
2220 std::string memberName;
2221 llvm::raw_string_ostream stream(memberName);
2222 iField->getNameForDiagnostic(stream, printPol,
true );
2224 Error(
"InspectMembers",
2225 "Cannot retrieve pointee Type for member %s while inspecting class %s",
2226 memberName.c_str(), clname);
2229 memNonPtrType = ptrQT.getTypePtr();
2233 llvm::SmallString<8> arraySize;
2234 const clang::ArrayType* arrType = memNonPtrType->getAsArrayTypeUnsafe();
2235 unsigned arrLevel = 0;
2236 bool haveErrorDueToArray =
false;
2240 const clang::ConstantArrayType* constArrType =
2241 clang::dyn_cast<clang::ConstantArrayType>(arrType);
2243 constArrType->getSize().toStringUnsigned(arraySize);
2246 clang::QualType subArrQT = arrType->getElementType();
2247 if (subArrQT.isNull()) {
2248 std::string memberName;
2249 llvm::raw_string_ostream stream(memberName);
2250 iField->getNameForDiagnostic(stream, printPol,
true );
2252 Error(
"InspectMembers",
2253 "Cannot retrieve QualType for array level %d (i.e. element type of %s) for member %s while inspecting class %s",
2254 arrLevel, subArrQT.getAsString(printPol).c_str(),
2255 memberName.c_str(), clname);
2256 haveErrorDueToArray =
true;
2259 arrType = subArrQT.getTypePtr()->getAsArrayTypeUnsafe();
2261 if (haveErrorDueToArray) {
2266 std::string fieldName;
2267 if (memType->isPointerType()) {
2272 std::string
ioname(iField->getName());
2275 fieldName += arraySize;
2280 clang::CharUnits offset(astContext.toCharUnitsFromBits(recLayout.getFieldOffset(iNField)));
2281 ptrdiff_t fieldOffset = offset.getQuantity();
2291 auto iFiledQtype = iField->getType();
2292 if (
auto tagDecl = iFiledQtype->getAsTagDecl()){
2293 auto declAccess = tagDecl->getAccess();
2294 if (declAccess == AS_private || declAccess == AS_protected) {
2300 insp.
Inspect(const_cast<TClass*>(cl), insp.
GetParent(), fieldName.c_str(), cobj + fieldOffset, isTransient);
2303 const clang::CXXRecordDecl* fieldRecDecl = memNonPtrType->getAsCXXRecordDecl();
2307 std::string sFieldRecName;
2308 if (!ROOT::TMetaUtils::ExtractAttrPropertyFromName(*fieldRecDecl,
"iotype",sFieldRecName)){
2310 clang::QualType(memNonPtrType,0),
2320 insp.
InspectMember(sFieldRecName.c_str(), cobj + fieldOffset,
2321 (fieldName +
'.').c_str(),
transient);
2329 unsigned iNBase = 0;
2330 for (clang::CXXRecordDecl::base_class_const_iterator iBase
2331 = recordDecl->bases_begin(), eBase = recordDecl->bases_end();
2332 iBase != eBase; ++iBase, ++iNBase) {
2333 clang::QualType baseQT = iBase->getType();
2334 if (baseQT.isNull()) {
2335 Error(
"InspectMembers",
2336 "Cannot find QualType for base number %d while inspecting class %s",
2340 const clang::CXXRecordDecl* baseDecl
2341 = baseQT->getAsCXXRecordDecl();
2343 Error(
"InspectMembers",
2344 "Cannot find CXXRecordDecl for base number %d while inspecting class %s",
2349 std::string sBaseName;
2351 std::vector<TClass*> foundClasses;
2353 if (foundClasses.size()==1){
2354 baseCl=foundClasses[0];
2367 std::string qualNameForDiag;
2369 Error(
"InspectMembers",
2370 "Cannot find TClass for base class %s", qualNameForDiag.c_str() );
2375 if (iBase->isVirtual()) {
2378 Error(
"InspectMembers",
2379 "Base %s of class %s is virtual but no object provided",
2380 sBaseName.c_str(), clname);
2388 baseOffset = ci->
GetBaseOffset(baseCi, const_cast<void*>(obj),
2390 if (baseOffset == -1) {
2391 Error(
"InspectMembers",
2392 "Error calculating offset of virtual base %s of class %s",
2393 sBaseName.c_str(), clname);
2396 Error(
"InspectMembers",
2397 "Cannot calculate offset of virtual base %s of class %s",
2398 sBaseName.c_str(), clname);
2403 baseOffset = recLayout.getBaseClassOffset(baseDecl).getQuantity();
2450 bool oldDynLookup =
fInterpreter->isDynamicLookupEnabled();
2502 size_t at = std::string::npos;
2503 while ((at = file_name.find(
"/./")) != std::string::npos)
2504 file_name.replace(at, 3,
"/");
2506 std::string filesStr =
"";
2507 llvm::raw_string_ostream filesOS(filesStr);
2508 clang::SourceManager &SM =
fInterpreter->getCI()->getSourceManager();
2509 cling::ClangInternalState::printIncludedFiles(filesOS, SM);
2512 llvm::SmallVector<llvm::StringRef, 100> files;
2513 llvm::StringRef(filesStr).split(files,
"\n");
2515 std::set<std::string> fileMap;
2517 for (llvm::SmallVector<llvm::StringRef, 100>::const_iterator
2518 iF = files.begin(), iE = files.end(); iF != iE; ++iF) {
2519 if ((*iF) == file_name.c_str())
return kTRUE;
2520 fileMap.insert(*iF);
2523 if (fileMap.empty())
return kFALSE;
2526 TString sFilename(file_name.c_str());
2528 && fileMap.count(sFilename.Data())) {
2536 while (incPath.
Index(
" :") != -1) {
2540 sFilename = file_name.c_str();
2542 && fileMap.count(sFilename.Data())) {
2547 sFilename = file_name.c_str();
2549 cling::DynamicLibraryManager* dyLibManager
2552 if (dyLibManager->isLibraryLoaded(found)) {
2557 const clang::DirectoryLookup *CurDir = 0;
2558 clang::Preprocessor &PP =
fInterpreter->getCI()->getPreprocessor();
2559 clang::HeaderSearch &HS = PP.getHeaderSearchInfo();
2560 const clang::FileEntry *FE = HS.LookupFile(file_name.c_str(),
2561 clang::SourceLocation(),
2564 clang::ArrayRef<std::pair<
const clang::FileEntry *,
2565 const clang::DirectoryEntry *>>(),
2572 if (FE && FE->isValid()) {
2574 clang::SourceManager &SM =
fInterpreter->getCI()->getSourceManager();
2576 clang::FileID FID = SM.translateFile(FE);
2577 if (!FID.isInvalid() && FID.getHashValue() == 0)
2580 clang::SrcMgr::SLocEntry SLocE = SM.getSLocEntry(FID);
2581 if (SLocE.isFile() && SLocE.getFile().getContentCache()->getRawBuffer() == 0)
2583 if (!FID.isInvalid())
2587 sFilename = FE->getName();
2589 && fileMap.count(sFilename.Data())) {
2600 #if defined(R__WIN32) || defined(__CYGWIN__)
2601 HMODULE hModules[1024];
2603 unsigned long cbModules;
2605 hProcess = (
void *)::GetCurrentProcess();
2606 ::EnumProcessModules(hProcess, hModules,
sizeof(hModules), &cbModules);
2608 for (i = 1; i < (cbModules /
sizeof(
void *)); i++) {
2609 static const int bufsize = 260;
2610 wchar_t winname[bufsize];
2611 char posixname[bufsize];
2612 ::GetModuleFileNameExW(hProcess, hModules[i], winname, bufsize);
2613 #if defined(__CYGWIN__)
2614 cygwin_conv_path(CCP_WIN_W_TO_POSIX, winname, posixname, bufsize);
2616 std::wstring wpath = winname;
2617 std::replace(wpath.begin(), wpath.end(),
'\\',
'/');
2618 string path(wpath.begin(), wpath.end());
2619 strncpy(posixname, path.c_str(), bufsize);
2625 #elif defined(R__MACOSX)
2628 const char* imageName = 0;
2629 while ((imageName = _dyld_get_image_name(imageIndex))) {
2636 #elif defined(R__LINUX)
2637 struct PointerNo4_t {
2649 PointerNo4_t* procLinkMap = (PointerNo4_t*)dlopen(0, RTLD_LAZY | RTLD_GLOBAL);
2652 LinkMap_t* linkMap = (LinkMap_t*) ((PointerNo4_t*)procLinkMap->fPtr)->fPtr;
2658 while (iDyLib->fNext) {
2659 iDyLib = iDyLib->fNext;
2664 Error(
"TCling::UpdateListOfLoadedSharedLibraries",
2665 "Platform not supported!");
2676 if (!filename)
return;
2680 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
2681 if (!DLM->isLibraryLoaded(filename)) {
2682 DLM->loadLibrary(filename,
true );
2685 #if defined(R__MACOSX)
2687 if (!strncmp(filename,
"/usr/lib/system/", 16)
2688 || !strncmp(filename,
"/usr/lib/libc++", 15)
2689 || !strncmp(filename,
"/System/Library/Frameworks/", 27)
2690 || !strncmp(filename,
"/System/Library/PrivateFrameworks/", 34)
2691 || !strncmp(filename,
"/System/Library/CoreServices/", 29)
2692 || !strcmp(filename,
"cl_kernels")
2693 || strstr(filename,
"/usr/lib/libSystem")
2694 || strstr(filename,
"/usr/lib/libstdc++")
2695 || strstr(filename,
"/usr/lib/libicucore")
2696 || strstr(filename,
"/usr/lib/libbsm")
2697 || strstr(filename,
"/usr/lib/libobjc")
2698 || strstr(filename,
"/usr/lib/libresolv")
2699 || strstr(filename,
"/usr/lib/libauto")
2700 || strstr(filename,
"/usr/lib/libcups")
2701 || strstr(filename,
"/usr/lib/libDiagnosticMessagesClient")
2702 || strstr(filename,
"/usr/lib/liblangid")
2703 || strstr(filename,
"/usr/lib/libCRFSuite")
2704 || strstr(filename,
"/usr/lib/libpam")
2705 || strstr(filename,
"/usr/lib/libOpenScriptingUtil")
2706 || strstr(filename,
"/usr/lib/libextension"))
2708 #elif defined(__CYGWIN__)
2710 static const int bufsize = 260;
2711 char posixwindir[bufsize];
2712 char *windir = getenv(
"WINDIR");
2714 cygwin_conv_path(CCP_WIN_A_TO_POSIX, windir, posixwindir, bufsize);
2716 snprintf(posixwindir,
sizeof(posixwindir),
"/Windows/");
2717 if (strstr(filename, posixwindir) ||
2718 strstr(filename,
"/usr/bin/cyg"))
2720 #elif defined(R__WIN32)
2721 if (strstr(filename,
"/Windows/"))
2723 #elif defined (R__LINUX)
2724 if (strstr(filename,
"/ld-linux")
2725 || strstr(filename,
"linux-gnu/")
2726 || strstr(filename,
"/libstdc++.")
2727 || strstr(filename,
"/libgcc")
2728 || strstr(filename,
"/libc.")
2729 || strstr(filename,
"/libdl.")
2730 || strstr(filename,
"/libm."))
2748 Error(
"Load",
"Trying to load library (%s) from rootcling.",filename);
2754 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
2755 std::string canonLib = DLM->lookupLibrary(filename);
2756 cling::DynamicLibraryManager::LoadLibResult res
2757 = cling::DynamicLibraryManager::kLoadLibNotFound;
2758 if (!canonLib.empty()) {
2760 res = DLM->loadLibrary(filename, system);
2764 cling::Interpreter::CompilationResult compRes;
2765 cling::MetaProcessor::MaybeRedirectOutputRAII RAII(
fMetaProcessor);
2767 if (compRes == cling::Interpreter::kSuccess)
2768 res = cling::DynamicLibraryManager::kLoadLibSuccess;
2772 if (res == cling::DynamicLibraryManager::kLoadLibSuccess) {
2776 case cling::DynamicLibraryManager::kLoadLibSuccess:
return 0;
2777 case cling::DynamicLibraryManager::kLoadLibAlreadyLoaded:
return 1;
2827 Warning(
"Calc",
"waiting for cling thread to free");
2830 gROOT->SetLineIsProcessing();
2838 cling::Interpreter::CompilationResult cr =
fInterpreter->evaluate(line, valRef);
2839 if (cr != cling::Interpreter::kSuccess) {
2847 if (!valRef.isValid()) {
2856 if (valRef.isVoid()) {
2863 gROOT->SetLineHasBeenProcessed();
2866 return valRef.simplisticCastAs<
long>();
2873 void (*histaddFunc)(
const char*
line))
2878 #if defined(R__MUST_REVISIT)
2879 #if R__MUST_REVISIT(6,2)
2880 Warning(
"SetGetline",
"Cling should support the equivalent of SetGetlineFunc(getlineFunc, histaddFunc)");
2894 || T.deserialized_decls_begin() != T.deserialized_decls_end()
2895 || T.macros_begin() != T.macros_end()
2896 || ((!T.getFirstDecl().isNull()) && ((*T.getFirstDecl().begin()) != T.getWrapperFD()))) {
2913 std::set<TObject*>::iterator iSpecial = ((std::set<TObject*>*)
fgSetOfSpecials)->find(obj);
2930 #if defined(R__MUST_REVISIT)
2931 #if R__MUST_REVISIT(6,2)
2933 Warning(
"Reset",
"Cling should support the equivalent of scratch_upto(&fDictPos)");
2943 #if defined(R__MUST_REVISIT)
2944 #if R__MUST_REVISIT(6,2)
2946 Warning(
"ResetAll",
"Cling should support the equivalent of complete reset (unload everything but the startup decls.");
2973 #if defined(R__MUST_REVISIT)
2974 #if R__MUST_REVISIT(6,2)
2976 Warning(
"ResetGlobalVar",
"Cling should support the equivalent of resetglobalvar(obj)");
2988 #if defined(R__MUST_REVISIT)
2989 #if R__MUST_REVISIT(6,2)
2991 Warning(
"RewindDictionary",
"Cling should provide a way to revert transaction similar to rewinddictionary()");
3002 #if defined(R__MUST_REVISIT)
3003 #if R__MUST_REVISIT(6,2)
3005 Warning(
"DeleteGlobal",
"Cling should provide the equivalent of deleteglobal(obj), see also DeleteVariable.");
3017 #if defined(R__MUST_REVISIT)
3018 #if R__MUST_REVISIT(6,2)
3019 Warning(
"DeleteVariable",
"should do more that just reseting the value to zero");
3024 llvm::StringRef srName(name);
3025 const char* unscopedName =
name;
3026 llvm::StringRef::size_type posScope = srName.rfind(
"::");
3027 const clang::DeclContext* declCtx = 0;
3028 if (posScope != llvm::StringRef::npos) {
3029 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
3030 const clang::Decl* scopeDecl
3031 = lh.findScope(srName.substr(0, posScope),
3032 cling::LookupHelper::WithDiagnostics);
3034 Error(
"DeleteVariable",
"Cannot find enclosing scope for variable %s",
3038 declCtx = llvm::dyn_cast<clang::DeclContext>(scopeDecl);
3040 Error(
"DeleteVariable",
3041 "Enclosing scope for variable %s is not a declaration context",
3045 unscopedName += posScope + 2;
3047 clang::NamedDecl* nVarDecl
3048 = cling::utils::Lookup::Named(&
fInterpreter->getSema(), unscopedName, declCtx);
3050 Error(
"DeleteVariable",
"Unknown variable %s", name);
3053 clang::VarDecl* varDecl = llvm::dyn_cast<clang::VarDecl>(nVarDecl);
3055 Error(
"DeleteVariable",
"Entity %s is not a variable", name);
3059 clang::QualType qType = varDecl->getType();
3063 if (type->isPointerType()) {
3064 int** ppInt = (
int**)
fInterpreter->getAddressOfGlobal(GlobalDecl(varDecl));
3066 if (ppInt) *ppInt = 0;
3076 #if defined(R__MUST_REVISIT)
3077 #if R__MUST_REVISIT(6,2)
3079 Warning(
"SaveContext",
"Cling should provide a way to record a state watermark similar to store_dictposition(&fDictPos)");
3089 #if defined(R__MUST_REVISIT)
3090 #if R__MUST_REVISIT(6,2)
3092 Warning(
"SaveGlobalsContext",
"Cling should provide a way to record a watermark for the list of global variable similar to store_dictposition(&fDictPosGlobals)");
3138 if (!info->IsValid()) {
3162 zombieCandidate =
kTRUE;
3164 if (!info->IsLoaded()) {
3169 zombieCandidate =
kTRUE;
3219 static const char *anonEnum =
"anonymous enum ";
3220 static const int cmplen = strlen(anonEnum);
3222 if (0 == strncmp(name,anonEnum,cmplen)) {
3241 if (isClassOrNamespaceOnly &&
3244 const char *classname =
name;
3255 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
3257 const clang::Decl *decl
3258 = lh.findScope(classname,
3259 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
3260 : cling::LookupHelper::NoDiagnostics,
3264 decl = lh.findScope(buf,
3265 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
3266 : cling::LookupHelper::NoDiagnostics,
3283 clang::ClassTemplateSpecializationDecl *tmpltDecl =
3284 llvm::dyn_cast_or_null<clang::ClassTemplateSpecializationDecl>
3285 (type->getAsCXXRecordDecl());
3286 if (tmpltDecl && !tmpltDecl->getPointOfInstantiation().isValid()) {
3305 if (tci.
Property() & propertiesMask) {
3341 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
3342 const clang::Decl *decl
3343 = lh.findClassTemplate(name,
3344 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
3345 : cling::LookupHelper::NoDiagnostics);
3347 std::string strname =
"std::";
3349 decl = lh.findClassTemplate(strname,
3350 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
3351 : cling::LookupHelper::NoDiagnostics);
3377 cl->
fBase = listOfBase;
3393 D =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
3396 if (
const clang::DeclContext* DC = dyn_cast<clang::DeclContext>(D)) {
3397 cling::Interpreter::PushTransactionRAII deserRAII(
fInterpreter);
3399 llvm::SmallVector< DeclContext *, 4> allDeclContexts;
3400 const_cast< clang::DeclContext *
>(DC)->collectAllContexts(allDeclContexts);
3401 for (llvm::SmallVector<DeclContext*, 4>::iterator declIter = allDeclContexts.begin(), declEnd = allDeclContexts.end();
3402 declIter != declEnd; ++declIter) {
3404 for (clang::DeclContext::decl_iterator DI = (*declIter)->decls_begin(),
3405 DE = (*declIter)->decls_end(); DI != DE; ++DI) {
3406 if (
const clang::EnumDecl* ED = dyn_cast<clang::EnumDecl>(*DI)) {
3409 PrintingPolicy Policy(ED->getASTContext().getPrintingPolicy());
3410 llvm::raw_string_ostream stream(buf);
3411 ED->getNameForDiagnostic(stream, Policy,
false);
3415 const char*
name = buf.c_str();
3417 enumList.
Get(ED, name);
3439 D =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
3443 if (
const clang::DeclContext* DC = dyn_cast<clang::DeclContext>(D)) {
3444 cling::Interpreter::PushTransactionRAII deserRAII(
fInterpreter);
3446 llvm::SmallVector< DeclContext *, 4> allDeclContexts;
3447 const_cast< clang::DeclContext *
>(DC)->collectAllContexts(allDeclContexts);
3448 for (llvm::SmallVector<DeclContext*, 4>::iterator declIter = allDeclContexts.begin(),
3449 declEnd = allDeclContexts.end(); declIter != declEnd; ++declIter) {
3451 for (clang::DeclContext::decl_iterator DI = (*declIter)->decls_begin(),
3452 DE = (*declIter)->decls_end(); DI != DE; ++DI) {
3453 if (
const clang::FunctionTemplateDecl* FTD = dyn_cast<clang::FunctionTemplateDecl>(*DI)) {
3454 funcTempList->
Get(FTD);
3502 if (m->fMethodArgs) {
3513 m->fMethodArgs = arglist;
3552 if (llvm::isa<clang::NamespaceDecl>(cli->
GetDecl())) {
3561 Error(
"GenerateTClass",
3562 "Cannot find %s::Class_Version()! Class version might be wrong.",
3569 if (newvers == -1) {
3577 newvers = callfunc.
ExecInt(0);
3579 Error(
"GenerateTClass",
3580 "Cannot invoke %s::Class_Version()! Class version might be wrong.",
3584 if (newvers != oldvers) {
3601 static void GenerateTClass_GatherInnerIncludes(cling::Interpreter *interp,
TString &includes,
TClingClassInfo *info)
3605 const clang::ClassTemplateSpecializationDecl *templateCl
3606 = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(info->
GetDecl());
3608 for(
unsigned int i=0; i < templateCl->getTemplateArgs().size(); ++i) {
3609 const clang::TemplateArgument &arg( templateCl->getTemplateArgs().get(i) );
3613 if (!uType->isFundamentalType() && !uType->isEnumeralType()) {
3615 const clang::CXXRecordDecl *argdecl = uType->getAsCXXRecordDecl();
3618 TClingClassInfo subinfo(interp,*(argdecl->getASTContext().getRecordType(argdecl).getTypePtr()));
3619 GenerateTClass_GatherInnerIncludes(interp, includes, &subinfo);
3622 llvm::raw_string_ostream OS(Result);
3623 arg.print(argdecl->getASTContext().getPrintingPolicy(),OS);
3624 Warning(
"TCling::GenerateTClass",
"Missing header file for %s",OS.str().c_str());
3639 if (!info || !info->
IsValid()) {
3640 Fatal(
"GenerateTClass",
"Requires a valid ClassInfo object");
3645 std::string classname;
3649 Info(
"GenerateTClass",
"Will (try to) generate the compiled TClass for %s.",classname.c_str());
3653 GenerateTClass_GatherInnerIncludes(
fInterpreter,includes,info);
3659 Error(
"GenerateTClass",
"Even though the dictionary generation for %s seemed successful we can't find the TClass bootstrap!",classname.c_str());
3665 cl =
new TClass(classinfo, version, 0, 0, -1, -1, silent);
3671 cl =
new TClass(classinfo, 1, 0, 0, -1, -1, silent);
3696 if (classes == 0 || classes[0] == 0) {
3700 std::vector<std::string> listClasses;
3702 const char* current = classes, *prev = classes;
3706 if (*current ==
';') {
3707 listClasses.push_back(std::string(prev, current - prev));
3710 else if (*(current + 1) == 0) {
3711 listClasses.push_back(std::string(prev, current + 1 - prev));
3715 std::vector<std::string> listIncludes;
3717 const char* current = includes, *prev = includes;
3721 if (*current ==
';') {
3722 listIncludes.push_back(std::string(prev, current - prev));
3725 else if (*(current + 1) == 0) {
3726 listIncludes.push_back(std::string(prev, current + 1 - prev));
3732 std::vector<std::string>(), std::vector<std::string>());
3753 if (
const ValueDecl* decl = (
const ValueDecl*) d){
3756 if (hasIoName && ioName != name)
return 0;
3774 const clang::Decl* possibleEnum = 0;
3779 const clang::DeclContext* dc = 0;
3780 if (
const clang::Decl* D = cci->
GetDecl()) {
3781 if (!(dc = dyn_cast<clang::NamespaceDecl>(D))) {
3782 dc = dyn_cast<clang::RecordDecl>(D);
3787 possibleEnum = cling::utils::Lookup::Named(&
fInterpreter->getSema(),
name, dc);
3789 Error(
"TCling::GetEnum",
"DeclContext not found for %s .\n", name);
3794 possibleEnum = cling::utils::Lookup::Named(&
fInterpreter->getSema(),
name);
3796 if (possibleEnum && (possibleEnum != (clang::Decl*)-1)
3797 && isa<clang::EnumDecl>(possibleEnum)) {
3798 return possibleEnum;
3810 llvm::StringRef mangled_name = gv->getName();
3825 std::string scopename(demangled_name_c);
3826 free(demangled_name_c);
3832 std::string dataname;
3834 if (!strncmp(scopename.c_str(),
"typeinfo for ",
sizeof(
"typeinfo for ")-1)) {
3835 scopename.erase(0,
sizeof(
"typeinfo for ")-1);
3836 }
if (!strncmp(scopename.c_str(),
"vtable for ",
sizeof(
"vtable for ")-1)) {
3837 scopename.erase(0,
sizeof(
"vtable for ")-1);
3840 std::string::size_type pos = scopename.rfind(
'(');
3841 if (pos != std::string::npos) {
3845 pos = scopename.rfind(
':');
3846 if (pos != std::string::npos) {
3847 if ((pos != 0) && (scopename[pos-1] ==
':')) {
3848 dataname = scopename.substr(pos+1);
3849 scopename.erase(pos-1);
3853 dataname = scopename;
3861 if (scopename.size()) {
3877 Error(
"GetDataMemberWithValue()",
"not implemented");
3887 Error(
"GetDataMemberAtAddr()",
"not implemented");
3897 const char* params,
Bool_t objectIsConst )
3909 func.
SetFunc(&gcl, method, params, &offset);
3915 return mangled_name;
3924 const char* proto,
Bool_t objectIsConst ,
3930 GetMethod(method, proto, objectIsConst, 0 , mode).GetMangledName();
3942 const char* params,
Bool_t objectIsConst )
3954 func.
SetFunc(&gcl, method, params, &offset);
3983 std::vector<DeclId_t>& res)
const
3986 const clang::Decl* CtxDecl
3988 S.Context.getTranslationUnitDecl();
3989 const clang::DeclContext*
3990 DeclCtx = llvm::dyn_cast<
const clang::RecordDecl>(CtxDecl);
3992 DeclCtx = dyn_cast<clang::NamespaceDecl>(CtxDecl);
3993 if (!DeclCtx)
return;
3994 clang::DeclarationName DName
3995 = &S.Context.Idents.get(funcname);
3996 clang::LookupResult
R(S, DName, clang::SourceLocation(),
3997 Sema::LookupOrdinaryName, clang::Sema::ForRedeclaration);
3998 S.LookupQualifiedName(R, const_cast<DeclContext*>(DeclCtx));
3999 if (R.empty())
return;
4001 res.reserve(res.size() + (R.end() - R.begin()));
4002 for (clang::LookupResult::iterator IR = R.begin(), ER = R.end();
4004 if (
const clang::FunctionDecl* FD
4005 = llvm::dyn_cast<const clang::FunctionDecl>(*IR)) {
4006 if (!FD->getDescribedFunctionTemplate()) {
4150 func.
SetFunc(&cl,
function, params, &offset);
4166 const char* params,
Bool_t objectIsConst,
int* error)
4179 void* address = (
void*)((
Long_t)addr + offset);
4186 const char* params,
int* error)
4188 Execute(obj,cl,method,params,
false,error);
4203 Error(
"Execute",
"No method was defined");
4212 if (argc > nparms) {
4213 Error(
"Execute",
"Too many parameters to call %s, got %d but expected at most %d.",method->
GetName(),argc,nparms);
4216 if (nparms != argc) {
4226 Int_t firstDefault = -1;
4227 for (
Int_t i = 0; i < nparms; i ++) {
4234 if (firstDefault >= 0) {
4235 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);
4237 Error(
"Execute",
"Too few arguments to call %s, got only %d but expected %d.",method->
GetName(),argc,nparms);
4243 const char* listpar =
"";
4248 for (
Int_t i = 0; i < argc; i ++) {
4257 chpar += (nxtpar->String()).
ReplaceAll(
"\"",
"\\\"");
4264 complete += nxtpar->String();
4267 listpar = complete.
Data();
4285 const CXXMethodDecl * mdecl = dyn_cast<CXXMethodDecl>(minfo->
GetMethodDecl());
4287 void* address = (
void*)((
Long_t)addr + offset);
4294 const void* args[] ,
4299 Error(
"ExecuteWithArgsAndReturn",
"No method was defined");
4305 func.ExecWithArgsAndReturn(address, args, nargs, ret);
4326 Warning(
"GetTopLevelMacroName",
"Must change return type!");
4373 #if defined(R__MUST_REVISIT)
4374 #if R__MUST_REVISIT(6,0)
4375 Warning(
"GetCurrentMacroName",
"Must change return type!");
4388 TTHREAD_TLS(
char*) t = 0;
4389 TTHREAD_TLS(
unsigned int) tlen = 0;
4391 unsigned int dlen = strlen(typeDesc);
4394 t =
new char[dlen + 1];
4397 const char* s, *template_start;
4398 if (!strstr(typeDesc,
"(*)(")) {
4399 s = strchr(typeDesc,
' ');
4400 template_start = strchr(typeDesc,
'<');
4401 if (!strcmp(typeDesc,
"long long")) {
4402 strlcpy(t, typeDesc, dlen + 1);
4404 else if (!strncmp(typeDesc,
"unsigned ", s + 1 - typeDesc)) {
4405 strlcpy(t, typeDesc, dlen + 1);
4411 else if (s && (template_start == 0 || (s < template_start))) {
4412 strlcpy(t, s + 1, dlen + 1);
4415 strlcpy(t, typeDesc, dlen + 1);
4419 strlcpy(t, typeDesc, dlen + 1);
4422 while (l > 0 && (t[l - 1] ==
'*' || t[l - 1] ==
'&')) {
4436 const std::map<char, unsigned int> keyLenMap = {{
'c',6},{
'n',10},{
't',8},{
'h',7},{
'e',5}};
4438 if (rootmapfile && *rootmapfile) {
4442 std::ifstream file(rootmapfile);
4443 std::string
line; line.reserve(200);
4444 std::string lib_name; line.reserve(100);
4445 bool newFormat=
false;
4446 while (getline(file, line,
'\n')) {
4448 (strstr(line.c_str(),
"Library.")!=
nullptr || strstr(line.c_str(),
"Declare.")!=
nullptr)) {
4454 if (line.compare(0, 9,
"{ decls }") == 0) {
4457 while (getline(file, line,
'\n')) {
4458 if (line[0] ==
'[')
break;
4459 uniqueString->
Append(line);
4462 const char firstChar=line[0];
4463 if (firstChar ==
'[') {
4465 auto brpos = line.find(
']');
4466 if (brpos == string::npos)
continue;
4467 lib_name = line.substr(1, brpos-1);
4469 while( lib_name[nspaces] ==
' ' ) ++nspaces;
4470 if (nspaces) lib_name.replace(0, nspaces,
"");
4472 TString lib_nameTstr(lib_name.c_str());
4473 TObjArray* tokens = lib_nameTstr.Tokenize(
" ");
4477 Info(
"ReadRootmapFile",
"new section for %s", lib_nameTstr.Data());
4480 Info(
"ReadRootmapFile",
"section for %s (library does not exist)", lib_nameTstr.Data());
4487 auto keyLenIt = keyLenMap.find(firstChar);
4488 if (keyLenIt == keyLenMap.end())
continue;
4489 unsigned int keyLen = keyLenIt->second;
4491 const char *keyname = line.c_str()+keyLen;
4493 Info(
"ReadRootmapFile",
"class %s in %s", keyname, lib_name.c_str());
4496 if(lib_name != isThere->GetValue()){
4497 if (firstChar ==
'n') {
4499 Info(
"ReadRootmapFile",
"namespace %s found in %s is already in %s",
4500 keyname, lib_name.c_str(), isThere->GetValue());
4501 }
else if (firstChar ==
'h'){
4503 lib_name+=isThere->GetValue();
4507 Warning(
"ReadRootmapFile",
"%s %s found in %s is already in %s", line.substr(0, keyLen).c_str(),
4508 keyname, lib_name.c_str(), isThere->GetValue());
4512 Info(
"ReadRootmapFile",
"Key %s was already defined for %s", keyname, lib_name.c_str());
4553 #if defined(R__MACOSX) && (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR)
4585 using namespace clang;
4587 class ExtVisibleStorageAdder:
public RecursiveASTVisitor<ExtVisibleStorageAdder>{
4593 ExtVisibleStorageAdder(std::unordered_set<const NamespaceDecl*>& nsSet): fNSSet(nsSet) {};
4594 bool VisitNamespaceDecl(NamespaceDecl* nsDecl) {
4598 nsDecl->setHasExternalVisibleStorage();
4599 fNSSet.insert(nsDecl);
4603 std::unordered_set<const NamespaceDecl*>& fNSSet;
4649 for (
Int_t j = 0; j < i; j++) {
4660 Info(
"LoadLibraryMap",
"%s", d.
Data());
4671 Info(
"LoadLibraryMap",
" rootmap file: %s", p.
Data());
4693 Warning(
"LoadLibraryMap",
"please rename %s to end with \".rootmap\"", p.
Data());
4706 if (rootmapfile && *rootmapfile) {
4713 else if (res == -3) {
4725 if (!strncmp(cls.
Data(),
"Library.", 8) && cls.
Length() > 8) {
4744 Info(
"LoadLibraryMap",
"class %s in %s", cls.
Data(), wlib);
4747 Info(
"LoadLibraryMap",
"class %s in %s (library does not exist)", cls.
Data(), lib);
4762 else if (!strncmp(cls.
Data(),
"Declare.", 8) && cls.
Length() > 8) {
4772 cling::Transaction* T =
nullptr;
4774 assert(cling::Interpreter::kSuccess == compRes &&
"A declaration in a rootmap could not be compiled");
4776 if (compRes!=cling::Interpreter::kSuccess){
4778 "Problems in %s declaring '%s' were encountered.", rootmapfile, uniqueString.
Data()) ;
4783 for (
auto declIt = T->decls_begin(); declIt < T->decls_end(); ++declIt) {
4784 if (declIt->m_DGR.isSingleDecl()) {
4785 if (Decl* D = declIt->m_DGR.getSingleDecl()) {
4786 if (NamespaceDecl* NSD = dyn_cast<NamespaceDecl>(D)) {
4787 evsAdder.TraverseDecl(NSD);
4822 for (
Int_t ilib = 0; ilib < nrSharedLibs; ilib++) {
4829 TString rootMapBaseStr = sharedLibBaseStr;
4830 if (sharedLibBaseStr.
EndsWith(
".dll")) {
4833 else if (sharedLibBaseStr.
EndsWith(
".DLL")) {
4836 else if (sharedLibBaseStr.
EndsWith(
".so")) {
4839 else if (sharedLibBaseStr.
EndsWith(
".sl")) {
4842 else if (sharedLibBaseStr.
EndsWith(
".dl")) {
4845 else if (sharedLibBaseStr.
EndsWith(
".a")) {
4849 Error(
"ReloadAllSharedLibraryMaps",
"Unknown library type %s", sharedLibBaseStr.
Data());
4853 rootMapBaseStr +=
".rootmap";
4856 Error(
"ReloadAllSharedLibraryMaps",
"Could not find rootmap %s in path", rootMap);
4863 Error(
"ReloadAllSharedLibraryMaps",
"Error loading map %s", rootMap);
4898 if (!
fMapfile || !library || !*library) {
4906 size_t len = libname.
Length();
4922 if (!strncmp(cls.
Data(),
"Library.", 8) && cls.
Length() > 8) {
4931 if (!strncmp(lib, libname.
Data(), len)) {
4933 Error(
"UnloadLibraryMap",
"entry for <%s, %s> not found in library map table", cls.
Data(), lib);
4941 TString library_rootmap(library);
4942 if (!library_rootmap.
EndsWith(
".rootmap"))
4943 library_rootmap.
Append(
".rootmap");
4998 free(demangled_name);
5014 std::string demangled_name(demangled_name_c);
5015 free(demangled_name_c);
5028 result =
AutoLoad(demangled_name.c_str(), knowDictNotLoaded);
5053 Info(
"TCling::AutoLoad",
5054 "Trying to autoload for %s", cls);
5060 Info(
"TCling::AutoLoad",
5061 "Disabled due to gROOT or gInterpreter being invalid/not ready (the class name is %s)", cls);
5068 Info(
"TCling::AutoLoad",
5069 "Explicitly disabled (the class name is %s)", cls);
5090 if (
gROOT->LoadClass(cls, deplib) == 0) {
5092 Info(
"TCling::AutoLoad",
5093 "loaded dependent library %s for %s", deplib, cls);
5097 Error(
"TCling::AutoLoad",
5098 "failure loading dependent library %s for %s",
5103 if (lib && lib[0]) {
5104 if (
gROOT->LoadClass(cls, lib) == 0) {
5106 Info(
"TCling::AutoLoad",
5107 "loaded library %s for %s", lib, cls);
5112 Error(
"TCling::AutoLoad",
5113 "failure loading library %s for %s", lib, cls);
5128 cling::Interpreter *interpreter)
5131 Sema &SemaR = interpreter->getSema();
5132 ASTContext&
C = SemaR.getASTContext();
5133 Preprocessor &PP = SemaR.getPreprocessor();
5134 Parser&
P =
const_cast<Parser&
>(interpreter->getParser());
5135 Preprocessor::CleanupAndRestoreCacheRAII cleanupRAII(PP);
5136 Parser::ParserCurTokRestoreRAII savedCurToken(P);
5139 Token& Tok =
const_cast<Token&
>(P.getCurToken());
5140 Tok.setKind(tok::semi);
5146 Sema::ContextAndScopeRAII pushedDCAndS(SemaR, C.getTranslationUnitDecl(),
5148 std::string code = gNonInterpreterClassDef ;
5155 code += (
"#include \"");
5159 code += (
"#ifdef __ROOTCLING__\n"
5160 "#undef __ROOTCLING__\n"
5161 + gInterpreterClassDef +
5164 cling::Interpreter::CompilationResult cr;
5170 clangDiagSuppr diagSuppr(SemaR.getDiagnostics());
5172 #if defined(R__MUST_REVISIT)
5173 #if R__MUST_REVISIT(6,2)
5174 Warning(
"TCling::RegisterModule",
"Diagnostics suppression should be gone by now.");
5178 cr = interpreter->parseForModule(code);
5196 Int_t nHheadersParsed = 0;
5199 bool skipFirstEntry =
false;
5200 std::vector<std::string> autoparseKeys;
5201 if (strchr(cls,
'<')) {
5207 if (!autoparseKeys.empty()){
5208 TString templateName(autoparseKeys[0]);
5209 auto tokens = templateName.
Tokenize(
"::");
5210 clang::NamedDecl* previousScopeAsNamedDecl =
nullptr;
5211 clang::DeclContext* previousScopeAsContext =
nullptr;
5212 for (
auto const & scopeObj : *tokens){
5213 auto scopeName = ((
TObjString*) scopeObj)->String().Data();
5214 previousScopeAsNamedDecl = cling::utils::Lookup::Named(&
fInterpreter->getSema(), scopeName, previousScopeAsContext);
5216 if ((clang::NamedDecl*)-1 == previousScopeAsNamedDecl)
break;
5217 previousScopeAsContext = llvm::dyn_cast_or_null<clang::DeclContext>(previousScopeAsNamedDecl);
5218 if (!previousScopeAsContext)
break;
5222 if (
auto templateDecl = llvm::dyn_cast_or_null<clang::ClassTemplateDecl>(previousScopeAsNamedDecl)) {
5223 if (
auto templatedDecl = templateDecl->getTemplatedDecl()) {
5224 skipFirstEntry =
nullptr != templatedDecl->getDefinition();
5230 if (topLevel) autoparseKeys.emplace_back(cls);
5232 for (
const auto & apKeyStr : autoparseKeys) {
5233 if (skipFirstEntry) {
5234 skipFirstEntry=
false;
5237 if (apKeyStr.empty())
continue;
5238 const char *apKey = apKeyStr.c_str();
5242 Info(
"TCling::AutoParse",
5243 "Starting autoparse for %s\n", apKey);
5248 const cling::Transaction *T =
fInterpreter->getCurrentTransaction();
5250 auto const &hNamesPtrs =
iter->second;
5252 Info(
"TCling::AutoParse",
5253 "We can proceed for %s. We have %s headers.", apKey, std::to_string(hNamesPtrs.size()).c_str());
5255 for (
auto & hName : hNamesPtrs) {
5257 if (0 !=
fPayloads.count(normNameHash)) {
5258 float initRSSval=0.f, initVSIZEval=0.f;
5260 (
void) initVSIZEval;
5263 "Parsing full payload for %s", apKey);
5270 if (cRes != cling::Interpreter::kSuccess) {
5271 if (hName[0] ==
'\n')
5272 Error(
"AutoParse",
"Error parsing payload code for class %s with content:\n%s", apKey, hName);
5281 Info(
"Autoparse",
">>> RSS key %s - before %.3f MB - after %.3f MB - delta %.3f MB", apKey, initRSSval, endRSSval, endRSSval-initRSSval);
5282 Info(
"Autoparse",
">>> VSIZE key %s - before %.3f MB - after %.3f MB - delta %.3f MB", apKey, initVSIZEval, endVSIZEval, endVSIZEval-initVSIZEval);
5288 "Parsing single header %s", hName);
5291 if (cRes != cling::Interpreter::kSuccess) {
5292 Error(
"AutoParse",
"Error parsing headerfile %s for class %s.", hName, apKey);
5304 if (strchr(apKey,
'<')) {
5311 return nHheadersParsed;
5332 Info(
"TCling::AutoParse",
5333 "Trying to autoparse for %s", cls);
5349 if (nHheadersParsed != 0) {
5368 return nHheadersParsed > 0 ? 1 : 0;
5381 mangled_name.c_str())) {
5392 std::string
name(demangled_name_c);
5393 free(demangled_name_c);
5401 if (!strncmp(name.c_str(),
"typeinfo for ",
sizeof(
"typeinfo for ")-1)) {
5402 name.erase(0,
sizeof(
"typeinfo for ")-1);
5403 }
else if (!strncmp(name.c_str(),
"vtable for ",
sizeof(
"vtable for ")-1)) {
5404 name.erase(0,
sizeof(
"vtable for ")-1);
5405 }
else if (!strncmp(name.c_str(),
"operator",
sizeof(
"operator")-1)
5406 && !isalnum(name[
sizeof(
"operator")])) {
5408 name.erase(0,
sizeof(
"operator")-1);
5409 std::string::size_type pos = name.rfind(
'(');
5410 if (pos != std::string::npos) {
5411 name.erase(0, pos + 1);
5412 pos = name.find(
",");
5413 if (pos != std::string::npos) {
5417 pos = name.rfind(
" const");
5418 if (pos != std::string::npos) {
5419 name.erase(pos, strlen(
" const"));
5421 while (!name.empty() && strchr(
"&*", name.back()))
5422 name.erase(name.length() - 1);
5426 std::string::size_type pos = name.rfind(
'(');
5427 if (pos != std::string::npos) {
5431 pos = name.rfind(
':');
5432 if (pos != std::string::npos) {
5433 if ((pos != 0) && (name[pos-1] ==
':')) {
5450 while (libs.
Tokenize(lib, posLib)) {
5460 void* addr = llvm::sys::DynamicLibrary::SearchForAddressOfSymbol(mangled_name.c_str());
5487 const NamedDecl* ND =
static_cast<const NamedDecl*
>(vTD);
5488 const TagDecl* td = dyn_cast<TagDecl>(ND);
5492 tdDef = td->getDefinition();
5498 if (llvm::isa<clang::FunctionDecl>(td->getDeclContext())) {
5502 clang::QualType
type( td->getTypeForDecl(), 0 );
5504 auto declName=ND->getNameAsString();
5512 name = ND->getNameAsString();
5527 const TagDecl* tdOld = llvm::dyn_cast_or_null<TagDecl>(cci->
GetDecl());
5528 if (!tdOld || (tdDef && tdDef != tdOld)) {
5585 std::set<TClass*> modifiedTClasses;
5590 bool isTUTransaction =
false;
5591 if (T.decls_end()-T.decls_begin() == 1 && !T.hasNestedTransactions()) {
5592 clang::Decl* FirstDecl = *(T.decls_begin()->m_DGR.begin());
5593 if (clang::TranslationUnitDecl* TU
5594 = dyn_cast<clang::TranslationUnitDecl>(FirstDecl)) {
5597 isTUTransaction =
true;
5605 cling::Interpreter::PushTransactionRAII RAII(
fInterpreter);
5606 for (clang::DeclContext::decl_iterator TUI = TU->decls_begin(),
5607 TUE = TU->decls_end(); TUI != TUE; ++TUI)
5612 std::set<const void*> TransactionDeclSet;
5613 if (!isTUTransaction && T.decls_end() - T.decls_begin()) {
5614 const clang::Decl* WrapperFD = T.getWrapperFD();
5615 for (cling::Transaction::const_iterator
I = T.decls_begin(),
E = T.decls_end();
5617 if (
I->m_Call != cling::Transaction::kCCIHandleTopLevelDecl
5618 &&
I->m_Call != cling::Transaction::kCCIHandleTagDeclDefinition)
5621 for (DeclGroupRef::const_iterator DI =
I->m_DGR.begin(),
5622 DE =
I->m_DGR.end(); DI != DE; ++DI) {
5623 if (*DI == WrapperFD)
5625 TransactionDeclSet.insert(*DI);
5626 ((
TCling*)
gCling)->HandleNewDecl(*DI,
false, modifiedTClasses);
5633 for (cling::Transaction::const_iterator
I = T.deserialized_decls_begin(),
5634 E = T.deserialized_decls_end();
I !=
E; ++
I) {
5635 for (DeclGroupRef::const_iterator DI =
I->m_DGR.begin(),
5636 DE =
I->m_DGR.end(); DI != DE; ++DI)
5637 if (TransactionDeclSet.find(*DI) == TransactionDeclSet.end()) {
5653 std::vector<TClass*> modifiedTClassesDiff(modifiedTClasses.size());
5654 std::vector<TClass*>::iterator it;
5655 it = set_difference(modifiedTClasses.begin(), modifiedTClasses.end(),
5658 modifiedTClassesDiff.begin());
5659 modifiedTClassesDiff.resize(it - modifiedTClassesDiff.begin());
5662 ((
TCling*)
gCling)->GetModTClasses().insert(modifiedTClassesDiff.begin(),
5663 modifiedTClassesDiff.end());
5664 for (std::vector<TClass*>::const_iterator
I = modifiedTClassesDiff.begin(),
5665 E = modifiedTClassesDiff.end();
I !=
E; ++
I) {
5667 if (!
gROOT->GetListOfClasses()->FindObject(*
I)) {
5671 cling::Interpreter::PushTransactionRAII RAII(
fInterpreter);
5691 for (DeclContext::decl_iterator RI = DC->decls_begin(), RE = DC->decls_end(); RI != RE; ++RI) {
5692 if (isa<VarDecl>(*RI) || isa<FieldDecl>(*RI)) {
5693 const clang::ValueDecl* VD = dyn_cast<ValueDecl>(*RI);
5697 datamembers->
Unload(var);
5700 }
else if (
const FunctionDecl* FD = dyn_cast<FunctionDecl>(*RI)) {
5703 functions->
Unload(
function);
5704 function->Update(0);
5706 }
else if (
const EnumDecl* ED = dyn_cast<EnumDecl>(*RI)) {
5714 if (enumConst && enumConst->IsValid()) {
5715 datamembers->
Unload(enumConst);
5716 enumConst->Update(0);
5722 }
else if (
const FunctionTemplateDecl* FTD = dyn_cast<FunctionTemplateDecl>(*RI)) {
5724 if (functiontemplate) {
5725 functiontemplates->
Unload(functiontemplate);
5726 functiontemplate->
Update(0);
5743 cling::Transaction::const_nested_iterator iNested = T.nested_begin();
5744 for(cling::Transaction::const_iterator
I = T.decls_begin(),
E = T.decls_end();
5746 if (
I->m_Call == cling::Transaction::kCCIHandleVTable)
5749 if (
I->m_Call == cling::Transaction::kCCINone) {
5755 for (DeclGroupRef::const_iterator DI =
I->m_DGR.begin(),
5756 DE =
I->m_DGR.end(); DI != DE; ++DI) {
5760 if ( (*DI)->isFromASTFile() )
5764 if (isa<VarDecl>(*DI) || isa<EnumConstantDecl>(*DI)) {
5782 }
else if (
const FunctionDecl* FD = dyn_cast<FunctionDecl>(*DI)) {
5784 if (
function &&
function->IsValid()) {
5785 functions->
Unload(
function);
5786 function->Update(0);
5789 }
else if (
const FunctionTemplateDecl* FTD = dyn_cast<FunctionTemplateDecl>(*DI)) {
5791 if (functiontemplate) {
5792 functiontemplates->
Unload(functiontemplate);
5793 functiontemplate->
Update(0);
5796 }
else if (
const EnumDecl* ED = dyn_cast<EnumDecl>(*DI)) {
5799 TIter iEnumConst(e->GetConstants());
5805 globals->
Unload(enumConst);
5806 enumConst->Update(0);
5814 }
else if (
const clang::RecordDecl* RD = dyn_cast<RecordDecl>(*DI)) {
5815 std::vector<TClass*> vectTClass;
5817 if (RD->isCompleteDefinition()) {
5819 for (std::vector<TClass*>::iterator CI = vectTClass.begin(), CE = vectTClass.end();
5822 (*CI)->ResetClassInfo();
5827 }
else if (
const clang::NamespaceDecl* ND = dyn_cast<NamespaceDecl>(*DI)) {
5828 std::vector<TClass*> vectTClass;
5830 for (std::vector<TClass*>::iterator CI = vectTClass.begin(), CE = vectTClass.end();
5833 if (ND->isOriginalNamespace()) {
5834 (*CI)->ResetClassInfo();
5856 auto const &hNamesPtrs =
iter->second;
5857 for (
auto &hName : hNamesPtrs) {
5859 Info(
"TransactionRollback",
5860 "Restoring ability to autoaparse: %s", hName);
5899 if (!cls || !*cls) {
5907 const char* libs = libs_record->
GetValue();
5908 return (*libs) ? libs : 0;
5925 const char* libs = libs_record->
GetValue();
5926 return (*libs) ? libs : 0;
5941 if (!
fMapfile || !lib || !lib[0]) {
5951 size_t len = libname.
Length();
5953 const char* libs = rec->
GetValue();
5954 if (!strncmp(libs, libname.
Data(), len) && strlen(libs) >= len
5955 && (!libs[len] || libs[len] ==
' ' || libs[len] ==
'.')) {
5968 #if defined(R__MUST_REVISIT)
5969 #if R__MUST_REVISIT(6,2)
5970 Warning(
"IsErrorMessagesEnabled",
"Interface not available yet.");
5982 #if defined(R__MUST_REVISIT)
5983 #if R__MUST_REVISIT(6,2)
5984 Warning(
"SetErrorMessages",
"Interface not available yet.");
6000 llvm::SmallVector<std::string, 10> includePaths;
6002 fInterpreter->GetIncludePaths(includePaths,
false,
true);
6003 if (
const size_t nPaths = includePaths.size()) {
6004 assert(!(nPaths & 1) &&
"GetIncludePath, number of paths and options is not equal");
6006 for (
size_t i = 0; i < nPaths; i += 2) {
6011 if (includePaths[i] !=
"-I")
6045 assert(fout != 0 &&
"DisplayIncludePath, 'fout' parameter is null");
6047 llvm::SmallVector<std::string, 10> includePaths;
6049 fInterpreter->GetIncludePaths(includePaths,
false,
true);
6050 if (
const size_t nPaths = includePaths.size()) {
6051 assert(!(nPaths & 1) &&
"DisplayIncludePath, number of paths and options is not equal");
6053 std::string allIncludes(
"include path:");
6054 for (
size_t i = 0; i < nPaths; i += 2) {
6056 allIncludes += includePaths[i];
6058 if (includePaths[i] !=
"-I")
6060 allIncludes += includePaths[i + 1];
6063 fprintf(fout,
"%s\n", allIncludes.c_str());
6082 #if defined(R__MUST_REVISIT)
6083 #if R__MUST_REVISIT(6,2)
6084 Warning(
"GenericError",
"Interface not available yet.");
6114 Error(
"Getgvp",
"This was controlling the behavior of the wrappers for object construction and destruction.\nThis is now a nop and likely change the behavior of the calling routines.");
6122 Error(
"Getp2f2funcname",
"Will not be implemented: "
6123 "all function pointers are compiled!");
6132 #if defined(R__MUST_REVISIT)
6133 #if R__MUST_REVISIT(6,2)
6134 Warning(
"GetSecurityError",
"Interface not available yet.");
6145 cling::Interpreter::CompilationResult compRes;
6146 cling::MetaProcessor::MaybeRedirectOutputRAII RAII(
fMetaProcessor);
6148 return compRes == cling::Interpreter::kFailure;
6159 return (
fInterpreter->declare(text) == cling::Interpreter::kSuccess);
6167 TTHREAD_TLS_DECL(std::string,buffer);
6169 return buffer.c_str();
6235 #if defined(R__MUST_REVISIT)
6236 #if R__MUST_REVISIT(6,2)
6237 Warning(
"SetErrmsgcallback",
"Interface not available yet.");
6249 Error(
"Setgvp",
"This was controlling the behavior of the wrappers for object construction and destruction.\nThis is now a nop and likely change the behavior of the calling routines.");
6257 Error(
"SetRTLD_NOW()",
"Will never be implemented! Don't use!");
6264 Error(
"SetRTLD_LAZY()",
"Will never be implemented! Don't use!");
6279 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
6280 std::string canonical = DLM->lookupLibrary(path);
6281 if (canonical.empty()) {
6285 cling::Interpreter::CompilationResult compRes;
6286 cling::MetaProcessor::MaybeRedirectOutputRAII RAII(
fMetaProcessor);
6288 return compRes == cling::Interpreter::kFailure;
6304 using namespace cling;
6318 if (value.isValid() && value.needsManagedAllocation()) {
6331 cling::Interpreter *interpreter = ((
TCling*)
gCling)->GetInterpreter();
6341 auto iSpecObj = iSpecObjMap->second.find(Name);
6342 if (iSpecObj != iSpecObjMap->second.end()) {
6344 return iSpecObj->second;
6350 Sema &SemaR = interpreter->getSema();
6351 ASTContext&
C = SemaR.getASTContext();
6352 Preprocessor &PP = SemaR.getPreprocessor();
6353 Parser&
P =
const_cast<Parser&
>(interpreter->getParser());
6354 Preprocessor::CleanupAndRestoreCacheRAII cleanupRAII(PP);
6355 Parser::ParserCurTokRestoreRAII savedCurToken(P);
6358 Token& Tok =
const_cast<Token&
>(P.getCurToken());
6359 Tok.setKind(tok::semi);
6365 Sema::ContextAndScopeRAII pushedDCAndS(SemaR, C.getTranslationUnitDecl(),
6368 TObject* specObj =
gROOT->FindSpecialObject(Name, LookupCtx);
6371 Error(
"GetObjectAddress",
"Got a special object without LookupCtx!");
6385 clang::CXXRecordDecl* klass)
const
6387 using namespace clang;
6388 ASTContext& Ctx = klass->getASTContext();
6389 FriendDecl::FriendUnion friendUnion(
function);
6392 FriendDecl* friendDecl = FriendDecl::Create(Ctx, klass, sl, friendUnion, sl);
6393 klass->pushFriendDecl(friendDecl);
6407 if (func)
return ((
TClingCallFunc*)func)->GetDecl()->getCanonicalDecl();
6478 f->
Exec(address, &val);
6492 const void* args[] ,
6659 f->
SetFunc(ci, method, params, offset);
6668 f->
SetFunc(ci, method, params, objectIsConst, offset);
6696 f->
SetFuncProto(ci, method, proto, objectIsConst, offset, mode);
6706 llvm::SmallVector<clang::QualType, 4> funcProto;
6707 for (std::vector<TypeInfo_t*>::const_iterator
iter = proto.begin(), end = proto.end();
6721 llvm::SmallVector<clang::QualType, 4> funcProto;
6722 for (std::vector<TypeInfo_t*>::const_iterator
iter = proto.begin(), end = proto.end();
6726 f->
SetFuncProto(ci, method, funcProto, objectIsConst, offset, mode);
6741 if (!declid)
return kFALSE;
6743 const clang::Decl *scope;
6745 else scope =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
6747 const clang::Decl *decl =
reinterpret_cast<const clang::Decl*
>(declid);
6748 const clang::DeclContext *ctxt = clang::Decl::castToDeclContext(scope);
6749 if (!decl || !ctxt)
return kFALSE;
6750 if (decl->getDeclContext()->Equals(ctxt))
6752 else if (decl->getDeclContext()->isTransparentContext() &&
6753 decl->getDeclContext()->getParent()->Equals(ctxt))
6825 return TClinginfo->
GetMethodNArg(method, proto, objectIsConst, mode);
6850 TClinginfo->
Init(name);
6859 TClinginfo->
Init(tagnum);
6867 return TClinginfo->
IsBase(name);
6898 return TClinginfo->
IsValidMethod(method, proto,
false, offset, mode);
6906 return TClinginfo->
IsValidMethod(method, proto, objectIsConst, offset, mode);
6914 return TClinginfo->
Next();
6962 return TClinginfo->
Size();
6970 return TClinginfo->
Tagnum();
6986 TTHREAD_TLS_DECL(std::string,
output);
6996 return TClinginfo->
Name();
7004 return TClinginfo->
Title();
7041 ClassInfo_t* base)
const
7054 return TClinginfo->
Next();
7062 return TClinginfo->
Next(onlyDirect);
7070 return TClinginfo->
Offset(address, isDerivedObject);
7083 return TClinginfo->
GetBaseOffset(TClinginfoBase, address, isDerivedObject);
7099 return (ClassInfo_t *)TClinginfo->
GetBase();
7107 return TClinginfo->
Tagnum();
7115 TTHREAD_TLS_DECL(std::string,
output);
7125 return TClinginfo->
Name();
7170 const clang::Decl* decl =
reinterpret_cast<const clang::Decl*
>(declid);
7171 const clang::ValueDecl* vd = llvm::dyn_cast_or_null<clang::ValueDecl>(decl);
7204 return TClinginfo->
Next();
7212 return TClinginfo->
Offset();
7260 return TClinginfo->
Name();
7268 return TClinginfo->
Title();
7275 TTHREAD_TLS_DECL(std::string,
result);
7286 Decl* decl =
static_cast<Decl*
>(
const_cast<void*
>(declId));
7287 ASTContext &
C = decl->getASTContext();
7288 SourceRange commentRange;
7289 decl->addAttr(
new (C) AnnotateAttr( commentRange, C, attribute, 0 ) );
7300 cling::Interpreter &interp,
7303 const clang::TypeDecl* td = llvm::dyn_cast<clang::TypeDecl>(decl->getDeclContext());
7306 clang::QualType qualType(td->getTypeForDecl(),0);
7308 unsigned int level = 0;
7309 for(
size_t cursor = name.length()-1; cursor != 0; --cursor) {
7310 if (name[cursor] ==
'>') ++level;
7311 else if (name[cursor] ==
'<' && level) --level;
7312 else if (level == 0 && name[cursor] ==
':') {
7313 name.erase(0,cursor+1);
7324 if (llvm::isa<clang::CXXConstructorDecl>(decl))
7328 }
else if (llvm::isa<clang::CXXDestructorDecl>(decl))
7331 output.insert(output.begin(),
'~');
7333 llvm::raw_string_ostream stream(output);
7334 decl->getNameForDiagnostic(stream, decl->getASTContext().getPrintingPolicy(),
false);
7364 return (FuncTempInfo_t*)
const_cast<void*
>(declid);
7375 return (FuncTempInfo_t*)ft_info;
7395 if (!ft_info)
return 0;
7396 const clang::FunctionTemplateDecl *ft = (
const clang::FunctionTemplateDecl*)ft_info;
7397 return ft->getTemplateParameters()->size();
7406 if (!ft_info)
return 0;
7407 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
7408 return ft->getTemplateParameters()->getMinRequiredArguments();
7416 if (!ft_info)
return 0;
7421 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
7423 switch (ft->getAccess()) {
7424 case clang::AS_public:
7427 case clang::AS_protected:
7430 case clang::AS_private:
7433 case clang::AS_none:
7434 if (ft->getDeclContext()->isNamespace())
7442 const clang::FunctionDecl *fd = ft->getTemplatedDecl();
7443 if (
const clang::CXXMethodDecl *md =
7444 llvm::dyn_cast<clang::CXXMethodDecl>(fd)) {
7445 if (md->getTypeQualifiers() & clang::Qualifiers::Const) {
7448 if (md->isVirtual()) {
7454 if (
const clang::CXXConstructorDecl *cd =
7455 llvm::dyn_cast<clang::CXXConstructorDecl>(md)) {
7456 if (cd->isExplicit()) {
7460 else if (
const clang::CXXConversionDecl *cd =
7461 llvm::dyn_cast<clang::CXXConversionDecl>(md)) {
7462 if (cd->isExplicit()) {
7476 if (!ft_info)
return;
7477 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
7489 if (!ft_info)
return;
7490 const clang::FunctionTemplateDecl *ft = (
const clang::FunctionTemplateDecl*)ft_info;
7494 if (
const RedeclarableTemplateDecl *AnnotFD
7496 if (AnnotateAttr *
A = AnnotFD->getAttr<AnnotateAttr>()) {
7497 output =
A->getAnnotation().str();
7501 if (!ft->isFromASTFile()) {
7551 const clang::Decl* decl =
reinterpret_cast<const clang::Decl*
>(declid);
7553 const clang::FunctionDecl* fd = llvm::dyn_cast_or_null<clang::FunctionDecl>(decl);
7585 return info->
NArg();
7601 return info->
Next();
7625 return (TypeInfo_t*)info->
Type();
7633 TTHREAD_TLS_DECL(
TString, mangled_name);
7635 return mangled_name;
7678 return info->
Title();
7697 if (info && info->
IsValid()) {
7699 clang::QualType QT( typeinfo->
GetQualType().getCanonicalType() );
7700 if (QT->isEnumeralType()) {
7702 }
else if (QT->isPointerType()) {
7704 QT = llvm::cast<clang::PointerType>(QT)->getPointeeType();
7705 if ( QT->isCharType() ) {
7710 }
else if ( QT->isFloatingType() ) {
7711 int sz = typeinfo->
Size();
7712 if (sz == 4 || sz == 8) {
7718 }
else if ( QT->isIntegerType() ) {
7719 int sz = typeinfo->
Size();
7772 return (MethodArgInfo_t*)
7789 return info->
Next();
7813 return info->
Name();
7873 TClinginfo->
Init(name);
7889 return TClinginfo->
Name();
7913 return TClinginfo->
Size();
7963 const char*
name)
const
7967 TClinginfo->
Init(name);
7983 return TClinginfo->
Next();
7999 return TClinginfo->
Size();
8015 return TClinginfo->
Name();
8023 return TClinginfo->
Title();
int TCling__AutoLoadCallback(const char *className)
virtual TObject * FindObject(const TObject *obj) const
Find object using its hash value (returned by its Hash() member).
virtual MethodArgInfo_t * MethodArgInfo_Factory() const
Describe Streamer information for one class version.
const char * GetIncludePath()
Refresh the list of include paths known to the interpreter and return it with -I prepended.
void ResetCaches()
To clean out all caches.
virtual Long_t MethodInfo_Property(MethodInfo_t *minfo) const
virtual Long_t ClassInfo_ClassProperty(ClassInfo_t *info) const
long TypeProperty() const
virtual const char * BaseName(const char *pathname)
Base name of a file name. Base name of /user/root is root.
virtual Int_t GetEntries() const
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
virtual void SetTempLevel(int val) const
Create / close a scope for temporaries.
const clang::FunctionTemplateDecl * GetFunctionTemplate(const char *fname) const
Ssiz_t Last(char c) const
Find last occurrence of a character c.
virtual void SetRcName(const char *name)
TObject * GetObjectAddress(const char *Name, void *&LookupCtx)
If the interpreter encounters Name, check whether that is an object ROOT could retrieve.
A collection of TDataMember objects designed for fast access given a DeclId_t and for keep track of T...
The TEnum class implements the enum type.
virtual DeclId_t GetDataMemberAtAddr(const void *addr) const
Return pointer to cling DeclId for a data member with a given name.
virtual TString SplitAclicMode(const char *filename, TString &mode, TString &args, TString &io) const
This method split a filename of the form: ~~~ {.cpp} [path/]macro.C[+|++[k|f|g|O|c|s|d|v|-]][(args)]...
int TCling__IsAutoLoadNamespaceCandidate(const clang::NamespaceDecl *nsDecl)
This class defines an abstract interface to a generic command line interpreter.
int TCling__CompileMacro(const char *fileName, const char *options)
const char * Name() const
void * GetInterfaceMethod(TClass *cl, const char *method, const char *params, Bool_t objectIsConst=kFALSE)
Return pointer to cling interface function for a method of a class with parameters params (params is ...
static clang::ClassTemplateDecl * FindTemplateInNamespace(clang::Decl *decl)
Find a template decl within N nested namespaces, 0<=N
virtual void SetRTLD_NOW() const
DeclId_t GetFunctionWithValues(ClassInfo_t *cl, const char *method, const char *params, Bool_t objectIsConst=kFALSE)
Return pointer to cling DeclId for a method of a class with a certain prototype, i.e.
void TransactionRollback(const cling::Transaction &T)
virtual int TypedefInfo_Size(TypedefInfo_t *tinfo) const
virtual TVirtualMutex * Factory(Bool_t=kFALSE)=0
virtual void SetAllocunlockfunc(void(*)()) const
[Place holder for Mutex Unlock] Provide the interpreter with a way to release a lock used to protect ...
virtual bool ClassInfo_HasDefaultConstructor(ClassInfo_t *info) const
ROOT::ESTLType IsSTLCont(std::string_view type)
type : type name: vector,allocator> result: 0 : not stl container code of cont...
void LibraryLoaded(const void *dyLibHandle, const char *canonicalName)
Bool_t HandleNewTransaction(const cling::Transaction &T)
Helper function to increase the internal Cling count of transactions that change the AST...
virtual CallFuncIFacePtr_t CallFunc_IFacePtr(CallFunc_t *func) const
void TCling__UpdateListsOnCommitted(const cling::Transaction &T, cling::Interpreter *)
virtual void PostLoadCheck()
Do the initialization that can only be done after the CINT dictionary has been fully populated and ca...
virtual void BaseClassInfo_Delete(BaseClassInfo_t *bcinfo) const
virtual DataMemberInfo_t * DataMemberInfo_Factory(ClassInfo_t *clinfo=0) const
virtual bool CallFunc_IsValid(CallFunc_t *func) const
static void ConstructorName(std::string &name, const clang::NamedDecl *decl, cling::Interpreter &interp, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt)
R__EXTERN Int_t gErrorIgnoreLevel
virtual int ClassInfo_Next(ClassInfo_t *info) const
virtual const char * WorkingDirectory()
Return working directory.
virtual const char * DataMemberInfo_TypeName(DataMemberInfo_t *dminfo) const
virtual void CallFunc_ExecWithReturn(CallFunc_t *func, void *address, void *ret) const
Namespace for new ROOT classes and functions.
std::map< SpecialObjectLookupCtx_t, SpecialObjectMap_t > fSpecialObjectMaps
virtual TypedefInfo_t * TypedefInfo_FactoryCopy(TypedefInfo_t *tinfo) const
virtual TObject * FindObject(const char *name) const
Find an object in this collection using its name.
static Bool_t Check(const char *cname, std::string &normname)
static const char **& GetExtraInterpreterArgs()
static cling::Interpreter::CompilationResult ExecAutoParse(const char *what, Bool_t header, cling::Interpreter *interpreter)
Parse the payload or header.
ClassImp(TSeqCollection) Int_t TSeqCollection TIter next(this)
Return index of object in collection.
void RegisterLoadedSharedLibrary(const char *name)
Register a new shared library name with the interpreter; add it to fSharedLibs.
Collectable string class.
static void AddClassToDeclIdMap(TDictionary::DeclId_t id, TClass *cl)
static: Add a TClass* to the map of classes.
const char * Name() const
virtual DeclId_t GetEnum(TClass *cl, const char *name) const
Return pointer to cling Decl of global/static variable that is located at the address given by addr...
R__EXTERN TClassTable * gClassTable
TClass * GetClass() const
const char * GetPrototype(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
void UpdateListsOnCommitted(const cling::Transaction &T)
TDictionary::DeclId_t DeclId_t
virtual int BaseClassInfo_Next(BaseClassInfo_t *bcinfo) const
RooArgList L(const RooAbsArg &v1)
void * llvmLazyFunctionCreator(const std::string &mangled_name)
Autoload a library provided the mangled name of a missing symbol.
TEnum * Find(DeclId_t id) const
Return the TEnum corresponding to the Decl 'id' or NULL if it does not exist.
Dictionary for function template This class describes one single function template.
double ExecDouble(void *address)
void Init(const char *name)
virtual TypeInfo_t * TypeInfo_FactoryCopy(TypeInfo_t *) const
All ROOT classes may have RTTI (run time type identification) support added.
int GetSplit(const char *type, std::vector< std::string > &output, int &nestedLoc, EModType mode=TClassEdit::kNone)
Stores in output (after emptying it) the splited type.
virtual void MethodInfo_CreateSignature(MethodInfo_t *minfo, TString &signature) const
static TProtoClass * GetProtoNorm(const char *cname)
Given the class normalized name returns the TClassProto object for the class.
TObject * FindObject(const char *name) const
Find object using its name.
A collection of TFunction objects designed for fast access given a DeclId_t and for keep track of TFu...
int GetMethodNArg(const char *method, const char *proto, Bool_t objectIsConst, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch) const
R__EXTERN TVirtualMutex * gInterpreterMutex
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...
TList * GetListOfEnums(Bool_t load=kTRUE)
Return list containing the TEnums of a class.
TString & ReplaceAll(const TString &s1, const TString &s2)
const char * Name() const
bool HasMethod(const char *name) const
void Init(const char *name)
Lookup named typedef and reset the iterator to point to it.
std::atomic< TListOfEnums * > fEnums
virtual CallFunc_t * CallFunc_FactoryCopy(CallFunc_t *func) const
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.
void SetFunc(const TClingClassInfo *info, const char *method, const char *arglist, long *poffset)
void Destruct(void *arena, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
Double_t distance(const TPoint2 &p1, const TPoint2 &p2)
virtual const char * MethodInfo_Title(MethodInfo_t *minfo) const
void SetArgArray(long *argArr, int narg)
virtual TList * GetListOfKeys() const
cling::MetaProcessor * fMetaProcessor
virtual int DataMemberInfo_TypeSize(DataMemberInfo_t *dminfo) const
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
const char * GetFullTypeName() const
Get full type description of typedef, e,g.: "class TDirectory*".
Persistent version of a TClass.
virtual void SetRTLD_LAZY() const
Emulation of the CINT DataMemberInfo class.
TEnum * Get(DeclId_t id, const char *name)
Return (after creating it if necessary) the TEnum describing the enum corresponding to the Decl 'id'...
std::atomic< Bool_t > fHasRootPcmInfo
C++ Property of the class (is abstract, has virtual table, etc.)
TClass * GenerateTClass(const char *classname, Bool_t emulation, Bool_t silent=kFALSE)
Generate a TClass for the given class.
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
void UpdateListOfGlobals()
No op: see TClingCallbacks (used to update the list of globals)
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format...
void UpdateListOfGlobalFunctions()
No op: see TClingCallbacks (used to update the list of global functions)
Emulation of the CINT MethodInfo class.
ptrdiff_t GetBaseOffset(TClingClassInfo *toBase, void *address, bool isDerivedObject)
virtual std::string MethodArgInfo_TypeNormalizedName(MethodArgInfo_t *marginfo) const
const char * Name() const
void SaveContext()
Save the current Cling state.
virtual MethodInfo_t * CallFunc_FactoryMethod(CallFunc_t *func) const
cling::Interpreter * fInterpreter
virtual ClassInfo_t * ClassInfo_Factory(Bool_t all=kTRUE) const
virtual const char * HomeDirectory(const char *userName=0)
Return the user's home directory.
static void RemoveClassDeclId(TDictionary::DeclId_t id)
Long_t Property() const
Set TObject::fBits and fStreamerType to cache information about the class.
virtual BaseClassInfo_t * BaseClassInfo_Factory(ClassInfo_t *info) const
const char * GetClassSharedLibs(const char *cls)
Get the list of shared libraries containing the code for class cls.
const char * GetValue() const
void TCling__DEBUG__dump(clang::DeclContext *DC)
const TClingTypeInfo * Type() const
virtual TObject * FindObject(const char *name) const
Specialize FindObject to do search for the a function just by name or create it if its not already in...
virtual void MethodInfo_Delete(MethodInfo_t *minfo) const
Interface to cling function.
virtual void CallFunc_SetArgArray(CallFunc_t *func, Long_t *paramArr, Int_t nparam) const
virtual const char * TypedefInfo_TrueName(TypedefInfo_t *tinfo) const
static const char * filename()
Bool_t IsPersistent() const
void TCling__UpdateListsOnUnloaded(const cling::Transaction &T)
virtual TObject * Remove(TObject *obj)
Remove object from array.
TList * GetListOfDataMembers(Bool_t load=kTRUE)
Return list containing the TDataMembers of a class.
bool LoadPCM(TString pcmFileName, const char **headers, void(*triggerFunc)()) const
Tries to load a PCM; returns true on success.
virtual Bool_t IsTreatingNonAccessibleTypes()
virtual FuncTempInfo_t * FuncTempInfo_FactoryCopy(FuncTempInfo_t *) const
Construct a FuncTempInfo_t.
void FullName(std::string &output, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
Int_t Load(const char *filenam, Bool_t system=kFALSE)
Load a library file in cling's memory.
virtual int Load(const char *module, const char *entry="", Bool_t system=kFALSE)
Load a shared library.
The TEnv class reads config files, by default named .rootrc.
std::string InsertStd(const char *tname)
clang::DeclContext * TCling__DEBUG__getDeclContext(clang::Decl *D)
TClass * GetClass(const std::type_info &typeinfo, Bool_t load) const
Demangle the name (from the typeinfo) and then request the class via the usual name based interface (...
ROOT::TMetaUtils::TNormalizedCtxt * fNormalizedCtxt
TString GetMangledName(TClass *cl, const char *method, const char *params, Bool_t objectIsConst=kFALSE)
Return the cling mangled name for a method of a class with parameters params (params is a string of a...
static Bool_t HasNoInfoOrEmuOrFwdDeclaredDecl(const char *)
bool HasDefaultConstructor() const
virtual TApplicationImp * GetApplicationImp()
TClingMethodInfo GetMethod(const char *fname) const
TClingTypeInfo * Type() const
virtual const char * DirName(const char *pathname)
Return the directory name in pathname.
virtual const char * MethodInfo_GetMangledName(MethodInfo_t *minfo) const
virtual UInt_t FuncTempInfo_TemplateNargs(FuncTempInfo_t *) const
Return the maximum number of template arguments of the function template described by ft_info...
virtual int DisplayIncludePath(FILE *fout) const
Interface to cling function.
std::vector< std::pair< std::string, int > > FwdDeclArgsToKeepCollection_t
void * fPrevLoadedDynLibInfo
virtual char * Which(const char *search, const char *file, EAccessMode mode=kFileExists)
Find location of file in a search path.
Each ROOT method (see TMethod) has a linked list of its arguments.
virtual const char * BaseClassInfo_Name(BaseClassInfo_t *bcinfo) const
virtual void TypeInfo_Delete(TypeInfo_t *tinfo) const
virtual Long_t CallFunc_ExecInt(CallFunc_t *func, void *address) const
Int_t DeleteVariable(const char *name)
Undeclare obj called name.
virtual int SetClassAutoparsing(int)
Enable/Disable the Autoparsing of headers.
Int_t GetEntriesFast() const
llvm::StringRef ValidArrayIndex() const
virtual int LoadFile(const char *path) const
Load a source file or library called path into the interpreter.
const char * TrueName(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
Get the name of the underlying type of the current typedef.
TString & Prepend(const char *cs)
void SetAutoParsingSuspended(bool val=true)
R__EXTERN TApplication * gApplication
Abstract base class for accessing the data-members of a class.
virtual void TypeInfo_Init(TypeInfo_t *tinfo, const char *funcname) const
TString GetMangledNameWithPrototype(TClass *cl, const char *method, const char *proto, Bool_t objectIsConst=kFALSE, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch)
Return the cling mangled name for a method of a class with a certain prototype, i.e.
std::vector< cling::Value > * fTemporaries
virtual ~TCling()
Destroy the interpreter interface.
virtual const char * DataMemberInfo_Title(DataMemberInfo_t *dminfo) const
virtual void LoadFunctionTemplates(TClass *cl) const
Create list of pointers to function templates for TClass cl.
virtual bool MethodArgInfo_IsValid(MethodArgInfo_t *marginfo) const
virtual bool Update(FuncTempInfo_t *info)
Update the TFunctionTemplate to reflect the new info.
virtual Long_t DataMemberInfo_Property(DataMemberInfo_t *dminfo) const
virtual Long_t TypedefInfo_Property(TypedefInfo_t *tinfo) const
virtual void * ClassInfo_New(ClassInfo_t *info) const
const clang::Type * GetType() const
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
Emulation of the CINT CallFunc class.
virtual int DisplayClass(FILE *fout, const char *name, int base, int start) const
virtual const char * GetTopLevelMacroName() const
Return the file name of the current un-included interpreted file.
virtual TObject * At(Int_t idx) const
Returns the object at position idx. Returns 0 if idx is out of range.
virtual int GetProcInfo(ProcInfo_t *info) const
Returns cpu and memory used by this process into the ProcInfo_t structure.
Bool_t R_ISREG(Int_t mode)
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
virtual void SetDeclAttr(DeclId_t, const char *)
virtual bool ClassInfo_IsValidMethod(ClassInfo_t *info, const char *method, const char *proto, Long_t *offset, ROOT::EFunctionMatchMode=ROOT::kConversionMatch) const
virtual int DataMemberInfo_MaxIndex(DataMemberInfo_t *dminfo, Int_t dim) const
V GetOffset(E val1, E val2, V iso)
void Execute(const char *function, const char *params, int *error=0)
Execute a global function with arguments params.
virtual const char * FindFile(const char *search, TString &file, EAccessMode mode=kFileExists)
Find location of file in a search path.
const char * GetSharedLibDeps(const char *lib)
Get the list a libraries on which the specified lib depends.
static const char * GetMacroPath()
Get macro search path. Static utility function.
virtual void SetValue(const char *name, const char *value, EEnvLevel level=kEnvChange, const char *type=0)
Set the value of a resource or create a new resource.
std::set< size_t > fPayloads
TDictionary * Find(DeclId_t id) const
Return (after creating it if necessary) the TDataMember describing the data member corresponding to t...
const TSeqCollection * GetConstants() const
virtual Long_t GetExecByteCode() const
This routines used to return the address of the internal wrapper function (of the interpreter) that w...
virtual void MethodArgInfo_Delete(MethodArgInfo_t *marginfo) const
std::vector< const char * > fCurExecutingMacros
Bool_t IsValid()
Return true if this data member object is pointing to a currently loaded data member.
virtual int TypeInfo_RefType(TypeInfo_t *) const
const char * Data() const
void AddFriendToClass(clang::FunctionDecl *, clang::CXXRecordDecl *) const
Inject function as a friend into klass.
virtual Long_t BaseClassInfo_Offset(BaseClassInfo_t *toBaseClassInfo, void *address, bool isDerivedObject) const
virtual TObject * FindObject(const char *name) const
Find an object in this collection using its name.
void TCling__DEBUG__decl_dump(void *D)
Int_t UnloadLibraryMap(const char *library)
Unload library map entries coming from the specified library.
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message.
virtual TEnum * CreateEnum(void *VD, TClass *cl) const
virtual void GenericError(const char *error) const
Let the interpreter issue a generic error, and set its error state.
void ClearStack()
Delete existing temporary values.
virtual const char * GetDirEntry(void *dirp)
Get a directory entry. Returns 0 if no more entries.
virtual void ClassInfo_Init(ClassInfo_t *info, const char *funcname) const
void ResetAll()
Reset the Cling state to its initial state.
void Exec(void *address, TInterpreterValue *interpVal=0)
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...
int Next()
Increment the iterator.
void CreateSignature(TString &signature) const
virtual void CallFunc_Init(CallFunc_t *func) const
TInterpreter::CallFuncIFacePtr_t IFacePtr()
Int_t GenerateDictionary(const char *classes, const char *includes=0, const char *options=0)
Generate the dictionary for the C++ classes listed in the first argument (in a semi-colon separated l...
THashTable implements a hash table to store TObject's.
const char * TCling__GetClassSharedLibs(const char *className)
clang::NamespaceDecl * TCling__DEBUG__DCtoNamespace(clang::DeclContext *DC)
void ExecuteWithArgsAndReturn(TMethod *method, void *address, const void *args[]=0, int nargs=0, void *ret=0) const
virtual DeclId_t GetDataMember(ClassInfo_t *cl, const char *name) const
Return pointer to cling Decl of global/static variable that is located at the address given by addr...
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString...
virtual TypedefInfo_t * TypedefInfo_Factory() const
virtual Long_t BaseClassInfo_Property(BaseClassInfo_t *bcinfo) const
Vc_ALWAYS_INLINE void free(T *p)
Frees memory that was allocated with Vc::malloc.
virtual void Sleep(UInt_t milliSec)
Sleep milliSec milli seconds.
THashList implements a hybrid collection class consisting of a hash table and a list to store TObject...
Bool_t CheckClassInfo(const char *name, Bool_t autoload, Bool_t isClassOrNamespaceOnly=kFALSE)
Checks if an entity with the specified name is defined in Cling.
std::atomic< TList * > fBase
virtual void CallFunc_Exec(CallFunc_t *func, void *address) const
Bool_t Declare(const char *code)
Declare code to the interpreter, without any of the interpreter actions that could trigger a re-inter...
std::map< const cling::Transaction *, size_t > fTransactionHeadersMap
virtual UInt_t FuncTempInfo_TemplateMinReqArgs(FuncTempInfo_t *) const
Return the number of required template arguments of the function template described by ft_info...
void ShortType(std::string &answer, int mode)
Return the absolute type of typeDesc into the string answ.
void GetInterpreterTypeName(const char *name, std::string &output, Bool_t full=kFALSE)
The 'name' is known to the interpreter, this function returns the internal version of this name (usua...
The TNamed class is the base class for all named ROOT classes.
void SetObjectValidity(EObjectPointerState val)
void CreateListOfDataMembers(TClass *cl) const
Create list of pointers to data members for TClass cl.
void SetArgs(const char *args)
char * DemangleName(const char *mangled_name, int &errorCode)
void * GetInterfaceMethodWithPrototype(TClass *cl, const char *method, const char *proto, Bool_t objectIsConst=kFALSE, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch)
Return pointer to cling interface function for a method of a class with a certain prototype...
UChar_t mod R__LOCKGUARD2(gSrvAuthenticateMutex)
virtual void ClassInfo_DeleteArray(ClassInfo_t *info, void *arena, bool dtorOnly) const
long ClassProperty() const
DeclId_t GetFunctionWithPrototype(ClassInfo_t *cl, const char *method, const char *proto, Bool_t objectIsConst=kFALSE, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch)
Return pointer to cling interface function for a method of a class with a certain prototype...
void Init(TClassEdit::TInterpreterLookupHelper *helper)
virtual MethodInfo_t * MethodInfo_FactoryCopy(MethodInfo_t *minfo) const
void ClearFileBusy()
Reset the interpreter internal state in case a previous action was not correctly terminated.
static void UpdateClassInfo(char *name, Long_t tagnum)
No op: see TClingCallbacks.
TClass * GetClass() const
void CreateListOfBaseClasses(TClass *cl) const
Create list of pointers to base class(es) for TClass cl.
virtual const char * GetDynamicPath()
Return the dynamic path (used to find shared libraries).
virtual Long_t DataMemberInfo_Offset(DataMemberInfo_t *dminfo) const
std::map< std::string, std::string >::const_iterator iter
void Clear()
Clear string without changing its capacity.
bool Append(const std::string &str)
Append string to the storage if not added already.
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 * ClassInfo_FileName(ClassInfo_t *info) const
virtual const char * TypeInfo_Name(TypeInfo_t *) const
virtual const char * Getenv(const char *env)
Get environment variable.
virtual const char * MapCppName(const char *) const
Interface to cling function.
if(pyself &&pyself!=Py_None)
void Info(const char *location, const char *msgfmt,...)
TString & Append(const char *cs)
static bool IsEnum(cling::Interpreter *interp, const char *name)
virtual const char * PrependPathName(const char *dir, TString &name)
Concatenate a directory and a file name.
virtual const char * GetCurrentMacroName() const
Return the file name of the currently interpreted file, included or not.
virtual int SetClassAutoloading(int) const
Enable/Disable the Autoloading of libraries.
ULong64_t fTransactionCount
const char * GetDefault() const
Get default value of method argument.
virtual bool ClassInfo_IsBase(ClassInfo_t *info, const char *name) const
char * DemangleTypeIdName(const std::type_info &ti, int &errorCode)
Demangle in a portable way the type id name.
virtual Long_t ClassInfo_GetBaseOffset(ClassInfo_t *fromDerived, ClassInfo_t *toBase, void *address, bool isDerivedObject) const
DeclId_t GetFunction(ClassInfo_t *cl, const char *funcname)
Return pointer to cling interface function for a method of a class with a certain name...
virtual int MethodInfo_NArg(MethodInfo_t *minfo) const
long Property() const
Return a bit mask of metadata about the current typedef.
virtual void Setgvp(Long_t) const
Interface to the cling global object pointer which was controlling the behavior of the wrapper around...
const char * TypeName() const
Long_t ProcessLine(const char *line, EErrorCode *error=0)
Let cling process a command line.
virtual Long_t ClassInfo_Property(ClassInfo_t *info) const
virtual bool Update(DataMemberInfo_t *info)
Update the TFunction to reflect the new info.
static void Add(const char *cname, Version_t id, const type_info &info, DictFuncPtr_t dict, Int_t pragmabits)
Add a class to the class table (this is a static function).
Emulation of the CINT TypeInfo class.
virtual int TypedefInfo_Next(TypedefInfo_t *tinfo) const
virtual bool TypeInfo_IsValid(TypeInfo_t *tinfo) const
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
clang::RecordDecl * TCling__DEBUG__DCtoRecordDecl(clang::DeclContext *DC)
This class defines an interface to the cling C++ interpreter.
Bool_t IgnoreDuplicates(Bool_t ignore)
If set to true, no warnings in case of duplicates are issued.
TClass *(* DictFuncPtr_t)()
TVirtualPad is an abstract base class for the Pad and Canvas classes.
DeclId_t GetDeclId(const llvm::GlobalValue *gv) const
Return pointer to cling DeclId for a global value.
const char * TypeTrueName(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
Int_t UnloadAllSharedLibraryMaps()
Unload the library map entries coming from all the loaded shared libraries.
void InitRootmapFile(const char *name)
Create a resource table and read the (possibly) three resource files, i.e $ROOTSYS/etc/system (...
std::string GetLong64_Name(const char *original)
Replace 'long long' and 'unsigned long long' by 'Long64_t' and 'ULong64_t'.
void InspectMembers(TMemberInspector &, const void *obj, const TClass *cl, Bool_t isTransient)
Visit all members over members, recursing over base classes.
virtual bool ClassInfo_IsEnum(const char *name) const
static void TCling__UpdateClassInfo(const NamedDecl *TD)
Update TClingClassInfo for a class (e.g. upon seeing a definition).
void TCling__DEBUG__printName(clang::Decl *D)
EComplexType GetComplexType(const char *)
long ExtraProperty() const
void GetObject(const char *namecycle, T *&ptr)
virtual Long_t DataMemberInfo_TypeProperty(DataMemberInfo_t *dminfo) const
TCppMethod_t GetMethod(TCppScope_t scope, TCppIndex_t imeth)
virtual Bool_t IsCmdThread()
void PrintIntro()
No-op; see TRint instead.
R__EXTERN TVirtualMutex * gGlobalMutex
virtual Int_t ReadFile(const char *fname, EEnvLevel level)
Read and parse the resource file for a certain level.
const Decl * TCling__GetObjectDecl(TObject *obj)
R__EXTERN TROOT * gROOTLocal
void UpdateListOfTypes()
No op: see TClingCallbacks (used to update the list of types)
virtual const char * TypeInfo_TrueName(TypeInfo_t *tinfo) const
virtual std::string MethodInfo_TypeNormalizedName(MethodInfo_t *minfo) const
const char * Name() const
const char * TmpltName() const
UInt_t AutoParseImplRecurse(const char *cls, bool topLevel)
Helper routine for TCling::AutoParse implementing the actual call to the parser and looping over temp...
virtual TList * GetListOfMethodArgs()
Returns methodarg list and additionally updates fDataMember in TMethod by calling FindDataMember();...
virtual void CallFunc_SetArgs(CallFunc_t *func, const char *param) const
const char * TmpltName() const
void Init(const char *name)
void function(const char *name_, T fun, const char *docstring=0)
bool TCling__TEST_isInvalidDecl(clang::Decl *D)
TClingClassInfo * GetBase() const
std::vector< void * > fRegisterModuleDyLibs
TFunctionTemplate * Get(DeclId_t id)
Return (after creating it if necessary) the TMethod or TFunction describing the function correspondin...
Int_t AutoParse(const char *cls)
Parse the headers relative to the class Returns 1 in case of success, 0 in case of failure...
virtual bool MethodInfo_IsValid(MethodInfo_t *minfo) const
int MaxIndex(int dim) const
void TCling__SplitAclicMode(const char *fileName, string &mode, string &args, string &io, string &fname)
const char * GetName() const
Returns name of object.
virtual Long_t TypeInfo_Property(TypeInfo_t *tinfo) const
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
Emulation of the CINT BaseClassInfo class.
TClingMethodInfo * FactoryMethod() const
Double_t length(const TVector2 &v)
R__EXTERN TSystem * gSystem
void * InterfaceMethod(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
virtual const char * DataMemberInfo_TypeTrueName(DataMemberInfo_t *dminfo) const
ptrdiff_t Offset(void *address=0, bool isDerivedObject=true) const
virtual void GetFunctionName(const clang::FunctionDecl *decl, std::string &name) const
Basic data type descriptor (datatype information is obtained from CINT).
void SetFuncProto(const TClingClassInfo *info, const char *method, const char *proto, long *poffset, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch)
virtual void LoadEnums(TListOfEnums &cl) const
Create list of pointers to enums for TClass cl.
std::set< TClass * > & GetModTClasses()
virtual int TypeInfo_Size(TypeInfo_t *tinfo) const
static void UpdateAllCanvases()
Update all canvases at end the terminal input command.
const clang::FunctionDecl * GetMethodDecl() const
const char * TrueName(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
Return the normalized name of the type (i.e.
ClassInfo_t * GetClassInfo() const
virtual CallFunc_t * CallFunc_Factory() const
const char * DefaultValue() const
static Long_t ExecuteFile(const char *file, Int_t *error=0, Bool_t keep=kFALSE)
Execute a file containing a C++ macro (static method).
virtual TEnvRec * Lookup(const char *n)
Loop over all resource records and return the one with name.
TObject * Remove(TObject *obj)
Remove object from the list.
virtual Int_t AutoParse(const char *cls)=0
Collection abstract base class.
Bool_t SetErrorMessages(Bool_t enable=kTRUE)
If error messages are disabled, the interpreter should suppress its failures and warning messages fro...
int TCling__AutoParseCallback(const char *className)
virtual const char * DataMemberInfo_ValidArrayIndex(DataMemberInfo_t *dminfo) const
void SaveGlobalsContext()
Save the current Cling state of global objects.
void UpdateClassInfoWithDecl(const void *vTD)
Internal function. Inform a TClass about its new TagDecl or NamespaceDecl.
virtual Long_t BaseClassInfo_Tagnum(BaseClassInfo_t *bcinfo) const
Bool_t TestBit(UInt_t f) const
virtual Bool_t IsValid()
Return true if this global object is pointing to a currently loaded global.
virtual const char * ClassInfo_Title(ClassInfo_t *info) const
void UpdateListOfLoadedSharedLibraries()
char * Form(const char *fmt,...)
virtual void CallFunc_SetFunc(CallFunc_t *func, ClassInfo_t *info, const char *method, const char *params, Long_t *Offset) const
virtual TypeInfo_t * MethodInfo_Type(MethodInfo_t *minfo) const
Long_t Calc(const char *line, EErrorCode *error=0)
Directly execute an executable statement (e.g.
Int_t RescanLibraryMap()
Scan again along the dynamic path for library maps.
virtual const char * GetName() const
Returns name of object.
The TEnumConstant class implements the constants of the enum type.
virtual const char * Getp2f2funcname(void *receiver) const
virtual bool TypedefInfo_IsValid(TypedefInfo_t *tinfo) const
virtual Bool_t LoadText(const char *text) const
Load the declarations from text into the interpreter.
The ROOT global object gROOT contains a list of all defined classes.
virtual int MethodInfo_Next(MethodInfo_t *minfo) const
clang::QualType GetQualType() const
virtual int MethodInfo_NDefaultArg(MethodInfo_t *minfo) const
virtual int MethodArgInfo_Next(MethodArgInfo_t *marginfo) const
Global variables class (global variables are obtained from CINT).
void * LazyFunctionCreatorAutoload(const std::string &mangled_name)
Autoload a library based on a missing symbol.
Version_t GetClassVersion() const
Long_t ExecuteMacro(const char *filename, EErrorCode *error=0)
Execute a cling macro.
virtual void Initialize()
Initialize the interpreter, once TROOT::fInterpreter is set.
Bool_t CheckClassTemplate(const char *name)
Return true if there is a class template by the given name ...
static void indent(ostringstream &buf, int indent_level)
THashList * GetTable() const
virtual void CallFunc_SetFuncProto(CallFunc_t *func, ClassInfo_t *info, const char *method, const char *proto, Long_t *Offset, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch) const
Interface to cling function.
virtual void FreeDirectory(void *dirp)
Free a directory.
virtual const char * MethodInfo_GetPrototype(MethodInfo_t *minfo) const
TDictionary::DeclId_t GetDeclId() const
virtual void CallFunc_ExecWithArgsAndReturn(CallFunc_t *func, void *address, const void *args[]=0, int nargs=0, void *ret=0) const
TObject * TCling__GetObjectAddress(const char *Name, void *&LookupCtx)
virtual Bool_t FuncTempInfo_IsValid(FuncTempInfo_t *) const
Check validity of a FuncTempInfo_t.
TObjArray * Tokenize(const TString &delim) const
This function is used to isolate sequential tokens in a TString.
Each class (see TClass) has a linked list of its base class(es).
const char * Name() const
Get the name of the current typedef.
void EnableAutoLoading()
Enable the automatic loading of shared libraries when a class is used that is stored in a not yet loa...
Type
enumeration specifying the integration types.
R__DLLEXPORT void DestroyInterpreter(TInterpreter *interp)
bool IsAutoloadingEnabled()
const char * TypeName() const
TDictionary::DeclId_t DeclId_t
virtual void CallFunc_Delete(CallFunc_t *func) const
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::unordered_set< const clang::NamespaceDecl * > fNSFromRootmaps
virtual const char * BaseClassInfo_FullName(BaseClassInfo_t *bcinfo) const
virtual MethodInfo_t * MethodInfo_Factory() const
void TCling__GetNormalizedContext(const ROOT::TMetaUtils::TNormalizedCtxt *&normCtxt)
int Size() const
Return the size in bytes of the underlying type of the current typedef.
virtual const char * FindDynamicLibrary(TString &lib, Bool_t quiet=kFALSE)
Find a dynamic library using the system search paths.
void EndOfLineAction()
It calls a "fantom" method to synchronize user keyboard input and ROOT prompt line.
std::string GetMangledName() const
TString & Remove(Ssiz_t pos)
const char * Name(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
Bool_t IsLoaded() const
Return true if the shared library of this class is currently in the a process's memory.
void SetClassInfo(TClass *cl, Bool_t reload=kFALSE)
Set pointer to the TClingClassInfo in TClass.
Emulation of the CINT TypedefInfo class.
const clang::Decl * GetDecl() const
const char * TypeName() const
A collection of TEnum objects designed for fast access given a DeclId_t and for keep track of TEnum t...
int(* AutoLoadCallBack_t)(const char *)
virtual const char * MethodArgInfo_DefaultValue(MethodArgInfo_t *marginfo) const
virtual const char * ClassInfo_Name(ClassInfo_t *info) const
virtual const char * GetIncludePath()
Get the list of include path.
virtual bool DataMemberInfo_IsValid(DataMemberInfo_t *dminfo) const
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)
TInterpreterValue * CreateTemporary()
The created temporary must be deleted by the caller.
void GetFunctionOverloads(ClassInfo_t *cl, const char *funcname, std::vector< DeclId_t > &res) const
Insert overloads of name in cl to res.
void UpdateListsOnUnloaded(const cling::Transaction &T)
virtual FuncTempInfo_t * FuncTempInfo_Factory(DeclId_t declid) const
Construct a FuncTempInfo_t.
TObjArray * fStreamerInfo
virtual void FuncTempInfo_Title(FuncTempInfo_t *, TString &name) const
Return the comments associates with this function template.
std::set< size_t > fLookedUpClasses
void UpdateListOfDataMembers(TClass *cl) const
Update the list of pointers to data members for TClass cl This is now a nop.
MyComplex< T > P(MyComplex< T > z, T c_real, T c_imag)
[MyComplex]
const char * GetParent() const
void UnloadClassMembers(TClass *cl, const clang::DeclContext *DC)
Helper function to go through the members of a class or namespace and unload them.
virtual const void * GetValAddr() const =0
EState fState
cached of the streaming method to use
void TCling__LibraryLoadedRTTI(const void *dyLibHandle, const char *canonicalName)
Emulation of the CINT MethodInfo class.
char * DynamicPathName(const char *lib, Bool_t quiet=kFALSE)
Find a dynamic library called lib using the system search paths.
static DictFuncPtr_t GetDict(const char *cname)
Given the class name returns the Dictionary() function of a class (uses hash of name).
virtual Bool_t ClassInfo_Contains(ClassInfo_t *info, DeclId_t declid) const
Return true if the entity pointed to by 'declid' is declared in the context described by 'info'...
TFunction * Find(DeclId_t id) const
Return the TMethod or TFunction describing the function corresponding to the Decl 'id'...
virtual const char * DataMemberInfo_Name(DataMemberInfo_t *dminfo) const
void Unload()
Mark 'all func' as being unloaded.
virtual int DataMemberInfo_ArrayDim(DataMemberInfo_t *dminfo) const
void RegisterTClassUpdate(TClass *oldcl, DictFuncPtr_t dict)
Register classes that already existed prior to their dictionary loading and that already had a ClassI...
Bool_t IsAutoLoadNamespaceCandidate(const char *name)
virtual void CallFunc_ResetArg(CallFunc_t *func) const
virtual void FuncTempInfo_Delete(FuncTempInfo_t *) const
Delete the FuncTempInfo_t.
TDictionary::DeclId_t DeclId_t
void DeleteArray(void *arena, bool dtorOnly, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
void ResetGlobalVar(void *obj)
Reset the Cling 'user' global objects/variables state to the state saved by the last call to TCling::...
unsigned long long ULong64_t
ClassImp(TMCParticle) void TMCParticle printf(": p=(%7.3f,%7.3f,%9.3f) ;", fPx, fPy, fPz)
DeclId_t GetFunctionTemplate(ClassInfo_t *cl, const char *funcname)
Return pointer to cling interface function for a method of a class with a certain name...
virtual Long64_t CallFunc_ExecInt64(CallFunc_t *func, void *address) const
void Reset()
Pressing Ctrl+C should forward here.
Int_t LoadLibraryMap(const char *rootmapfile=0)
Load map between class and library.
void CreateListOfMethodArgs(TFunction *m) const
Create list of pointers to method arguments for TMethod m.
TObjArray * fRootmapFiles
double func(double *x, double *p)
virtual void Expand(Int_t newSize)
Expand or shrink the array to newSize elements.
std::set< const char * > fParsedPayloadsAddresses
ROOT::TMetaUtils::TClingLookupHelper * fLookupHelper
void FullName(std::string &output, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
TClingCallbacks * fClingCallbacks
Int_t AutoLoad(const char *classname, Bool_t knowDictNotLoaded=kFALSE)
Load library containing the specified class.
Emulation of the CINT ClassInfo class.
EObjectPointerState GetObjectValidity() const
virtual ~TROOT()
Clean up and free resources used by ROOT (files, network sockets, shared memory segments, etc.).
virtual int GetSecurityError() const
Interface to cling function.
#define R__LOCKGUARD(mutex)
void InspectMember(const T &obj, const char *name, Bool_t isTransient)
Int_t GetEntries() const
Return the number of objects in array (i.e.
virtual void Add(TObject *obj)=0
virtual void * MethodInfo_InterfaceMethod(MethodInfo_t *minfo) const
void SetGetline(const char *(*getlineFunc)(const char *prompt), void(*histaddFunc)(const char *line))
Set a getline function to call when input is needed.
const clang::ValueDecl * GetDataMember(const char *name) const
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.
virtual void ClassInfo_Delete(ClassInfo_t *info) const
void Delete(void *arena, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
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)
Inject the module named "modulename" into cling; load all headers.
virtual bool Update(DataMemberInfo_t *info)
Update the TFunction to reflect the new info.
Int_t ReloadAllSharedLibraryMaps()
Reload the library map entries coming from all the loaded shared libraries, after first unloading the...
virtual TObject * FindObject(const char *name) const
Specialize FindObject to do search for the a data member just by name or create it if its not already...
static TClass * LoadClass(const char *requestedname, Bool_t silent)
Helper function used by TClass::GetClass().
void UpdateListOfMethods(TClass *cl) const
Update the list of pointers to method for TClass cl This is now a nop.
TVirtualCollectionProxy * GetCollectionProxy() const
Return the proxy describing the collection (if any).
void * New(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
virtual const char * TypedefInfo_Name(TypedefInfo_t *tinfo) const
void RecursiveRemove(TObject *obj)
Delete object from cling symbol table so it can not be used anymore.
TDataMember * GetDataMember(const char *datamember) const
Return pointer to datamember object with name "datamember".
virtual int ClassInfo_Size(ClassInfo_t *info) const
void UnRegisterTClassUpdate(const TClass *oldcl)
If the dictionary is loaded, we can remove the class from the list (otherwise the class might be load...
virtual Double_t CallFunc_ExecDouble(CallFunc_t *func, void *address) const
Mother of all ROOT objects.
virtual bool ClassInfo_HasMethod(ClassInfo_t *info, const char *name) const
void TCling__LibraryUnloadedRTTI(const void *dyLibHandle, const char *canonicalName)
virtual Long_t MethodArgInfo_Property(MethodArgInfo_t *marginfo) const
void RegisterTemporary(const TInterpreterValue &value)
virtual void Inspect(TClass *cl, const char *parent, const char *name, const void *addr)
virtual Long_t Getgvp() const
Interface to the CINT global object pointer which was controlling the behavior of the wrapper around ...
TClassRef is used to implement a permanent reference to a TClass object.
void HandleNewDecl(const void *DV, bool isDeserialized, std::set< TClass * > &modifiedClasses)
typedef void((*Func_t)())
void Unload()
Mark 'all func' as being unloaded.
const char * GetDeclFileName() const
virtual bool ClassInfo_IsLoaded(ClassInfo_t *info) const
static TEnum * GetEnum(const std::type_info &ti, ESearchAction sa=kALoadAndInterpLookup)
virtual DeclId_t GetDataMemberWithValue(const void *ptrvalue) const
NOT IMPLEMENTED.
void SetAutoloadingEnabled(bool val=true)
Bridge between cling::Value and ROOT.
virtual const char * MethodInfo_Name(MethodInfo_t *minfo) const
const char * GetUnqualifiedName(const char *name)
Return the start of the unqualified name include in 'original'.
const char * GetFullTypeName() const
Get full type description of method argument, e.g.: "class TDirectory*".
void Unload()
Mark 'all func' as being unloaded.
A collection of TEnum objects designed for fast access given a DeclId_t and for keep track of TEnum t...
TDictionary::DeclId_t DeclId_t
virtual void Add(TObject *obj)
TClingMethodInfo GetMethodWithArgs(const char *fname, const char *arglist, long *poffset, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch, EInheritanceMode imode=kWithInheritance) const
virtual bool ClassInfo_IsValid(ClassInfo_t *info) const
virtual Long_t ClassInfo_Tagnum(ClassInfo_t *info) const
R__EXTERN const char * gRootDir
Bool_t fHeaderParsingOnDemand
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
virtual Long_t MethodInfo_ExtraProperty(MethodInfo_t *minfo) const
Each ROOT class (see TClass) has a linked list of methods.
std::vector< std::pair< TClass *, DictFuncPtr_t > > fClassesToUpdate
virtual void CallFunc_IgnoreExtraArgs(CallFunc_t *func, bool ignore) const
virtual const char * GetSTLIncludePath() const
Return the directory containing CINT's stl cintdlls.
static void * fgSetOfSpecials
virtual const char * MethodInfo_TypeName(MethodInfo_t *minfo) const
static void SetFactory(TVirtualStreamerInfo *factory)
static function: Set the StreamerInfo factory
long ExecInt(void *address)
Int_t SetClassSharedLibs(const char *cls, const char *libs)
Register the autoloading information for a class.
Bool_t IsLoaded(const char *filename) const
Return true if the file has already been loaded by cint.
bool IsValid() const
Return true if the current iterator position is valid.
virtual void ClassInfo_Destruct(ClassInfo_t *info, void *arena) const
virtual const char * ClassInfo_FullName(ClassInfo_t *info) const
virtual void UpdateEnumConstants(TEnum *enumObj, TClass *cl) const
virtual void * OpenDirectory(const char *name)
Open a directory. Returns 0 if directory does not exist.
ROOT::ESTLType GetCollectionType() const
Return the 'type' of the STL the TClass is representing.
Bool_t SetSuspendAutoParsing(Bool_t value)
Suspend the Autoparsing of headers.
virtual const char * BaseClassInfo_TmpltName(BaseClassInfo_t *bcinfo) const
virtual const char * MethodArgInfo_Name(MethodArgInfo_t *marginfo) const
virtual const char * ClassInfo_TmpltName(ClassInfo_t *info) const
static bool R__InitStreamerInfoFactory()
Helper to initialize TVirtualStreamerInfo's factor early.
Bool_t IsErrorMessagesEnabled() const
If error messages are disabled, the interpreter should suppress its failures and warning messages fro...
void IgnoreExtraArgs(bool ignore)
Bool_t fIsAutoParsingSuspended
static void UpdateClassInfoWork(const char *name)
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.
A collection of TFunction objects designed for fast access given a DeclId_t and for keep track of TFu...
bool TClingLookupHelper__AutoParse(const char *cname)
Allow calling autoparsing from TMetaUtils.
std::hash< std::string > fStringHashFunction
virtual void TypedefInfo_Init(TypedefInfo_t *tinfo, const char *name) const
const char * GetSharedLibs()
Return the list of shared libraries loaded into the process.
TObject * At(Int_t idx) const
bool IsBase(const char *name) const
static const char * FindLibraryName(void(*func)())
Wrapper around dladdr (and friends)
virtual EReturnType MethodInfo_MethodCallReturnType(MethodInfo_t *minfo) const
R__EXTERN TInterpreter * gCling
R__DLLEXPORT TInterpreter * CreateInterpreter(void *interpLibHandle)
virtual void * FindSym(const char *entry) const
Interface to cling function.
virtual void Compress()
Remove empty slots from array.
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
bool IsValidMethod(const char *method, const char *proto, Bool_t objectIsConst, long *offset, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch) const
Long_t ProcessLineAsynch(const char *line, EErrorCode *error=0)
Let cling process a command line asynch.
static void output(int code)
virtual void DataMemberInfo_Delete(DataMemberInfo_t *dminfo) const
void TCling__TransactionRollback(const cling::Transaction &T)
virtual const char * GetTitle() const
Returns title of object.
TList * GetListOfMethods(Bool_t load=kTRUE)
Return list containing the TMethods of a class.
std::string NormalizedName(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
Return the normalized name of the type (i.e.
void Unload()
Mark 'all func' as being unloaded.
virtual char * ConcatFileName(const char *dir, const char *name)
Concatenate a directory and a file name. User must delete returned string.
void LoadMacro(const char *filename, EErrorCode *error=0)
Load a macro file in cling's memory.
virtual ClassInfo_t * BaseClassInfo_ClassInfo(BaseClassInfo_t *) const
static DictFuncPtr_t GetDictNorm(const char *cname)
Given the normalized class name returns the Dictionary() function of a class (uses hash of name)...
const char * TypeName(const char *typeDesc)
Return the absolute type of typeDesc.
virtual EReturnType MethodCallReturnType(TFunction *func) const
static char * skip(char **buf, const char *delimiters)
void LibraryUnloaded(const void *dyLibHandle, const char *canonicalName)
void RewindDictionary()
Rewind Cling dictionary to the point where it was before executing the current macro.
virtual MethodArgInfo_t * MethodArgInfo_FactoryCopy(MethodArgInfo_t *marginfo) const
void AddIncludePath(const char *path)
Add the given path to the list of directories in which the interpreter looks for include files...
void CreateListOfMethods(TClass *cl) const
Create list of pointers to methods for TClass cl.
Int_t DeleteGlobal(void *obj)
Delete obj from Cling symbol table so it cannot be accessed anymore.
virtual TypeInfo_t * TypeInfo_Factory() const
virtual const char * MethodArgInfo_TypeName(MethodArgInfo_t *marginfo) const
TDictionary::DeclId_t GetDeclId() const
virtual void SetErrmsgcallback(void *p) const
Set a callback to receive error messages.
void ResetGlobals()
Reset in Cling the list of global variables to the state saved by the last call to TCling::SaveGlobal...
virtual const char * TypedefInfo_Title(TypedefInfo_t *tinfo) const
Int_t Size() const
Return size of object of this class.
virtual void SetAlloclockfunc(void(*)()) const
[Place holder for Mutex Lock] Provide the interpreter with a way to acquire a lock used to protect cr...
void ExecWithArgsAndReturn(void *address, const void *args[]=0, int nargs=0, void *ret=0)
virtual void CallFunc_SetArg(CallFunc_t *func, Long_t param) const
virtual Long_t FuncTempInfo_Property(FuncTempInfo_t *) const
Return the property of the function template.
DeclId_t GetDeclId() const
virtual DataMemberInfo_t * DataMemberInfo_FactoryCopy(DataMemberInfo_t *dminfo) const
void ExecWithReturn(void *address, void *ret=0)
virtual int UnloadFile(const char *path) const
virtual int DataMemberInfo_Next(DataMemberInfo_t *dminfo) const
std::map< size_t, std::vector< const char * > > fClassesHeadersMap
Long_t ProcessLineSynch(const char *line, EErrorCode *error=0)
Let cling process a command line synchronously, i.e we are waiting it will be finished.
virtual int ClassInfo_GetMethodNArg(ClassInfo_t *info, const char *method, const char *proto, Bool_t objectIsConst=false, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch) const
TList * GetListOfFunctionTemplates(Bool_t load=kTRUE)
Return list containing the TEnums of a class.
virtual const char * GetClassSharedLibs(const char *cls)=0
long long ExecInt64(void *address)
virtual void FuncTempInfo_Name(FuncTempInfo_t *, TString &name) const
Return the name of this function template.
virtual void TypedefInfo_Delete(TypedefInfo_t *tinfo) const
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.