59 #include "RConfigure.h"
60 #include "compiledata.h"
74 #include "clang/AST/ASTContext.h"
75 #include "clang/AST/Decl.h"
76 #include "clang/AST/DeclarationName.h"
77 #include "clang/AST/GlobalDecl.h"
78 #include "clang/AST/RecordLayout.h"
79 #include "clang/AST/RecursiveASTVisitor.h"
80 #include "clang/AST/Type.h"
81 #include "clang/Basic/SourceLocation.h"
82 #include "clang/Basic/Specifiers.h"
83 #include "clang/Basic/TargetInfo.h"
84 #include "clang/CodeGen/ModuleBuilder.h"
85 #include "clang/Frontend/CompilerInstance.h"
86 #include "clang/Frontend/FrontendDiagnostic.h"
87 #include "clang/Lex/HeaderSearch.h"
88 #include "clang/Lex/Preprocessor.h"
89 #include "clang/Sema/Lookup.h"
90 #include "clang/Sema/Sema.h"
91 #include "clang/Parse/Parser.h"
93 #include "cling/Interpreter/ClangInternalState.h"
94 #include "cling/Interpreter/DynamicLibraryManager.h"
95 #include "cling/Interpreter/Interpreter.h"
96 #include "cling/Interpreter/LookupHelper.h"
97 #include "cling/Interpreter/Value.h"
98 #include "cling/Interpreter/Transaction.h"
99 #include "cling/MetaProcessor/MetaProcessor.h"
100 #include "cling/Utils/AST.h"
101 #include "cling/Interpreter/Exception.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;
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;
1256 const char** headers,
1257 void (*triggerFunc)())
const {
1265 searchPath = llvm::sys::path::parent_path(libraryName);
1285 if (
gROOT->IsRootFile(pcmFileName)) {
1289 ::Info(
"TCling::LoadPCM",
"Loading ROOT PCM %s", pcmFileName.
Data());
1296 TFile *pcmFile =
new TFile(pcmFileName+
"?filetype=pcm",
"READ");
1298 auto listOfKeys = pcmFile->GetListOfKeys();
1301 if (listOfKeys && listOfKeys->GetSize() == 0) {
1309 ::Info(
"TCling::LoadPCM",
"reading protoclasses for %s \n",pcmFileName.
Data());
1311 pcmFile->GetObject(
"__ProtoClasses", protoClasses);
1314 for (
auto obj : *protoClasses) {
1324 for (
auto proto : *protoClasses) {
1326 = (
TClass*)
gROOT->GetListOfClasses()->FindObject(proto->GetName())) {
1333 ::Error(
"TCling::LoadPCM",
"Inconsistent TClassTable for %s",
1345 protoClasses->Clear();
1346 delete protoClasses;
1350 pcmFile->GetObject(
"__Typedefs", dataTypes);
1352 for (
auto typedf: *dataTypes)
1353 gROOT->GetListOfTypes()->Add(typedf);
1359 pcmFile->GetObject(
"__Enums", enums);
1362 auto listOfGlobals =
gROOT->GetListOfGlobals();
1363 auto listOfEnums =
dynamic_cast<THashList*
>(
gROOT->GetListOfEnums());
1365 for (
auto selEnum: *enums){
1366 const char* enumScope = selEnum->
GetTitle();
1367 const char* enumName = selEnum->GetName();
1368 if (strcmp(enumScope,
"") == 0){
1371 if (!listOfEnums->THashList::FindObject(enumName)){
1372 ((
TEnum*) selEnum)->SetClass(
nullptr);
1373 listOfEnums->Add(selEnum);
1375 for (
auto enumConstant: *static_cast<TEnum*>(selEnum)->GetConstants()){
1376 if (!listOfGlobals->FindObject(enumConstant)){
1377 listOfGlobals->Add(enumConstant);
1385 if (!nsTClassEntry){
1388 auto listOfEnums = nsTClassEntry->
fEnums.load();
1399 if (listOfEnums && !listOfEnums->THashList::FindObject(enumName)){
1400 ((
TEnum*) selEnum)->SetClass(nsTClassEntry);
1401 listOfEnums->Add(selEnum);
1414 ::Info(
"TCling::LoadPCM",
"Loading clang PCM %s", pcmFileName.
Data());
1428 using namespace clang;
1430 class ExtLexicalStorageAdder:
public RecursiveASTVisitor<ExtLexicalStorageAdder>{
1435 bool VisitRecordDecl(clang::RecordDecl* rcd){
1437 Info(
"ExtLexicalStorageAdder",
1438 "Adding external lexical storage to class %s",
1439 rcd->getNameAsString().c_str());
1440 auto reDeclPtr = rcd->getMostRecentDecl();
1442 reDeclPtr->setHasExternalLexicalStorage();
1443 }
while ((reDeclPtr = reDeclPtr->getPreviousDecl()));
1463 const char** headers,
1464 const char** includePaths,
1465 const char* payloadCode,
1466 const char* fwdDeclsCode,
1467 void (*triggerFunc)(),
1469 const char** classesHeaders)
1472 static const bool fromRootCling = dlsym(RTLD_DEFAULT,
"usedToIdentifyRootClingByDlSym");
1476 if (fromRootCling)
return;
1480 bool isACLiC =
false;
1481 if (hasHeaderParsingOnDemand &&
1482 strstr(modulename,
"_ACLiC_dict") !=
nullptr){
1484 Info(
"TCling::RegisterModule",
1485 "Header parsing on demand is active but this is an Aclic library. Disabling it for this library.");
1486 hasHeaderParsingOnDemand =
false;
1503 for (
const char** inclPath = includePaths; *inclPath; ++inclPath) {
1506 cling::Transaction* T = 0;
1508 for (
auto& fwdDeclArgToSkipPair : fwdDeclsArgToSkip){
1509 const std::string& fwdDecl = fwdDeclArgToSkipPair.first;
1510 const int nArgsToSkip = fwdDeclArgToSkipPair.second;
1512 assert(cling::Interpreter::kSuccess == compRes &&
1513 "A fwd declaration could not be compiled");
1514 if (compRes!=cling::Interpreter::kSuccess){
1515 Warning(
"TCling::RegisterModule",
1516 "Problems in declaring string '%s' were encountered.",
1531 TString code = gNonInterpreterClassDef;
1532 code += payloadCode;
1541 void* dyLibHandle = dlopen(dyLibName, RTLD_LAZY | RTLD_GLOBAL);
1544 char dyLibError[1000];
1545 FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
NULL, GetLastError(),
1546 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), dyLibError,
1547 sizeof(dyLibError),
NULL);
1550 const char* dyLibError = dlerror();
1554 ::Info(
"TCling::RegisterModule",
1555 "Cannot open shared library %s for dictionary %s:\n %s",
1556 dyLibName, modulename, dyLibError);
1565 if (hasHeaderParsingOnDemand && fwdDeclsCode){
1568 std::string fwdDeclsCodeLessEnums;
1572 std::string fwdDeclsLine;
1573 std::istringstream fwdDeclsCodeStr(fwdDeclsCode);
1574 std::vector<std::string> scope;
1575 while (std::getline(fwdDeclsCodeStr, fwdDeclsLine)) {
1576 if (fwdDeclsLine.find(
"namespace ") == 0
1577 || fwdDeclsLine.find(
"inline namespace ") == 0) {
1579 scope.push_back(fwdDeclsLine.substr(10,
1580 fwdDeclsLine.length() - 10 - 2));
1581 }
else if (fwdDeclsLine ==
"}") {
1583 }
else if (fwdDeclsLine.find(
"enum __attribute__((annotate(\"") == 0) {
1584 clang::DeclContext* DC = 0;
1585 for (
auto &&aScope: scope) {
1592 if (scope.empty() || DC) {
1594 size_t posEnumName = fwdDeclsLine.find(
"\"))) ", 32);
1595 R__ASSERT(posEnumName != std::string::npos &&
"Inconsistent enum fwd decl!");
1597 while (isspace(fwdDeclsLine[posEnumName]))
1599 size_t posEnumNameEnd = fwdDeclsLine.find(
" : ", posEnumName);
1600 R__ASSERT(posEnumNameEnd != std::string::npos &&
"Inconsistent enum fwd decl (end)!");
1601 while (isspace(fwdDeclsLine[posEnumNameEnd]))
1605 std::string enumName = fwdDeclsLine.substr(posEnumName,
1606 posEnumNameEnd - posEnumName + 1);
1608 if (clang::NamedDecl* enumDecl
1609 = cling::utils::Lookup::Named(&
fInterpreter->getSema(),
1610 enumName.c_str(), DC)) {
1613 R__ASSERT(llvm::dyn_cast<clang::EnumDecl>(enumDecl) &&
"not an enum decl!");
1619 fwdDeclsCodeLessEnums += fwdDeclsLine +
"\n";
1623 if (fwdDeclsCodeLessEnums.size() != 0){
1624 auto compRes =
fInterpreter->declare(fwdDeclsCodeLessEnums, &T);
1625 assert(cling::Interpreter::kSuccess == compRes &&
1626 "The forward declarations could not be compiled");
1627 if (compRes!=cling::Interpreter::kSuccess){
1628 Warning(
"TCling::RegisterModule",
1629 "Problems in compiling forward declarations for module %s: '%s'",
1630 modulename, fwdDeclsCodeLessEnums.c_str()) ;
1638 ExtLexicalStorageAdder elsa;
1639 for (
auto dciIt = T->decls_begin();dciIt!=T->decls_end();dciIt++){
1640 cling::Transaction::DelayCallInfo& dci = *dciIt;
1641 for(
auto dit = dci.m_DGR.begin(); dit != dci.m_DGR.end(); ++dit) {
1642 clang::Decl* declPtr = *dit;
1643 elsa.TraverseDecl(declPtr);
1657 for (
const char** classesHeader = classesHeaders; *classesHeader; ++classesHeader) {
1658 temp=*classesHeader;
1660 size_t theTemplateHash = 0;
1661 bool addTemplate =
false;
1662 size_t posTemplate = temp.find(
'<');
1663 if (posTemplate != std::string::npos) {
1665 std::string templateName = temp.substr(0, posTemplate);
1671 for (
const char** classesHeader_inner = classesHeader; 0!=strcmp(*classesHeader_inner,
"@"); ++classesHeader_inner,++classesHeader){
1673 if (payloadCode == *classesHeader_inner ){
1675 if (addTemplate)
fPayloads.insert(theTemplateHash);
1678 Info(
"TCling::RegisterModule",
1679 "Adding a header for %s", temp.c_str());
1685 addTemplate =
false;
1692 if (strcmp(modulename,
"libCore")!=0 && strcmp(modulename,
"libRint")!=0
1693 && strcmp(modulename,
"libThread")!=0 && strcmp(modulename,
"libRIO")!=0
1694 && strcmp(modulename,
"libcomplexDict")!=0 && strcmp(modulename,
"libdequeDict")!=0
1695 && strcmp(modulename,
"liblistDict")!=0 && strcmp(modulename,
"libforward_listDict")!=0
1696 && strcmp(modulename,
"libvectorDict")!=0
1697 && strcmp(modulename,
"libmapDict")!=0 && strcmp(modulename,
"libmultimap2Dict")!=0
1698 && strcmp(modulename,
"libmap2Dict")!=0 && strcmp(modulename,
"libmultimapDict")!=0
1699 && strcmp(modulename,
"libsetDict")!=0 && strcmp(modulename,
"libmultisetDict")!=0
1700 && strcmp(modulename,
"libunordered_setDict")!=0 && strcmp(modulename,
"libunordered_multisetDict")!=0
1701 && strcmp(modulename,
"libunordered_mapDict")!=0 && strcmp(modulename,
"libunordered_multimapDict")!=0
1702 && strcmp(modulename,
"libvalarrayDict")!=0
1703 && strcmp(modulename,
"G__GenVector32")!=0 && strcmp(modulename,
"G__Smatrix32")!=0
1707 if (!
LoadPCM(pcmFileName, headers, triggerFunc)) {
1708 ::Error(
"TCling::RegisterModule",
"cannot find dictionary module %s",
1713 bool oldValue =
false;
1721 clangDiagSuppr diagSuppr(
fInterpreter->getSema().getDiagnostics());
1723 #if defined(R__MUST_REVISIT)
1724 #if R__MUST_REVISIT(6,2)
1725 Warning(
"TCling::RegisterModule",
"Diagnostics suppression should be gone by now.");
1729 if (!hasHeaderParsingOnDemand){
1730 const cling::Transaction* watermark =
fInterpreter->getLastTransaction();
1731 cling::Interpreter::CompilationResult compRes =
fInterpreter->parseForModule(code.
Data());
1737 assert(cling::Interpreter::kSuccess == compRes &&
1738 "Payload code of a dictionary could not be parsed correctly.");
1739 if (compRes!=cling::Interpreter::kSuccess) {
1740 Warning(
"TCling::RegisterModule",
1741 "Problems declaring payload for module %s.", modulename) ;
1750 if (!hasHeaderParsingOnDemand) {
1777 if (!hasHeaderParsingOnDemand) {
1780 "#undef __ROOTCLING__\n"
1781 + gInterpreterClassDef +
1788 dlclose(dyLibHandle);
1810 typedef std::vector<std::pair<TClass*,DictFuncPtr_t> >::iterator iterator;
1816 if ( i->first == oldcl ) {
1838 const char* input_line,
1839 cling::Interpreter::CompilationResult& compRes,
1843 return metaProcessor->process(input_line, compRes, result);
1845 catch (cling::NullDerefException&
ex)
1847 Info(
"Handle",
"%s.\n%s", ex.what(),
"Execution of your code was aborted.");
1861 if (strstr(line,fantomline)) {
1876 gROOT->SetLineIsProcessing();
1880 gROOT->SetLineHasBeenProcessed();
1893 gROOT->SetLineIsProcessing();
1895 struct InterpreterFlagsRAII_t {
1897 bool fWasDynamicLookupEnabled;
1899 InterpreterFlagsRAII_t(cling::Interpreter* interp):
1901 fWasDynamicLookupEnabled(interp->isDynamicLookupEnabled())
1905 ~InterpreterFlagsRAII_t() {
1906 fInterpreter->enableDynamicLookup(fWasDynamicLookupEnabled);
1915 cling::Interpreter::CompilationResult compRes = cling::Interpreter::kSuccess;
1916 if (!strncmp(sLine.
Data(),
".L", 2) || !strncmp(sLine.
Data(),
".x", 2) ||
1917 !strncmp(sLine.
Data(),
".X", 2)) {
1925 aclicMode, arguments, io);
1926 if (aclicMode.
Length()) {
1928 R__ASSERT(aclicMode[0]==
'+' &&
"ACLiC mode must start with a +");
1930 if (aclicMode[1]==
'+') {
1936 compRes = cling::Interpreter::kFailure;
1938 if (strncmp(sLine.
Data(),
".L", 2) != 0) {
1941 if (arguments.Length()==0) {
1950 mod_line =
function + arguments + io;
1951 cling::MetaProcessor::MaybeRedirectOutputRAII RAII(
fMetaProcessor);
1957 bool unnamedMacro =
false;
1960 std::ifstream in(fname);
1961 static const char whitespace[] =
" \t\r\n";
1963 std::getline(in, line);
1964 std::string::size_type posNonWS = line.find_first_not_of(whitespace);
1965 if (posNonWS == std::string::npos)
continue;
1966 if (line[posNonWS] ==
'/' && line[posNonWS + 1] ==
'/')
1969 unnamedMacro = (line[posNonWS] ==
'{');
1975 cling::MetaProcessor::MaybeRedirectOutputRAII RAII(
fMetaProcessor);
1988 if (0!=strncmp(sLine.
Data(),
".autodict ",10) && sLine !=
".autodict") {
1991 cling::MetaProcessor::MaybeRedirectOutputRAII RAII(
fMetaProcessor);
1994 bool isInclusionDirective = sLine.
Contains(
"\n#include");
1995 if (isInclusionDirective) {
2003 if (result.isValid())
2012 case cling::Interpreter::kSuccess: *error =
kNoError;
break;
2013 case cling::Interpreter::kFailure: *error =
kRecoverable;
break;
2014 case cling::Interpreter::kMoreInputExpected: *error =
kProcessing;
break;
2017 if (compRes == cling::Interpreter::kSuccess
2019 && !result.isVoid())
2021 gROOT->SetLineHasBeenProcessed();
2022 return result.simplisticCastAs<
long>();
2024 gROOT->SetLineHasBeenProcessed();
2045 if (path[0] ==
'-' && path[1] ==
'I')
2069 static const TClassRef clRefString(
"std::string");
2070 if (clRefString == cl) {
2075 const char* cobj = (
const char*) obj;
2082 auto inspInspect = [&] (ptrdiff_t
offset){
2083 insp.
Inspect(const_cast<TClass*>(cl), insp.
GetParent(),
"_real", cobj, isTransient);
2088 switch(complexType) {
2095 inspInspect(
sizeof(
float));
2100 inspInspect(
sizeof(
double));
2105 inspInspect(
sizeof(
int));
2110 inspInspect(
sizeof(
long));
2115 static clang::PrintingPolicy
2117 if (printPol.Indentation) {
2119 printPol.Indentation = 0;
2120 printPol.SuppressInitializers =
true;
2123 const char* clname = cl->
GetName();
2126 const clang::ASTContext& astContext =
fInterpreter->getCI()->getASTContext();
2127 const clang::Decl *scopeDecl = 0;
2132 scopeDecl = clingCI->
GetDecl();
2133 recordType = clingCI->
GetType();
2135 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
2137 scopeDecl = lh.findScope(clname, cling::LookupHelper::NoDiagnostics,
2141 Error(
"InspectMembers",
"Cannot find Decl for class %s", clname);
2144 const clang::CXXRecordDecl* recordDecl
2145 = llvm::dyn_cast<
const clang::CXXRecordDecl>(scopeDecl);
2147 Error(
"InspectMembers",
"Cannot find Decl for class %s is not a CXXRecordDecl.", clname);
2154 cling::Interpreter::PushTransactionRAII deserRAII(
fInterpreter);
2156 astContext.getASTRecordLayout(recordDecl);
2158 for (clang::RecordDecl::field_iterator iField = recordDecl->field_begin(),
2159 eField = recordDecl->field_end(); iField != eField; ++iField) {}
2162 const clang::ASTRecordLayout& recLayout
2163 = astContext.getASTRecordLayout(recordDecl);
2170 if (cl->
Size() != recLayout.getSize().getQuantity()) {
2171 Error(
"InspectMembers",
"TClass and cling disagree on the size of the class %s, respectively %d %lld\n",
2175 unsigned iNField = 0;
2178 for (clang::RecordDecl::field_iterator iField = recordDecl->field_begin(),
2179 eField = recordDecl->field_end(); iField != eField;
2180 ++iField, ++iNField) {
2183 clang::QualType memberQT = iField->getType();
2188 memberQT = cling::utils::Transform::GetPartiallyDesugaredType(astContext, memberQT,
fNormalizedCtxt->
GetConfig(),
false );
2189 if (memberQT.isNull()) {
2190 std::string memberName;
2191 llvm::raw_string_ostream stream(memberName);
2192 iField->getNameForDiagnostic(stream, printPol,
true );
2194 Error(
"InspectMembers",
2195 "Cannot retrieve QualType for member %s while inspecting class %s",
2196 memberName.c_str(), clname);
2199 const clang::Type* memType = memberQT.getTypePtr();
2201 std::string memberName;
2202 llvm::raw_string_ostream stream(memberName);
2203 iField->getNameForDiagnostic(stream, printPol,
true );
2205 Error(
"InspectMembers",
2206 "Cannot retrieve Type for member %s while inspecting class %s",
2207 memberName.c_str(), clname);
2212 Bool_t ispointer =
false;
2213 if (memNonPtrType->isPointerType()) {
2215 clang::QualType ptrQT
2216 = memNonPtrType->getAs<clang::PointerType>()->getPointeeType();
2221 ptrQT = cling::utils::Transform::GetPartiallyDesugaredType(astContext, ptrQT,
fNormalizedCtxt->
GetConfig(),
false );
2222 if (ptrQT.isNull()) {
2223 std::string memberName;
2224 llvm::raw_string_ostream stream(memberName);
2225 iField->getNameForDiagnostic(stream, printPol,
true );
2227 Error(
"InspectMembers",
2228 "Cannot retrieve pointee Type for member %s while inspecting class %s",
2229 memberName.c_str(), clname);
2232 memNonPtrType = ptrQT.getTypePtr();
2236 llvm::SmallString<8> arraySize;
2237 const clang::ArrayType* arrType = memNonPtrType->getAsArrayTypeUnsafe();
2238 unsigned arrLevel = 0;
2239 bool haveErrorDueToArray =
false;
2243 const clang::ConstantArrayType* constArrType =
2244 clang::dyn_cast<clang::ConstantArrayType>(arrType);
2246 constArrType->getSize().toStringUnsigned(arraySize);
2249 clang::QualType subArrQT = arrType->getElementType();
2250 if (subArrQT.isNull()) {
2251 std::string memberName;
2252 llvm::raw_string_ostream stream(memberName);
2253 iField->getNameForDiagnostic(stream, printPol,
true );
2255 Error(
"InspectMembers",
2256 "Cannot retrieve QualType for array level %d (i.e. element type of %s) for member %s while inspecting class %s",
2257 arrLevel, subArrQT.getAsString(printPol).c_str(),
2258 memberName.c_str(), clname);
2259 haveErrorDueToArray =
true;
2262 arrType = subArrQT.getTypePtr()->getAsArrayTypeUnsafe();
2264 if (haveErrorDueToArray) {
2269 std::string fieldName;
2270 if (memType->isPointerType()) {
2275 std::string
ioname(iField->getName());
2278 fieldName += arraySize;
2283 clang::CharUnits
offset(astContext.toCharUnitsFromBits(recLayout.getFieldOffset(iNField)));
2284 ptrdiff_t fieldOffset = offset.getQuantity();
2294 auto iFiledQtype = iField->getType();
2295 if (
auto tagDecl = iFiledQtype->getAsTagDecl()){
2296 auto declAccess = tagDecl->getAccess();
2297 if (declAccess == AS_private || declAccess == AS_protected) {
2303 insp.
Inspect(const_cast<TClass*>(cl), insp.
GetParent(), fieldName.c_str(), cobj + fieldOffset, isTransient);
2306 const clang::CXXRecordDecl* fieldRecDecl = memNonPtrType->getAsCXXRecordDecl();
2310 std::string sFieldRecName;
2311 if (!ROOT::TMetaUtils::ExtractAttrPropertyFromName(*fieldRecDecl,
"iotype",sFieldRecName)){
2313 clang::QualType(memNonPtrType,0),
2323 insp.
InspectMember(sFieldRecName.c_str(), cobj + fieldOffset,
2324 (fieldName +
'.').c_str(),
transient);
2332 unsigned iNBase = 0;
2333 for (clang::CXXRecordDecl::base_class_const_iterator iBase
2334 = recordDecl->bases_begin(), eBase = recordDecl->bases_end();
2335 iBase != eBase; ++iBase, ++iNBase) {
2336 clang::QualType baseQT = iBase->getType();
2337 if (baseQT.isNull()) {
2338 Error(
"InspectMembers",
2339 "Cannot find QualType for base number %d while inspecting class %s",
2343 const clang::CXXRecordDecl* baseDecl
2344 = baseQT->getAsCXXRecordDecl();
2346 Error(
"InspectMembers",
2347 "Cannot find CXXRecordDecl for base number %d while inspecting class %s",
2352 std::string sBaseName;
2354 std::vector<TClass*> foundClasses;
2356 if (foundClasses.size()==1){
2357 baseCl=foundClasses[0];
2370 std::string qualNameForDiag;
2372 Error(
"InspectMembers",
2373 "Cannot find TClass for base class %s", qualNameForDiag.c_str() );
2378 if (iBase->isVirtual()) {
2381 Error(
"InspectMembers",
2382 "Base %s of class %s is virtual but no object provided",
2383 sBaseName.c_str(), clname);
2391 baseOffset = ci->
GetBaseOffset(baseCi, const_cast<void*>(obj),
2393 if (baseOffset == -1) {
2394 Error(
"InspectMembers",
2395 "Error calculating offset of virtual base %s of class %s",
2396 sBaseName.c_str(), clname);
2399 Error(
"InspectMembers",
2400 "Cannot calculate offset of virtual base %s of class %s",
2401 sBaseName.c_str(), clname);
2406 baseOffset = recLayout.getBaseClassOffset(baseDecl).getQuantity();
2453 bool oldDynLookup =
fInterpreter->isDynamicLookupEnabled();
2505 size_t at = std::string::npos;
2506 while ((at = file_name.find(
"/./")) != std::string::npos)
2507 file_name.replace(at, 3,
"/");
2509 std::string filesStr =
"";
2510 llvm::raw_string_ostream filesOS(filesStr);
2511 clang::SourceManager &SM =
fInterpreter->getCI()->getSourceManager();
2512 cling::ClangInternalState::printIncludedFiles(filesOS, SM);
2515 llvm::SmallVector<llvm::StringRef, 100> files;
2516 llvm::StringRef(filesStr).split(files,
"\n");
2518 std::set<std::string> fileMap;
2520 for (llvm::SmallVector<llvm::StringRef, 100>::const_iterator
2521 iF = files.begin(), iE = files.end(); iF != iE; ++iF) {
2522 if ((*iF) == file_name.c_str())
return kTRUE;
2523 fileMap.insert(*iF);
2526 if (fileMap.empty())
return kFALSE;
2529 TString sFilename(file_name.c_str());
2531 && fileMap.count(sFilename.Data())) {
2539 while (incPath.
Index(
" :") != -1) {
2543 sFilename = file_name.c_str();
2545 && fileMap.count(sFilename.Data())) {
2550 sFilename = file_name.c_str();
2552 cling::DynamicLibraryManager* dyLibManager
2555 if (dyLibManager->isLibraryLoaded(found)) {
2560 const clang::DirectoryLookup *CurDir = 0;
2561 clang::Preprocessor &PP =
fInterpreter->getCI()->getPreprocessor();
2562 clang::HeaderSearch &HS = PP.getHeaderSearchInfo();
2563 const clang::FileEntry *FE = HS.LookupFile(file_name.c_str(),
2564 clang::SourceLocation(),
2567 clang::ArrayRef<std::pair<
const clang::FileEntry *,
2568 const clang::DirectoryEntry *>>(),
2575 if (FE && FE->isValid()) {
2577 clang::SourceManager &SM =
fInterpreter->getCI()->getSourceManager();
2579 clang::FileID FID = SM.translateFile(FE);
2580 if (!FID.isInvalid() && FID.getHashValue() == 0)
2583 clang::SrcMgr::SLocEntry SLocE = SM.getSLocEntry(FID);
2584 if (SLocE.isFile() && SLocE.getFile().getContentCache()->getRawBuffer() == 0)
2586 if (!FID.isInvalid())
2590 sFilename = FE->getName();
2592 && fileMap.count(sFilename.Data())) {
2603 #if defined(R__WIN32) || defined(__CYGWIN__)
2604 HMODULE hModules[1024];
2606 unsigned long cbModules;
2608 hProcess = (
void *)::GetCurrentProcess();
2609 ::EnumProcessModules(hProcess, hModules,
sizeof(hModules), &cbModules);
2611 for (i = 1; i < (cbModules /
sizeof(
void *)); i++) {
2612 static const int bufsize = 260;
2613 wchar_t winname[bufsize];
2614 char posixname[bufsize];
2615 ::GetModuleFileNameExW(hProcess, hModules[i], winname, bufsize);
2616 #if defined(__CYGWIN__)
2617 cygwin_conv_path(CCP_WIN_W_TO_POSIX, winname, posixname, bufsize);
2619 std::wstring wpath = winname;
2620 std::replace(wpath.begin(), wpath.end(),
'\\',
'/');
2621 string path(wpath.begin(), wpath.end());
2622 strncpy(posixname, path.c_str(), bufsize);
2628 #elif defined(R__MACOSX)
2631 const char* imageName = 0;
2632 while ((imageName = _dyld_get_image_name(imageIndex))) {
2639 #elif defined(R__LINUX)
2640 struct PointerNo4_t {
2652 PointerNo4_t* procLinkMap = (PointerNo4_t*)dlopen(0, RTLD_LAZY | RTLD_GLOBAL);
2655 LinkMap_t* linkMap = (LinkMap_t*) ((PointerNo4_t*)procLinkMap->fPtr)->fPtr;
2661 while (iDyLib->fNext) {
2662 iDyLib = iDyLib->fNext;
2667 Error(
"TCling::UpdateListOfLoadedSharedLibraries",
2668 "Platform not supported!");
2679 if (!filename)
return;
2683 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
2684 if (!DLM->isLibraryLoaded(filename)) {
2685 DLM->loadLibrary(filename,
true );
2688 #if defined(R__MACOSX)
2690 if (!strncmp(filename,
"/usr/lib/system/", 16)
2691 || !strncmp(filename,
"/usr/lib/libc++", 15)
2692 || !strncmp(filename,
"/System/Library/Frameworks/", 27)
2693 || !strncmp(filename,
"/System/Library/PrivateFrameworks/", 34)
2694 || !strncmp(filename,
"/System/Library/CoreServices/", 29)
2695 || !strcmp(filename,
"cl_kernels")
2696 || strstr(filename,
"/usr/lib/libSystem")
2697 || strstr(filename,
"/usr/lib/libstdc++")
2698 || strstr(filename,
"/usr/lib/libicucore")
2699 || strstr(filename,
"/usr/lib/libbsm")
2700 || strstr(filename,
"/usr/lib/libobjc")
2701 || strstr(filename,
"/usr/lib/libresolv")
2702 || strstr(filename,
"/usr/lib/libauto")
2703 || strstr(filename,
"/usr/lib/libcups")
2704 || strstr(filename,
"/usr/lib/libDiagnosticMessagesClient")
2705 || strstr(filename,
"/usr/lib/liblangid")
2706 || strstr(filename,
"/usr/lib/libCRFSuite")
2707 || strstr(filename,
"/usr/lib/libpam")
2708 || strstr(filename,
"/usr/lib/libOpenScriptingUtil")
2709 || strstr(filename,
"/usr/lib/libextension"))
2711 #elif defined(__CYGWIN__)
2713 static const int bufsize = 260;
2714 char posixwindir[bufsize];
2715 char *windir = getenv(
"WINDIR");
2717 cygwin_conv_path(CCP_WIN_A_TO_POSIX, windir, posixwindir, bufsize);
2719 snprintf(posixwindir,
sizeof(posixwindir),
"/Windows/");
2720 if (strstr(filename, posixwindir) ||
2721 strstr(filename,
"/usr/bin/cyg"))
2723 #elif defined(R__WIN32)
2724 if (strstr(filename,
"/Windows/"))
2726 #elif defined (R__LINUX)
2727 if (strstr(filename,
"/ld-linux")
2728 || strstr(filename,
"linux-gnu/")
2729 || strstr(filename,
"/libstdc++.")
2730 || strstr(filename,
"/libgcc")
2731 || strstr(filename,
"/libc.")
2732 || strstr(filename,
"/libdl.")
2733 || strstr(filename,
"/libm."))
2751 Error(
"Load",
"Trying to load library (%s) from rootcling.",filename);
2757 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
2758 std::string canonLib = DLM->lookupLibrary(filename);
2759 cling::DynamicLibraryManager::LoadLibResult res
2760 = cling::DynamicLibraryManager::kLoadLibNotFound;
2761 if (!canonLib.empty()) {
2763 res = DLM->loadLibrary(filename, system);
2767 cling::Interpreter::CompilationResult compRes;
2768 cling::MetaProcessor::MaybeRedirectOutputRAII RAII(
fMetaProcessor);
2770 if (compRes == cling::Interpreter::kSuccess)
2771 res = cling::DynamicLibraryManager::kLoadLibSuccess;
2775 if (res == cling::DynamicLibraryManager::kLoadLibSuccess) {
2779 case cling::DynamicLibraryManager::kLoadLibSuccess:
return 0;
2780 case cling::DynamicLibraryManager::kLoadLibAlreadyLoaded:
return 1;
2830 Warning(
"Calc",
"waiting for cling thread to free");
2833 gROOT->SetLineIsProcessing();
2841 cling::Interpreter::CompilationResult cr =
fInterpreter->evaluate(line, valRef);
2842 if (cr != cling::Interpreter::kSuccess) {
2850 if (!valRef.isValid()) {
2859 if (valRef.isVoid()) {
2866 gROOT->SetLineHasBeenProcessed();
2869 return valRef.simplisticCastAs<
long>();
2876 void (*histaddFunc)(
const char*
line))
2881 #if defined(R__MUST_REVISIT)
2882 #if R__MUST_REVISIT(6,2)
2883 Warning(
"SetGetline",
"Cling should support the equivalent of SetGetlineFunc(getlineFunc, histaddFunc)");
2897 || T.deserialized_decls_begin() != T.deserialized_decls_end()
2898 || T.macros_begin() != T.macros_end()
2899 || ((!T.getFirstDecl().isNull()) && ((*T.getFirstDecl().begin()) != T.getWrapperFD()))) {
2916 std::set<TObject*>::iterator iSpecial = ((std::set<TObject*>*)
fgSetOfSpecials)->find(obj);
2933 #if defined(R__MUST_REVISIT)
2934 #if R__MUST_REVISIT(6,2)
2936 Warning(
"Reset",
"Cling should support the equivalent of scratch_upto(&fDictPos)");
2946 #if defined(R__MUST_REVISIT)
2947 #if R__MUST_REVISIT(6,2)
2949 Warning(
"ResetAll",
"Cling should support the equivalent of complete reset (unload everything but the startup decls.");
2976 #if defined(R__MUST_REVISIT)
2977 #if R__MUST_REVISIT(6,2)
2979 Warning(
"ResetGlobalVar",
"Cling should support the equivalent of resetglobalvar(obj)");
2991 #if defined(R__MUST_REVISIT)
2992 #if R__MUST_REVISIT(6,2)
2994 Warning(
"RewindDictionary",
"Cling should provide a way to revert transaction similar to rewinddictionary()");
3005 #if defined(R__MUST_REVISIT)
3006 #if R__MUST_REVISIT(6,2)
3008 Warning(
"DeleteGlobal",
"Cling should provide the equivalent of deleteglobal(obj), see also DeleteVariable.");
3020 #if defined(R__MUST_REVISIT)
3021 #if R__MUST_REVISIT(6,2)
3022 Warning(
"DeleteVariable",
"should do more that just reseting the value to zero");
3027 llvm::StringRef srName(name);
3028 const char* unscopedName =
name;
3029 llvm::StringRef::size_type posScope = srName.rfind(
"::");
3030 const clang::DeclContext* declCtx = 0;
3031 if (posScope != llvm::StringRef::npos) {
3032 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
3033 const clang::Decl* scopeDecl
3034 = lh.findScope(srName.substr(0, posScope),
3035 cling::LookupHelper::WithDiagnostics);
3037 Error(
"DeleteVariable",
"Cannot find enclosing scope for variable %s",
3041 declCtx = llvm::dyn_cast<clang::DeclContext>(scopeDecl);
3043 Error(
"DeleteVariable",
3044 "Enclosing scope for variable %s is not a declaration context",
3048 unscopedName += posScope + 2;
3050 clang::NamedDecl* nVarDecl
3051 = cling::utils::Lookup::Named(&
fInterpreter->getSema(), unscopedName, declCtx);
3053 Error(
"DeleteVariable",
"Unknown variable %s", name);
3056 clang::VarDecl* varDecl = llvm::dyn_cast<clang::VarDecl>(nVarDecl);
3058 Error(
"DeleteVariable",
"Entity %s is not a variable", name);
3062 clang::QualType qType = varDecl->getType();
3066 if (type->isPointerType()) {
3067 int** ppInt = (
int**)
fInterpreter->getAddressOfGlobal(GlobalDecl(varDecl));
3069 if (ppInt) *ppInt = 0;
3079 #if defined(R__MUST_REVISIT)
3080 #if R__MUST_REVISIT(6,2)
3082 Warning(
"SaveContext",
"Cling should provide a way to record a state watermark similar to store_dictposition(&fDictPos)");
3092 #if defined(R__MUST_REVISIT)
3093 #if R__MUST_REVISIT(6,2)
3095 Warning(
"SaveGlobalsContext",
"Cling should provide a way to record a watermark for the list of global variable similar to store_dictposition(&fDictPosGlobals)");
3141 if (!info->IsValid()) {
3165 zombieCandidate =
kTRUE;
3167 if (!info->IsLoaded()) {
3172 zombieCandidate =
kTRUE;
3222 static const char *anonEnum =
"anonymous enum ";
3223 static const int cmplen = strlen(anonEnum);
3225 if (0 == strncmp(name,anonEnum,cmplen)) {
3244 if (isClassOrNamespaceOnly &&
3247 const char *classname =
name;
3258 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
3260 const clang::Decl *decl
3261 = lh.findScope(classname,
3262 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
3263 : cling::LookupHelper::NoDiagnostics,
3267 decl = lh.findScope(buf,
3268 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
3269 : cling::LookupHelper::NoDiagnostics,
3286 clang::ClassTemplateSpecializationDecl *tmpltDecl =
3287 llvm::dyn_cast_or_null<clang::ClassTemplateSpecializationDecl>
3288 (type->getAsCXXRecordDecl());
3289 if (tmpltDecl && !tmpltDecl->getPointOfInstantiation().isValid()) {
3308 if (tci.
Property() & propertiesMask) {
3344 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
3345 const clang::Decl *decl
3346 = lh.findClassTemplate(name,
3347 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
3348 : cling::LookupHelper::NoDiagnostics);
3350 std::string strname =
"std::";
3352 decl = lh.findClassTemplate(strname,
3353 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
3354 : cling::LookupHelper::NoDiagnostics);
3396 D =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
3399 if (
const clang::DeclContext* DC = dyn_cast<clang::DeclContext>(D)) {
3400 cling::Interpreter::PushTransactionRAII deserRAII(
fInterpreter);
3402 llvm::SmallVector< DeclContext *, 4> allDeclContexts;
3403 const_cast< clang::DeclContext *
>(DC)->collectAllContexts(allDeclContexts);
3404 for (llvm::SmallVector<DeclContext*, 4>::iterator declIter = allDeclContexts.begin(), declEnd = allDeclContexts.end();
3405 declIter != declEnd; ++declIter) {
3407 for (clang::DeclContext::decl_iterator DI = (*declIter)->decls_begin(),
3408 DE = (*declIter)->decls_end(); DI != DE; ++DI) {
3409 if (
const clang::EnumDecl* ED = dyn_cast<clang::EnumDecl>(*DI)) {
3412 PrintingPolicy Policy(ED->getASTContext().getPrintingPolicy());
3413 llvm::raw_string_ostream stream(buf);
3414 ED->getNameForDiagnostic(stream, Policy,
false);
3418 const char*
name = buf.c_str();
3420 enumList.
Get(ED, name);
3442 D =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
3446 if (
const clang::DeclContext* DC = dyn_cast<clang::DeclContext>(D)) {
3447 cling::Interpreter::PushTransactionRAII deserRAII(
fInterpreter);
3449 llvm::SmallVector< DeclContext *, 4> allDeclContexts;
3450 const_cast< clang::DeclContext *
>(DC)->collectAllContexts(allDeclContexts);
3451 for (llvm::SmallVector<DeclContext*, 4>::iterator declIter = allDeclContexts.begin(),
3452 declEnd = allDeclContexts.end(); declIter != declEnd; ++declIter) {
3454 for (clang::DeclContext::decl_iterator DI = (*declIter)->decls_begin(),
3455 DE = (*declIter)->decls_end(); DI != DE; ++DI) {
3456 if (
const clang::FunctionTemplateDecl* FTD = dyn_cast<clang::FunctionTemplateDecl>(*DI)) {
3457 funcTempList->
Get(FTD);
3554 if (llvm::isa<clang::NamespaceDecl>(cli->
GetDecl())) {
3563 Error(
"GenerateTClass",
3564 "Cannot find %s::Class_Version()! Class version might be wrong.",
3571 if (newvers == -1) {
3579 newvers = callfunc.
ExecInt(0);
3581 Error(
"GenerateTClass",
3582 "Cannot invoke %s::Class_Version()! Class version might be wrong.",
3586 if (newvers != oldvers) {
3603 static void GenerateTClass_GatherInnerIncludes(cling::Interpreter *interp,
TString &includes,
TClingClassInfo *info)
3607 const clang::ClassTemplateSpecializationDecl *templateCl
3608 = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(info->
GetDecl());
3610 for(
unsigned int i=0; i < templateCl->getTemplateArgs().size(); ++i) {
3611 const clang::TemplateArgument &arg( templateCl->getTemplateArgs().get(i) );
3615 if (!uType->isFundamentalType() && !uType->isEnumeralType()) {
3617 const clang::CXXRecordDecl *argdecl = uType->getAsCXXRecordDecl();
3620 TClingClassInfo subinfo(interp,*(argdecl->getASTContext().getRecordType(argdecl).getTypePtr()));
3621 GenerateTClass_GatherInnerIncludes(interp, includes, &subinfo);
3624 llvm::raw_string_ostream OS(Result);
3625 arg.print(argdecl->getASTContext().getPrintingPolicy(),OS);
3626 Warning(
"TCling::GenerateTClass",
"Missing header file for %s",OS.str().c_str());
3641 if (!info || !info->
IsValid()) {
3642 Fatal(
"GenerateTClass",
"Requires a valid ClassInfo object");
3647 std::string classname;
3651 Info(
"GenerateTClass",
"Will (try to) generate the compiled TClass for %s.",classname.c_str());
3655 GenerateTClass_GatherInnerIncludes(
fInterpreter,includes,info);
3661 Error(
"GenerateTClass",
"Even though the dictionary generation for %s seemed successful we can't find the TClass bootstrap!",classname.c_str());
3667 cl =
new TClass(classinfo, version, 0, 0, -1, -1, silent);
3673 cl =
new TClass(classinfo, 1, 0, 0, -1, -1, silent);
3698 if (classes == 0 || classes[0] == 0) {
3702 std::vector<std::string> listClasses;
3704 const char*
current = classes, *prev = classes;
3709 listClasses.push_back(std::string(prev,
current - prev));
3712 else if (*(
current + 1) == 0) {
3713 listClasses.push_back(std::string(prev,
current + 1 - prev));
3717 std::vector<std::string> listIncludes;
3719 const char*
current = includes, *prev = includes;
3724 listIncludes.push_back(std::string(prev,
current - prev));
3727 else if (*(
current + 1) == 0) {
3728 listIncludes.push_back(std::string(prev,
current + 1 - prev));
3734 std::vector<std::string>(), std::vector<std::string>());
3755 if (
const ValueDecl* decl = (
const ValueDecl*) d){
3758 if (hasIoName && ioName != name)
return 0;
3776 const clang::Decl* possibleEnum = 0;
3781 const clang::DeclContext* dc = 0;
3782 if (
const clang::Decl* D = cci->
GetDecl()) {
3783 if (!(dc = dyn_cast<clang::NamespaceDecl>(D))) {
3784 dc = dyn_cast<clang::RecordDecl>(D);
3789 possibleEnum = cling::utils::Lookup::Named(&
fInterpreter->getSema(),
name, dc);
3791 Error(
"TCling::GetEnum",
"DeclContext not found for %s .\n", name);
3796 possibleEnum = cling::utils::Lookup::Named(&
fInterpreter->getSema(),
name);
3798 if (possibleEnum && (possibleEnum != (clang::Decl*)-1)
3799 && isa<clang::EnumDecl>(possibleEnum)) {
3800 return possibleEnum;
3812 llvm::StringRef mangled_name = gv->getName();
3827 std::string scopename(demangled_name_c);
3828 free(demangled_name_c);
3834 std::string dataname;
3836 if (!strncmp(scopename.c_str(),
"typeinfo for ",
sizeof(
"typeinfo for ")-1)) {
3837 scopename.erase(0,
sizeof(
"typeinfo for ")-1);
3838 }
if (!strncmp(scopename.c_str(),
"vtable for ",
sizeof(
"vtable for ")-1)) {
3839 scopename.erase(0,
sizeof(
"vtable for ")-1);
3842 std::string::size_type pos = scopename.rfind(
'(');
3843 if (pos != std::string::npos) {
3847 pos = scopename.rfind(
':');
3848 if (pos != std::string::npos) {
3849 if ((pos != 0) && (scopename[pos-1] ==
':')) {
3850 dataname = scopename.substr(pos+1);
3851 scopename.erase(pos-1);
3855 dataname = scopename;
3863 if (scopename.size()) {
3879 Error(
"GetDataMemberWithValue()",
"not implemented");
3889 Error(
"GetDataMemberAtAddr()",
"not implemented");
3899 const char* params,
Bool_t objectIsConst )
3911 func.
SetFunc(&gcl, method, params, &offset);
3917 return mangled_name;
3926 const char* proto,
Bool_t objectIsConst ,
3932 GetMethod(method, proto, objectIsConst, 0 , mode).GetMangledName();
3944 const char* params,
Bool_t objectIsConst )
3956 func.
SetFunc(&gcl, method, params, &offset);
3985 std::vector<DeclId_t>& res)
const
3988 const clang::Decl* CtxDecl
3990 S.Context.getTranslationUnitDecl();
3991 const clang::DeclContext*
3992 DeclCtx = llvm::dyn_cast<
const clang::RecordDecl>(CtxDecl);
3994 DeclCtx = dyn_cast<clang::NamespaceDecl>(CtxDecl);
3995 if (!DeclCtx)
return;
3996 clang::DeclarationName DName
3997 = &S.Context.Idents.get(funcname);
3998 clang::LookupResult
R(S, DName, clang::SourceLocation(),
3999 Sema::LookupOrdinaryName, clang::Sema::ForRedeclaration);
4000 S.LookupQualifiedName(R, const_cast<DeclContext*>(DeclCtx));
4001 if (R.empty())
return;
4003 res.reserve(res.size() + (R.end() - R.begin()));
4004 for (clang::LookupResult::iterator IR = R.begin(), ER = R.end();
4006 if (
const clang::FunctionDecl* FD
4007 = llvm::dyn_cast<const clang::FunctionDecl>(*IR)) {
4008 if (!FD->getDescribedFunctionTemplate()) {
4152 func.
SetFunc(&cl,
function, params, &offset);
4168 const char* params,
Bool_t objectIsConst,
int* error)
4188 const char* params,
int* error)
4190 Execute(obj,cl,method,params,
false,error);
4205 Error(
"Execute",
"No method was defined");
4214 if (argc > nparms) {
4215 Error(
"Execute",
"Too many parameters to call %s, got %d but expected at most %d.",method->
GetName(),argc,nparms);
4218 if (nparms != argc) {
4228 Int_t firstDefault = -1;
4229 for (
Int_t i = 0; i < nparms; i ++) {
4236 if (firstDefault >= 0) {
4237 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);
4239 Error(
"Execute",
"Too few arguments to call %s, got only %d but expected %d.",method->
GetName(),argc,nparms);
4245 const char* listpar =
"";
4250 for (
Int_t i = 0; i < argc; i ++) {
4259 chpar += (nxtpar->String()).
ReplaceAll(
"\"",
"\\\"");
4266 complete += nxtpar->String();
4269 listpar = complete.
Data();
4287 const CXXMethodDecl * mdecl = dyn_cast<CXXMethodDecl>(minfo->
GetMethodDecl());
4296 const void* args[] ,
4301 Error(
"ExecuteWithArgsAndReturn",
"No method was defined");
4307 func.ExecWithArgsAndReturn(address, args, nargs, ret);
4328 Warning(
"GetTopLevelMacroName",
"Must change return type!");
4375 #if defined(R__MUST_REVISIT)
4376 #if R__MUST_REVISIT(6,0)
4377 Warning(
"GetCurrentMacroName",
"Must change return type!");
4390 TTHREAD_TLS(
char*)
t = 0;
4391 TTHREAD_TLS(
unsigned int) tlen = 0;
4393 unsigned int dlen = strlen(typeDesc);
4396 t =
new char[dlen + 1];
4399 const char* s, *template_start;
4400 if (!strstr(typeDesc,
"(*)(")) {
4401 s = strchr(typeDesc,
' ');
4402 template_start = strchr(typeDesc,
'<');
4403 if (!strcmp(typeDesc,
"long long")) {
4404 strlcpy(
t, typeDesc, dlen + 1);
4406 else if (!strncmp(typeDesc,
"unsigned ", s + 1 - typeDesc)) {
4407 strlcpy(
t, typeDesc, dlen + 1);
4413 else if (s && (template_start == 0 || (s < template_start))) {
4414 strlcpy(
t, s + 1, dlen + 1);
4417 strlcpy(
t, typeDesc, dlen + 1);
4421 strlcpy(
t, typeDesc, dlen + 1);
4424 while (l > 0 && (
t[l - 1] ==
'*' ||
t[l - 1] ==
'&')) {
4438 const std::map<char, unsigned int> keyLenMap = {{
'c',6},{
'n',10},{
't',8},{
'h',7},{
'e',5}};
4440 if (rootmapfile && *rootmapfile) {
4444 std::ifstream
file(rootmapfile);
4445 std::string
line; line.reserve(200);
4446 std::string lib_name; line.reserve(100);
4447 bool newFormat=
false;
4448 while (getline(file, line,
'\n')) {
4450 (strstr(line.c_str(),
"Library.")!=
nullptr || strstr(line.c_str(),
"Declare.")!=
nullptr)) {
4456 if (line.compare(0, 9,
"{ decls }") == 0) {
4459 while (getline(file, line,
'\n')) {
4460 if (line[0] ==
'[')
break;
4461 uniqueString->
Append(line);
4464 const char firstChar=line[0];
4465 if (firstChar ==
'[') {
4467 auto brpos = line.find(
']');
4468 if (brpos == string::npos)
continue;
4469 lib_name = line.substr(1, brpos-1);
4471 while( lib_name[nspaces] ==
' ' ) ++nspaces;
4472 if (nspaces) lib_name.replace(0, nspaces,
"");
4474 TString lib_nameTstr(lib_name.c_str());
4475 TObjArray* tokens = lib_nameTstr.Tokenize(
" ");
4479 Info(
"ReadRootmapFile",
"new section for %s", lib_nameTstr.Data());
4482 Info(
"ReadRootmapFile",
"section for %s (library does not exist)", lib_nameTstr.Data());
4489 auto keyLenIt = keyLenMap.find(firstChar);
4490 if (keyLenIt == keyLenMap.end())
continue;
4491 unsigned int keyLen = keyLenIt->second;
4493 const char *keyname = line.c_str()+keyLen;
4495 Info(
"ReadRootmapFile",
"class %s in %s", keyname, lib_name.c_str());
4498 if(lib_name != isThere->GetValue()){
4499 if (firstChar ==
'n') {
4501 Info(
"ReadRootmapFile",
"namespace %s found in %s is already in %s",
4502 keyname, lib_name.c_str(), isThere->GetValue());
4503 }
else if (firstChar ==
'h'){
4505 lib_name+=isThere->GetValue();
4509 Warning(
"ReadRootmapFile",
"%s %s found in %s is already in %s", line.substr(0, keyLen).c_str(),
4510 keyname, lib_name.c_str(), isThere->GetValue());
4514 Info(
"ReadRootmapFile",
"Key %s was already defined for %s", keyname, lib_name.c_str());
4555 #if defined(R__MACOSX) && (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR)
4587 using namespace clang;
4589 class ExtVisibleStorageAdder:
public RecursiveASTVisitor<ExtVisibleStorageAdder>{
4595 ExtVisibleStorageAdder(std::unordered_set<const NamespaceDecl*>& nsSet): fNSSet(nsSet) {};
4596 bool VisitNamespaceDecl(NamespaceDecl* nsDecl) {
4600 nsDecl->setHasExternalVisibleStorage();
4601 fNSSet.insert(nsDecl);
4605 std::unordered_set<const NamespaceDecl*>& fNSSet;
4651 for (
Int_t j = 0; j < i; j++) {
4662 Info(
"LoadLibraryMap",
"%s", d.
Data());
4673 Info(
"LoadLibraryMap",
" rootmap file: %s", p.
Data());
4695 Warning(
"LoadLibraryMap",
"please rename %s to end with \".rootmap\"", p.
Data());
4708 if (rootmapfile && *rootmapfile) {
4715 else if (res == -3) {
4727 if (!strncmp(cls.
Data(),
"Library.", 8) && cls.
Length() > 8) {
4746 Info(
"LoadLibraryMap",
"class %s in %s", cls.
Data(), wlib);
4749 Info(
"LoadLibraryMap",
"class %s in %s (library does not exist)", cls.
Data(), lib);
4764 else if (!strncmp(cls.
Data(),
"Declare.", 8) && cls.
Length() > 8) {
4774 cling::Transaction* T =
nullptr;
4776 assert(cling::Interpreter::kSuccess == compRes &&
"A declaration in a rootmap could not be compiled");
4778 if (compRes!=cling::Interpreter::kSuccess){
4780 "Problems in %s declaring '%s' were encountered.", rootmapfile, uniqueString.
Data()) ;
4785 for (
auto declIt = T->decls_begin(); declIt < T->decls_end(); ++declIt) {
4786 if (declIt->m_DGR.isSingleDecl()) {
4787 if (Decl* D = declIt->m_DGR.getSingleDecl()) {
4788 if (NamespaceDecl* NSD = dyn_cast<NamespaceDecl>(D)) {
4789 evsAdder.TraverseDecl(NSD);
4824 for (
Int_t ilib = 0; ilib < nrSharedLibs; ilib++) {
4831 TString rootMapBaseStr = sharedLibBaseStr;
4832 if (sharedLibBaseStr.
EndsWith(
".dll")) {
4835 else if (sharedLibBaseStr.
EndsWith(
".DLL")) {
4838 else if (sharedLibBaseStr.
EndsWith(
".so")) {
4841 else if (sharedLibBaseStr.
EndsWith(
".sl")) {
4844 else if (sharedLibBaseStr.
EndsWith(
".dl")) {
4847 else if (sharedLibBaseStr.
EndsWith(
".a")) {
4851 Error(
"ReloadAllSharedLibraryMaps",
"Unknown library type %s", sharedLibBaseStr.
Data());
4855 rootMapBaseStr +=
".rootmap";
4858 Error(
"ReloadAllSharedLibraryMaps",
"Could not find rootmap %s in path", rootMap);
4865 Error(
"ReloadAllSharedLibraryMaps",
"Error loading map %s", rootMap);
4900 if (!
fMapfile || !library || !*library) {
4908 size_t len = libname.
Length();
4924 if (!strncmp(cls.
Data(),
"Library.", 8) && cls.
Length() > 8) {
4933 if (!strncmp(lib, libname.
Data(), len)) {
4935 Error(
"UnloadLibraryMap",
"entry for <%s, %s> not found in library map table", cls.
Data(), lib);
4943 TString library_rootmap(library);
4944 if (!library_rootmap.
EndsWith(
".rootmap"))
4945 library_rootmap.
Append(
".rootmap");
5000 free(demangled_name);
5016 std::string demangled_name(demangled_name_c);
5017 free(demangled_name_c);
5030 result =
AutoLoad(demangled_name.c_str(), knowDictNotLoaded);
5055 Info(
"TCling::AutoLoad",
5056 "Trying to autoload for %s", cls);
5062 Info(
"TCling::AutoLoad",
5063 "Disabled due to gROOT or gInterpreter being invalid/not ready (the class name is %s)", cls);
5070 Info(
"TCling::AutoLoad",
5071 "Explicitly disabled (the class name is %s)", cls);
5092 if (
gROOT->LoadClass(cls, deplib) == 0) {
5094 Info(
"TCling::AutoLoad",
5095 "loaded dependent library %s for %s", deplib, cls);
5099 Error(
"TCling::AutoLoad",
5100 "failure loading dependent library %s for %s",
5105 if (lib && lib[0]) {
5106 if (
gROOT->LoadClass(cls, lib) == 0) {
5108 Info(
"TCling::AutoLoad",
5109 "loaded library %s for %s", lib, cls);
5114 Error(
"TCling::AutoLoad",
5115 "failure loading library %s for %s", lib, cls);
5130 cling::Interpreter *interpreter)
5133 Sema &SemaR = interpreter->getSema();
5134 ASTContext&
C = SemaR.getASTContext();
5135 Preprocessor &PP = SemaR.getPreprocessor();
5136 Parser&
P =
const_cast<Parser&
>(interpreter->getParser());
5137 Preprocessor::CleanupAndRestoreCacheRAII cleanupRAII(PP);
5138 Parser::ParserCurTokRestoreRAII savedCurToken(P);
5141 Token& Tok =
const_cast<Token&
>(P.getCurToken());
5142 Tok.setKind(tok::semi);
5148 Sema::ContextAndScopeRAII pushedDCAndS(SemaR, C.getTranslationUnitDecl(),
5150 std::string code = gNonInterpreterClassDef ;
5157 code += (
"#include \"");
5161 code += (
"#ifdef __ROOTCLING__\n"
5162 "#undef __ROOTCLING__\n"
5163 + gInterpreterClassDef +
5166 cling::Interpreter::CompilationResult cr;
5172 clangDiagSuppr diagSuppr(SemaR.getDiagnostics());
5174 #if defined(R__MUST_REVISIT)
5175 #if R__MUST_REVISIT(6,2)
5176 Warning(
"TCling::RegisterModule",
"Diagnostics suppression should be gone by now.");
5180 cr = interpreter->parseForModule(code);
5198 Int_t nHheadersParsed = 0;
5201 bool skipFirstEntry =
false;
5202 std::vector<std::string> autoparseKeys;
5203 if (strchr(cls,
'<')) {
5209 if (!autoparseKeys.empty()){
5210 TString templateName(autoparseKeys[0]);
5211 auto tokens = templateName.
Tokenize(
"::");
5212 clang::NamedDecl* previousScopeAsNamedDecl =
nullptr;
5213 clang::DeclContext* previousScopeAsContext =
nullptr;
5214 for (
auto const & scopeObj : *tokens){
5215 auto scopeName = ((
TObjString*) scopeObj)->String().Data();
5216 previousScopeAsNamedDecl = cling::utils::Lookup::Named(&
fInterpreter->getSema(), scopeName, previousScopeAsContext);
5218 if ((clang::NamedDecl*)-1 == previousScopeAsNamedDecl)
break;
5219 previousScopeAsContext = llvm::dyn_cast_or_null<clang::DeclContext>(previousScopeAsNamedDecl);
5220 if (!previousScopeAsContext)
break;
5224 if (
auto templateDecl = llvm::dyn_cast_or_null<clang::ClassTemplateDecl>(previousScopeAsNamedDecl)) {
5225 if (
auto templatedDecl = templateDecl->getTemplatedDecl()) {
5226 skipFirstEntry =
nullptr != templatedDecl->getDefinition();
5232 if (topLevel) autoparseKeys.emplace_back(cls);
5234 for (
const auto & apKeyStr : autoparseKeys) {
5235 if (skipFirstEntry) {
5236 skipFirstEntry=
false;
5239 if (apKeyStr.empty())
continue;
5240 const char *apKey = apKeyStr.c_str();
5244 Info(
"TCling::AutoParse",
5245 "Starting autoparse for %s\n", apKey);
5250 const cling::Transaction *T =
fInterpreter->getCurrentTransaction();
5252 auto const &hNamesPtrs =
iter->second;
5254 Info(
"TCling::AutoParse",
5255 "We can proceed for %s. We have %s headers.", apKey, std::to_string(hNamesPtrs.size()).c_str());
5257 for (
auto & hName : hNamesPtrs) {
5259 if (0 !=
fPayloads.count(normNameHash)) {
5260 float initRSSval=0.f, initVSIZEval=0.f;
5262 (
void) initVSIZEval;
5265 "Parsing full payload for %s", apKey);
5272 if (cRes != cling::Interpreter::kSuccess) {
5273 if (hName[0] ==
'\n')
5274 Error(
"AutoParse",
"Error parsing payload code for class %s with content:\n%s", apKey, hName);
5283 Info(
"Autoparse",
">>> RSS key %s - before %.3f MB - after %.3f MB - delta %.3f MB", apKey, initRSSval, endRSSval, endRSSval-initRSSval);
5284 Info(
"Autoparse",
">>> VSIZE key %s - before %.3f MB - after %.3f MB - delta %.3f MB", apKey, initVSIZEval, endVSIZEval, endVSIZEval-initVSIZEval);
5290 "Parsing single header %s", hName);
5293 if (cRes != cling::Interpreter::kSuccess) {
5294 Error(
"AutoParse",
"Error parsing headerfile %s for class %s.", hName, apKey);
5306 if (strchr(apKey,
'<')) {
5313 return nHheadersParsed;
5334 Info(
"TCling::AutoParse",
5335 "Trying to autoparse for %s", cls);
5351 if (nHheadersParsed != 0) {
5370 return nHheadersParsed > 0 ? 1 : 0;
5383 mangled_name.c_str())) {
5394 std::string
name(demangled_name_c);
5395 free(demangled_name_c);
5403 if (!strncmp(name.c_str(),
"typeinfo for ",
sizeof(
"typeinfo for ")-1)) {
5404 name.erase(0,
sizeof(
"typeinfo for ")-1);
5405 }
else if (!strncmp(name.c_str(),
"vtable for ",
sizeof(
"vtable for ")-1)) {
5406 name.erase(0,
sizeof(
"vtable for ")-1);
5407 }
else if (!strncmp(name.c_str(),
"operator",
sizeof(
"operator")-1)
5408 && !isalnum(name[
sizeof(
"operator")])) {
5410 name.erase(0,
sizeof(
"operator")-1);
5411 std::string::size_type pos = name.rfind(
'(');
5412 if (pos != std::string::npos) {
5413 name.erase(0, pos + 1);
5414 pos = name.find(
",");
5415 if (pos != std::string::npos) {
5419 pos = name.rfind(
" const");
5420 if (pos != std::string::npos) {
5421 name.erase(pos, strlen(
" const"));
5423 while (!name.empty() && strchr(
"&*", name.back()))
5424 name.erase(name.length() - 1);
5428 std::string::size_type pos = name.rfind(
'(');
5429 if (pos != std::string::npos) {
5433 pos = name.rfind(
':');
5434 if (pos != std::string::npos) {
5435 if ((pos != 0) && (name[pos-1] ==
':')) {
5452 while (libs.
Tokenize(lib, posLib)) {
5462 void* addr = llvm::sys::DynamicLibrary::SearchForAddressOfSymbol(mangled_name.c_str());
5489 const NamedDecl* ND =
static_cast<const NamedDecl*
>(vTD);
5490 const TagDecl* td = dyn_cast<TagDecl>(ND);
5494 tdDef = td->getDefinition();
5500 if (llvm::isa<clang::FunctionDecl>(td->getDeclContext())) {
5504 clang::QualType
type( td->getTypeForDecl(), 0 );
5506 auto declName=ND->getNameAsString();
5514 name = ND->getNameAsString();
5529 const TagDecl* tdOld = llvm::dyn_cast_or_null<TagDecl>(cci->
GetDecl());
5530 if (!tdOld || (tdDef && tdDef != tdOld)) {
5587 std::set<TClass*> modifiedTClasses;
5592 bool isTUTransaction =
false;
5593 if (T.decls_end()-T.decls_begin() == 1 && !T.hasNestedTransactions()) {
5594 clang::Decl* FirstDecl = *(T.decls_begin()->m_DGR.begin());
5595 if (clang::TranslationUnitDecl* TU
5596 = dyn_cast<clang::TranslationUnitDecl>(FirstDecl)) {
5599 isTUTransaction =
true;
5607 cling::Interpreter::PushTransactionRAII RAII(
fInterpreter);
5608 for (clang::DeclContext::decl_iterator TUI = TU->decls_begin(),
5609 TUE = TU->decls_end(); TUI != TUE; ++TUI)
5614 std::set<const void*> TransactionDeclSet;
5615 if (!isTUTransaction && T.decls_end() - T.decls_begin()) {
5616 const clang::Decl* WrapperFD = T.getWrapperFD();
5617 for (cling::Transaction::const_iterator
I = T.decls_begin(),
E = T.decls_end();
5619 if (
I->m_Call != cling::Transaction::kCCIHandleTopLevelDecl
5620 &&
I->m_Call != cling::Transaction::kCCIHandleTagDeclDefinition)
5623 for (DeclGroupRef::const_iterator DI =
I->m_DGR.begin(),
5624 DE =
I->m_DGR.end(); DI != DE; ++DI) {
5625 if (*DI == WrapperFD)
5627 TransactionDeclSet.insert(*DI);
5628 ((
TCling*)
gCling)->HandleNewDecl(*DI,
false, modifiedTClasses);
5635 for (cling::Transaction::const_iterator
I = T.deserialized_decls_begin(),
5636 E = T.deserialized_decls_end();
I !=
E; ++
I) {
5637 for (DeclGroupRef::const_iterator DI =
I->m_DGR.begin(),
5638 DE =
I->m_DGR.end(); DI != DE; ++DI)
5639 if (TransactionDeclSet.find(*DI) == TransactionDeclSet.end()) {
5655 std::vector<TClass*> modifiedTClassesDiff(modifiedTClasses.size());
5656 std::vector<TClass*>::iterator it;
5657 it = set_difference(modifiedTClasses.begin(), modifiedTClasses.end(),
5660 modifiedTClassesDiff.begin());
5661 modifiedTClassesDiff.resize(it - modifiedTClassesDiff.begin());
5664 ((
TCling*)
gCling)->GetModTClasses().insert(modifiedTClassesDiff.begin(),
5665 modifiedTClassesDiff.end());
5666 for (std::vector<TClass*>::const_iterator
I = modifiedTClassesDiff.begin(),
5667 E = modifiedTClassesDiff.end();
I !=
E; ++
I) {
5669 if (!
gROOT->GetListOfClasses()->FindObject(*
I)) {
5673 cling::Interpreter::PushTransactionRAII RAII(
fInterpreter);
5693 for (DeclContext::decl_iterator RI = DC->decls_begin(), RE = DC->decls_end(); RI != RE; ++RI) {
5694 if (isa<VarDecl>(*RI) || isa<FieldDecl>(*RI)) {
5695 const clang::ValueDecl* VD = dyn_cast<ValueDecl>(*RI);
5699 datamembers->
Unload(var);
5702 }
else if (
const FunctionDecl* FD = dyn_cast<FunctionDecl>(*RI)) {
5705 functions->
Unload(
function);
5706 function->Update(0);
5708 }
else if (
const EnumDecl* ED = dyn_cast<EnumDecl>(*RI)) {
5716 if (enumConst && enumConst->IsValid()) {
5717 datamembers->
Unload(enumConst);
5718 enumConst->Update(0);
5724 }
else if (
const FunctionTemplateDecl* FTD = dyn_cast<FunctionTemplateDecl>(*RI)) {
5726 if (functiontemplate) {
5727 functiontemplates->
Unload(functiontemplate);
5728 functiontemplate->
Update(0);
5745 cling::Transaction::const_nested_iterator iNested = T.nested_begin();
5746 for(cling::Transaction::const_iterator
I = T.decls_begin(),
E = T.decls_end();
5748 if (
I->m_Call == cling::Transaction::kCCIHandleVTable)
5751 if (
I->m_Call == cling::Transaction::kCCINone) {
5757 for (DeclGroupRef::const_iterator DI =
I->m_DGR.begin(),
5758 DE =
I->m_DGR.end(); DI != DE; ++DI) {
5762 if ( (*DI)->isFromASTFile() )
5766 if (isa<VarDecl>(*DI) || isa<EnumConstantDecl>(*DI)) {
5784 }
else if (
const FunctionDecl* FD = dyn_cast<FunctionDecl>(*DI)) {
5786 if (
function &&
function->IsValid()) {
5787 functions->
Unload(
function);
5788 function->Update(0);
5791 }
else if (
const FunctionTemplateDecl* FTD = dyn_cast<FunctionTemplateDecl>(*DI)) {
5793 if (functiontemplate) {
5794 functiontemplates->
Unload(functiontemplate);
5795 functiontemplate->
Update(0);
5798 }
else if (
const EnumDecl* ED = dyn_cast<EnumDecl>(*DI)) {
5801 TIter iEnumConst(e->GetConstants());
5807 globals->
Unload(enumConst);
5808 enumConst->Update(0);
5816 }
else if (
const clang::RecordDecl* RD = dyn_cast<RecordDecl>(*DI)) {
5817 std::vector<TClass*> vectTClass;
5819 if (RD->isCompleteDefinition()) {
5821 for (std::vector<TClass*>::iterator CI = vectTClass.begin(), CE = vectTClass.end();
5824 (*CI)->ResetClassInfo();
5829 }
else if (
const clang::NamespaceDecl* ND = dyn_cast<NamespaceDecl>(*DI)) {
5830 std::vector<TClass*> vectTClass;
5832 for (std::vector<TClass*>::iterator CI = vectTClass.begin(), CE = vectTClass.end();
5835 if (ND->isOriginalNamespace()) {
5836 (*CI)->ResetClassInfo();
5858 auto const &hNamesPtrs =
iter->second;
5859 for (
auto &hName : hNamesPtrs) {
5861 Info(
"TransactionRollback",
5862 "Restoring ability to autoaparse: %s", hName);
5901 if (!cls || !*cls) {
5909 const char* libs = libs_record->
GetValue();
5910 return (*libs) ? libs : 0;
5927 const char* libs = libs_record->
GetValue();
5928 return (*libs) ? libs : 0;
5943 if (!
fMapfile || !lib || !lib[0]) {
5953 size_t len = libname.
Length();
5955 const char* libs = rec->
GetValue();
5956 if (!strncmp(libs, libname.
Data(), len) && strlen(libs) >= len
5957 && (!libs[len] || libs[len] ==
' ' || libs[len] ==
'.')) {
5970 #if defined(R__MUST_REVISIT)
5971 #if R__MUST_REVISIT(6,2)
5972 Warning(
"IsErrorMessagesEnabled",
"Interface not available yet.");
5984 #if defined(R__MUST_REVISIT)
5985 #if R__MUST_REVISIT(6,2)
5986 Warning(
"SetErrorMessages",
"Interface not available yet.");
6002 llvm::SmallVector<std::string, 10> includePaths;
6004 fInterpreter->GetIncludePaths(includePaths,
false,
true);
6005 if (
const size_t nPaths = includePaths.size()) {
6006 assert(!(nPaths & 1) &&
"GetIncludePath, number of paths and options is not equal");
6008 for (
size_t i = 0; i < nPaths; i += 2) {
6013 if (includePaths[i] !=
"-I")
6047 assert(fout != 0 &&
"DisplayIncludePath, 'fout' parameter is null");
6049 llvm::SmallVector<std::string, 10> includePaths;
6051 fInterpreter->GetIncludePaths(includePaths,
false,
true);
6052 if (
const size_t nPaths = includePaths.size()) {
6053 assert(!(nPaths & 1) &&
"DisplayIncludePath, number of paths and options is not equal");
6055 std::string allIncludes(
"include path:");
6056 for (
size_t i = 0; i < nPaths; i += 2) {
6058 allIncludes += includePaths[i];
6060 if (includePaths[i] !=
"-I")
6062 allIncludes += includePaths[i + 1];
6065 fprintf(fout,
"%s\n", allIncludes.c_str());
6084 #if defined(R__MUST_REVISIT)
6085 #if R__MUST_REVISIT(6,2)
6086 Warning(
"GenericError",
"Interface not available yet.");
6116 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.");
6124 Error(
"Getp2f2funcname",
"Will not be implemented: "
6125 "all function pointers are compiled!");
6134 #if defined(R__MUST_REVISIT)
6135 #if R__MUST_REVISIT(6,2)
6136 Warning(
"GetSecurityError",
"Interface not available yet.");
6147 cling::Interpreter::CompilationResult compRes;
6148 cling::MetaProcessor::MaybeRedirectOutputRAII RAII(
fMetaProcessor);
6150 return compRes == cling::Interpreter::kFailure;
6161 return (
fInterpreter->declare(text) == cling::Interpreter::kSuccess);
6169 TTHREAD_TLS_DECL(std::string,
buffer);
6237 #if defined(R__MUST_REVISIT)
6238 #if R__MUST_REVISIT(6,2)
6239 Warning(
"SetErrmsgcallback",
"Interface not available yet.");
6251 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.");
6259 Error(
"SetRTLD_NOW()",
"Will never be implemented! Don't use!");
6266 Error(
"SetRTLD_LAZY()",
"Will never be implemented! Don't use!");
6281 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
6282 std::string canonical = DLM->lookupLibrary(path);
6283 if (canonical.empty()) {
6287 cling::Interpreter::CompilationResult compRes;
6288 cling::MetaProcessor::MaybeRedirectOutputRAII RAII(
fMetaProcessor);
6290 return compRes == cling::Interpreter::kFailure;
6306 using namespace cling;
6320 if (value.isValid() && value.needsManagedAllocation()) {
6333 cling::Interpreter *interpreter = ((
TCling*)
gCling)->GetInterpreter();
6343 auto iSpecObj = iSpecObjMap->second.find(Name);
6344 if (iSpecObj != iSpecObjMap->second.end()) {
6346 return iSpecObj->second;
6352 Sema &SemaR = interpreter->getSema();
6353 ASTContext&
C = SemaR.getASTContext();
6354 Preprocessor &PP = SemaR.getPreprocessor();
6355 Parser&
P =
const_cast<Parser&
>(interpreter->getParser());
6356 Preprocessor::CleanupAndRestoreCacheRAII cleanupRAII(PP);
6357 Parser::ParserCurTokRestoreRAII savedCurToken(P);
6360 Token& Tok =
const_cast<Token&
>(P.getCurToken());
6361 Tok.setKind(tok::semi);
6367 Sema::ContextAndScopeRAII pushedDCAndS(SemaR, C.getTranslationUnitDecl(),
6370 TObject* specObj =
gROOT->FindSpecialObject(Name, LookupCtx);
6373 Error(
"GetObjectAddress",
"Got a special object without LookupCtx!");
6387 clang::CXXRecordDecl* klass)
const
6389 using namespace clang;
6390 ASTContext& Ctx = klass->getASTContext();
6391 FriendDecl::FriendUnion friendUnion(
function);
6394 FriendDecl* friendDecl = FriendDecl::Create(Ctx, klass, sl, friendUnion, sl);
6395 klass->pushFriendDecl(friendDecl);
6409 if (func)
return ((
TClingCallFunc*)func)->GetDecl()->getCanonicalDecl();
6480 f->
Exec(address, &val);
6494 const void* args[] ,
6661 f->
SetFunc(ci, method, params, offset);
6670 f->
SetFunc(ci, method, params, objectIsConst, offset);
6698 f->
SetFuncProto(ci, method, proto, objectIsConst, offset, mode);
6708 llvm::SmallVector<clang::QualType, 4> funcProto;
6709 for (std::vector<TypeInfo_t*>::const_iterator
iter = proto.begin(), end = proto.end();
6723 llvm::SmallVector<clang::QualType, 4> funcProto;
6724 for (std::vector<TypeInfo_t*>::const_iterator
iter = proto.begin(), end = proto.end();
6728 f->
SetFuncProto(ci, method, funcProto, objectIsConst, offset, mode);
6743 if (!declid)
return kFALSE;
6745 const clang::Decl *scope;
6747 else scope =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
6749 const clang::Decl *decl =
reinterpret_cast<const clang::Decl*
>(declid);
6750 const clang::DeclContext *ctxt = clang::Decl::castToDeclContext(scope);
6751 if (!decl || !ctxt)
return kFALSE;
6752 if (decl->getDeclContext()->Equals(ctxt))
6754 else if (decl->getDeclContext()->isTransparentContext() &&
6755 decl->getDeclContext()->getParent()->Equals(ctxt))
6827 return TClinginfo->
GetMethodNArg(method, proto, objectIsConst, mode);
6852 TClinginfo->
Init(name);
6861 TClinginfo->
Init(tagnum);
6869 return TClinginfo->
IsBase(name);
6900 return TClinginfo->
IsValidMethod(method, proto,
false, offset, mode);
6908 return TClinginfo->
IsValidMethod(method, proto, objectIsConst, offset, mode);
6916 return TClinginfo->
Next();
6964 return TClinginfo->
Size();
6972 return TClinginfo->
Tagnum();
6988 TTHREAD_TLS_DECL(std::string,
output);
6998 return TClinginfo->
Name();
7006 return TClinginfo->
Title();
7043 ClassInfo_t* base)
const
7056 return TClinginfo->
Next();
7064 return TClinginfo->
Next(onlyDirect);
7072 return TClinginfo->
Offset(address, isDerivedObject);
7085 return TClinginfo->
GetBaseOffset(TClinginfoBase, address, isDerivedObject);
7101 return (ClassInfo_t *)TClinginfo->
GetBase();
7109 return TClinginfo->
Tagnum();
7117 TTHREAD_TLS_DECL(std::string,
output);
7127 return TClinginfo->
Name();
7172 const clang::Decl* decl =
reinterpret_cast<const clang::Decl*
>(declid);
7173 const clang::ValueDecl* vd = llvm::dyn_cast_or_null<clang::ValueDecl>(decl);
7206 return TClinginfo->
Next();
7214 return TClinginfo->
Offset();
7262 return TClinginfo->
Name();
7270 return TClinginfo->
Title();
7277 TTHREAD_TLS_DECL(std::string,
result);
7288 Decl* decl =
static_cast<Decl*
>(
const_cast<void*
>(declId));
7289 ASTContext &
C = decl->getASTContext();
7290 SourceRange commentRange;
7291 decl->addAttr(
new (C) AnnotateAttr( commentRange, C, attribute, 0 ) );
7302 cling::Interpreter &interp,
7305 const clang::TypeDecl* td = llvm::dyn_cast<clang::TypeDecl>(decl->getDeclContext());
7308 clang::QualType qualType(td->getTypeForDecl(),0);
7310 unsigned int level = 0;
7311 for(
size_t cursor = name.length()-1; cursor != 0; --cursor) {
7312 if (name[cursor] ==
'>') ++level;
7313 else if (name[cursor] ==
'<' && level) --level;
7314 else if (level == 0 && name[cursor] ==
':') {
7315 name.erase(0,cursor+1);
7326 if (llvm::isa<clang::CXXConstructorDecl>(decl))
7330 }
else if (llvm::isa<clang::CXXDestructorDecl>(decl))
7333 output.insert(output.begin(),
'~');
7335 llvm::raw_string_ostream stream(output);
7336 decl->getNameForDiagnostic(stream, decl->getASTContext().getPrintingPolicy(),
false);
7366 return (FuncTempInfo_t*)
const_cast<void*
>(declid);
7377 return (FuncTempInfo_t*)ft_info;
7397 if (!ft_info)
return 0;
7398 const clang::FunctionTemplateDecl *ft = (
const clang::FunctionTemplateDecl*)ft_info;
7399 return ft->getTemplateParameters()->size();
7408 if (!ft_info)
return 0;
7409 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
7410 return ft->getTemplateParameters()->getMinRequiredArguments();
7418 if (!ft_info)
return 0;
7423 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
7425 switch (ft->getAccess()) {
7426 case clang::AS_public:
7429 case clang::AS_protected:
7432 case clang::AS_private:
7435 case clang::AS_none:
7436 if (ft->getDeclContext()->isNamespace())
7444 const clang::FunctionDecl *fd = ft->getTemplatedDecl();
7445 if (
const clang::CXXMethodDecl *md =
7446 llvm::dyn_cast<clang::CXXMethodDecl>(fd)) {
7447 if (md->getTypeQualifiers() & clang::Qualifiers::Const) {
7450 if (md->isVirtual()) {
7456 if (
const clang::CXXConstructorDecl *
cd =
7457 llvm::dyn_cast<clang::CXXConstructorDecl>(md)) {
7458 if (
cd->isExplicit()) {
7462 else if (
const clang::CXXConversionDecl *
cd =
7463 llvm::dyn_cast<clang::CXXConversionDecl>(md)) {
7464 if (
cd->isExplicit()) {
7478 if (!ft_info)
return;
7479 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
7491 if (!ft_info)
return;
7492 const clang::FunctionTemplateDecl *ft = (
const clang::FunctionTemplateDecl*)ft_info;
7496 if (
const RedeclarableTemplateDecl *AnnotFD
7498 if (AnnotateAttr *
A = AnnotFD->getAttr<AnnotateAttr>()) {
7499 output =
A->getAnnotation().str();
7503 if (!ft->isFromASTFile()) {
7553 const clang::Decl* decl =
reinterpret_cast<const clang::Decl*
>(declid);
7555 const clang::FunctionDecl* fd = llvm::dyn_cast_or_null<clang::FunctionDecl>(decl);
7587 return info->
NArg();
7603 return info->
Next();
7627 return (TypeInfo_t*)info->
Type();
7635 TTHREAD_TLS_DECL(
TString, mangled_name);
7637 return mangled_name;
7680 return info->
Title();
7699 if (info && info->
IsValid()) {
7701 clang::QualType QT( typeinfo->
GetQualType().getCanonicalType() );
7702 if (QT->isEnumeralType()) {
7704 }
else if (QT->isPointerType()) {
7706 QT = llvm::cast<clang::PointerType>(QT)->getPointeeType();
7707 if ( QT->isCharType() ) {
7712 }
else if ( QT->isFloatingType() ) {
7713 int sz = typeinfo->
Size();
7714 if (sz == 4 || sz == 8) {
7720 }
else if ( QT->isIntegerType() ) {
7721 int sz = typeinfo->
Size();
7774 return (MethodArgInfo_t*)
7791 return info->
Next();
7815 return info->
Name();
7875 TClinginfo->
Init(name);
7891 return TClinginfo->
Name();
7915 return TClinginfo->
Size();
7965 const char*
name)
const
7969 TClinginfo->
Init(name);
7985 return TClinginfo->
Next();
8001 return TClinginfo->
Size();
8017 return TClinginfo->
Name();
8025 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...
TClass *(* DictFuncPtr_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<inf Assumes 1 and only 1 template present and 1...
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<list<classA,allocator>,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
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)
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)
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 int HandleInterpreterException(cling::MetaProcessor *metaProcessor, const char *input_line, cling::Interpreter::CompilationResult &compRes, cling::Value *result)
Let cling process a command line.
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.
int(* AutoLoadCallBack_t)(const char *)
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
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.
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)
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.
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<name> (...
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
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
TPaveLabel title(3, 27.1, 15, 28.7,"ROOT Environment and Tools")
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
TEllipse dict(9, 20, 3, 1.5)
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...
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)
Global functions class (global functions are obtained from CINT).
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
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)
const char * cd(char *path=0)
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.