70 #include "RConfigure.h" 
   71 #include "RConfigOptions.h" 
   73 #include "RGitCommit.h" 
   82 #define RTLD_DEFAULT ((void *)::GetModuleHandle(NULL)) 
   84 #define dlopen(library_name, flags) ::LoadLibrary(library_name) 
   85 #define dlclose(library) ::FreeLibrary((HMODULE)library) 
   87    static char Msg[1000];
 
   88    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(),
 
   89                  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), Msg,
 
   93 FARPROC dlsym(
void *library, 
const char *function_name)
 
   97    FARPROC address = NULL;
 
   99    if (library == RTLD_DEFAULT) {
 
  100       if (EnumProcessModules(::GetCurrentProcess(), hMods, 
sizeof(hMods), &cbNeeded)) {
 
  101          for (i = 0; i < (cbNeeded / 
sizeof(HMODULE)); i++) {
 
  102             address = ::GetProcAddress((HMODULE)hMods[i], function_name);
 
  109       return ::GetProcAddress((HMODULE)library, function_name);
 
  160 namespace std {} 
using namespace std;
 
  163 #if defined(R__HAS_COCOA) 
  169 #elif defined(R__WIN32) 
  173 extern "C" void R__SetZipMode(
int);
 
  175 static DestroyInterpreter_t *gDestroyInterpreter = 0;
 
  176 static void *gInterpreterLib = 0;
 
  179 TVirtualMutex* gROOTMutex = 0;
 
  180 ROOT::TVirtualRWMutex *ROOT::gCoreMutex = 
nullptr;
 
  183 void **(*gThreadTsd)(
void*,Int_t) = 0;
 
  189 static Int_t IVERSQ()
 
  191    Int_t maj, min, cycle;
 
  192    sscanf(ROOT_RELEASE, 
"%d.%d/%d", &maj, &min, &cycle);
 
  193    return 10000*maj + 100*min + cycle;
 
  199 static Int_t IDATQQ(
const char *date)
 
  201    static const char *months[] = {
"Jan",
"Feb",
"Mar",
"Apr",
"May",
 
  202                                   "Jun",
"Jul",
"Aug",
"Sep",
"Oct",
 
  207    sscanf(date, 
"%s %d %d", sm, &dd, &yy);
 
  208    for (
int i = 0; i < 12; i++)
 
  209       if (!strncmp(sm, months[i], 3)) {
 
  213    return 10000*yy + 100*mm + dd;
 
  220 static Int_t ITIMQQ(
const char *time)
 
  223    sscanf(time, 
"%d:%d:%d", &hh, &mm, &ss);
 
  230 static void CleanUpROOTAtExit()
 
  233       R__LOCKGUARD(gROOTMutex);
 
  235       if (gROOT->GetListOfFiles())
 
  236          gROOT->GetListOfFiles()->Delete(
"slow");
 
  237       if (gROOT->GetListOfSockets())
 
  238          gROOT->GetListOfSockets()->Delete();
 
  239       if (gROOT->GetListOfMappedFiles())
 
  240          gROOT->GetListOfMappedFiles()->Delete(
"slow");
 
  241       if (gROOT->GetListOfClosedObjects())
 
  242          gROOT->GetListOfClosedObjects()->Delete(
"slow");
 
  253    struct ModuleHeaderInfo_t {
 
  254       ModuleHeaderInfo_t(
const char* moduleName,
 
  255                          const char** headers,
 
  256                          const char** includePaths,
 
  257                          const char* payloadCode,
 
  258                          const char* fwdDeclCode,
 
  259                          void (*triggerFunc)(),
 
  260                          const TROOT::FwdDeclArgsToKeepCollection_t& fwdDeclsArgToSkip,
 
  261                          const char **classesHeaders,
 
  263                            fModuleName(moduleName),
 
  265                            fPayloadCode(payloadCode),
 
  266                            fFwdDeclCode(fwdDeclCode),
 
  267                            fIncludePaths(includePaths),
 
  268                            fTriggerFunc(triggerFunc),
 
  269                            fClassesHeaders(classesHeaders),
 
  270                            fFwdNargsToKeepColl(fwdDeclsArgToSkip),
 
  271                            fHasCxxModule(hasCxxModule) {}
 
  273       const char* fModuleName; 
 
  274       const char** fHeaders; 
 
  275       const char* fPayloadCode; 
 
  276       const char* fFwdDeclCode; 
 
  277       const char** fIncludePaths; 
 
  278       void (*fTriggerFunc)(); 
 
  279       const char** fClassesHeaders; 
 
  280       const TROOT::FwdDeclArgsToKeepCollection_t fFwdNargsToKeepColl; 
 
  285    std::vector<ModuleHeaderInfo_t>& GetModuleHeaderInfoBuffer() {
 
  286       static std::vector<ModuleHeaderInfo_t> moduleHeaderInfoBuffer;
 
  287       return moduleHeaderInfoBuffer;
 
  291 Int_t  TROOT::fgDirLevel = 0;
 
  292 Bool_t TROOT::fgRootInit = kFALSE;
 
  293 Bool_t TROOT::fgMemCheck = kFALSE;
 
  295 static void at_exit_of_TROOT() {
 
  296    if (ROOT::Internal::gROOTLocal)
 
  297       ROOT::Internal::gROOTLocal->~TROOT();
 
  303    class TROOTAllocator {
 
  335       char fHolder[
sizeof(TROOT)];
 
  338          new(&(fHolder[0])) TROOT(
"root", 
"The ROOT of EVERYTHING");
 
  343             gROOTLocal->~TROOT();
 
  375    extern TROOT *gROOTLocal;
 
  380       static TROOTAllocator alloc;
 
  385       static Bool_t initInterpreter = kFALSE;
 
  386       if (!initInterpreter) {
 
  387          initInterpreter = kTRUE;
 
  388          gROOTLocal->InitInterpreter();
 
  390          gROOTLocal->InitThreads();
 
  394    typedef TROOT *(*GetROOTFun_t)();
 
  396    static GetROOTFun_t gGetROOT = &GetROOT1;
 
  398    static Func_t GetSymInLibImt(
const char *funcname)
 
  400       const static bool loadSuccess = dlsym(RTLD_DEFAULT, 
"usedToIdentifyRootClingByDlSym")? 
false : 0 <= gSystem->Load(
"libImt");
 
  402          if (
auto sym = gSystem->DynFindSymbol(
nullptr, funcname)) {
 
  405             Error(
"GetSymInLibImt", 
"Cannot get symbol %s.", funcname);
 
  417    void EnableParBranchProcessing()
 
  420       if (!IsImplicitMTEnabled())
 
  422       static void (*sym)() = (
void(*)())Internal::GetSymInLibImt(
"ROOT_TImplicitMT_EnableParBranchProcessing");
 
  426       ::Warning(
"EnableParBranchProcessing", 
"Cannot enable parallel branch processing, please build ROOT with -Dimt=ON");
 
  433    void DisableParBranchProcessing()
 
  436       static void (*sym)() = (
void(*)())Internal::GetSymInLibImt(
"ROOT_TImplicitMT_DisableParBranchProcessing");
 
  440       ::Warning(
"DisableParBranchProcessing", 
"Cannot disable parallel branch processing, please build ROOT with -Dimt=ON");
 
  446    Bool_t IsParBranchProcessingEnabled()
 
  449       static Bool_t (*sym)() = (Bool_t(*)())Internal::GetSymInLibImt(
"ROOT_TImplicitMT_IsParBranchProcessingEnabled");
 
  466    void EnableParTreeProcessing()
 
  469       if (!IsImplicitMTEnabled())
 
  471       static void (*sym)() = (
void(*)())Internal::GetSymInLibImt(
"ROOT_TImplicitMT_EnableParTreeProcessing");
 
  475       ::Warning(
"EnableParTreeProcessing", 
"Cannot enable parallel tree processing, please build ROOT with -Dimt=ON");
 
  482    void DisableParTreeProcessing()
 
  485       static void (*sym)() = (
void(*)())Internal::GetSymInLibImt(
"ROOT_TImplicitMT_DisableParTreeProcessing");
 
  489       ::Warning(
"DisableParTreeProcessing", 
"Cannot disable parallel tree processing, please build ROOT with -Dimt=ON");
 
  495    Bool_t IsParTreeProcessingEnabled()
 
  498       static Bool_t (*sym)() = (Bool_t(*)())Internal::GetSymInLibImt(
"ROOT_TImplicitMT_IsParTreeProcessingEnabled");
 
  511    static Bool_t &IsImplicitMTEnabledImpl()
 
  513       static Bool_t isImplicitMTEnabled = kFALSE;
 
  514       return isImplicitMTEnabled;
 
  521       return (*Internal::gGetROOT)();
 
  524    TString &GetMacroPath() {
 
  525       static TString macroPath;
 
  549    void EnableThreadSafety()
 
  551       static void (*sym)() = (
void(*)())Internal::GetSymInLibImt(
"ROOT_TThread_Initialize");
 
  580    void EnableImplicitMT(UInt_t numthreads)
 
  583       if (ROOT::Internal::IsImplicitMTEnabledImpl())
 
  585       EnableThreadSafety();
 
  586       static void (*sym)(UInt_t) = (
void(*)(UInt_t))Internal::GetSymInLibImt(
"ROOT_TImplicitMT_EnableImplicitMT");
 
  589       ROOT::Internal::IsImplicitMTEnabledImpl() = 
true;
 
  591       ::Warning(
"EnableImplicitMT", 
"Cannot enable implicit multi-threading with %d threads, please build ROOT with -Dimt=ON", numthreads);
 
  597    void DisableImplicitMT()
 
  600       static void (*sym)() = (
void(*)())Internal::GetSymInLibImt(
"ROOT_TImplicitMT_DisableImplicitMT");
 
  603       ROOT::Internal::IsImplicitMTEnabledImpl() = kFALSE;
 
  605       ::Warning(
"DisableImplicitMT", 
"Cannot disable implicit multi-threading, please build ROOT with -Dimt=ON");
 
  611    Bool_t IsImplicitMTEnabled()
 
  613       return ROOT::Internal::IsImplicitMTEnabledImpl();
 
  618    UInt_t GetImplicitMTPoolSize()
 
  621       static UInt_t (*sym)() = (UInt_t(*)())Internal::GetSymInLibImt(
"ROOT_TImplicitMT_GetImplicitMTPoolSize");
 
  633 TROOT *ROOT::Internal::gROOTLocal = ROOT::GetROOT();
 
  647 TROOT::TROOT() : TDirectory(),
 
  648      fLineIsProcessing(0), fVersion(0), fVersionInt(0), fVersionCode(0),
 
  649      fVersionDate(0), fVersionTime(0), fBuiltDate(0), fBuiltTime(0),
 
  650      fTimer(0), fApplication(0), fInterpreter(0), fBatch(kTRUE),
 
  651      fIsWebDisplay(kFALSE), fIsWebDisplayBatch(kFALSE), fEditHistograms(kTRUE),
 
  652      fFromPopUp(kTRUE),fMustClean(kTRUE),fReadingObject(kFALSE),fForceStyle(kFALSE),
 
  653      fInterrupt(kFALSE),fEscape(kFALSE),fExecutingMacro(kFALSE),fEditorMode(0),
 
  654      fPrimitive(0),fSelectPad(0),fClasses(0),fTypes(0),fGlobals(0),fGlobalFunctions(0),
 
  655      fClosedObjects(0),fFiles(0),fMappedFiles(0),fSockets(0),fCanvases(0),fStyles(0),fFunctions(0),
 
  656      fTasks(0),fColors(0),fGeometries(0),fBrowsers(0),fSpecials(0),fCleanups(0),
 
  657      fMessageHandlers(0),fStreamerInfo(0),fClassGenerators(0),fSecContexts(0),
 
  658      fProofs(0),fClipboard(0),fDataSets(0),fUUIDs(0),fRootFolder(0),fBrowsables(0),
 
  681 TROOT::TROOT(
const char *name, 
const char *title, VoidFuncPtr_t *initfunc)
 
  682    : TDirectory(), fLineIsProcessing(0), fVersion(0), fVersionInt(0), fVersionCode(0),
 
  683      fVersionDate(0), fVersionTime(0), fBuiltDate(0), fBuiltTime(0),
 
  684      fTimer(0), fApplication(0), fInterpreter(0), fBatch(kTRUE),
 
  685      fIsWebDisplay(kFALSE), fIsWebDisplayBatch(kFALSE), fEditHistograms(kTRUE),
 
  686      fFromPopUp(kTRUE),fMustClean(kTRUE),fReadingObject(kFALSE),fForceStyle(kFALSE),
 
  687      fInterrupt(kFALSE),fEscape(kFALSE),fExecutingMacro(kFALSE),fEditorMode(0),
 
  688      fPrimitive(0),fSelectPad(0),fClasses(0),fTypes(0),fGlobals(0),fGlobalFunctions(0),
 
  689      fClosedObjects(0),fFiles(0),fMappedFiles(0),fSockets(0),fCanvases(0),fStyles(0),fFunctions(0),
 
  690      fTasks(0),fColors(0),fGeometries(0),fBrowsers(0),fSpecials(0),fCleanups(0),
 
  691      fMessageHandlers(0),fStreamerInfo(0),fClassGenerators(0),fSecContexts(0),
 
  692      fProofs(0),fClipboard(0),fDataSets(0),fUUIDs(0),fRootFolder(0),fBrowsables(0),
 
  695    if (fgRootInit || ROOT::Internal::gROOTLocal) {
 
  700    R__LOCKGUARD(gROOTMutex);
 
  702    ROOT::Internal::gROOTLocal = 
this;
 
  713    gPluginMgr = fPluginManager = 
new TPluginManager;
 
  732    gRootDir = GetRootSys().Data();
 
  734    TDirectory::BuildDirectory(
nullptr, 
nullptr);
 
  741    fConfigOptions   = R__CONFIGUREOPTIONS;
 
  742    fConfigFeatures  = R__CONFIGUREFEATURES;
 
  743    fVersion         = ROOT_RELEASE;
 
  744    fVersionCode     = ROOT_VERSION_CODE;
 
  745    fVersionInt      = IVERSQ();
 
  746    fVersionDate     = IDATQQ(ROOT_RELEASE_DATE);
 
  747    fVersionTime     = ITIMQQ(ROOT_RELEASE_TIME);
 
  748    fBuiltDate       = IDATQQ(__DATE__);
 
  749    fBuiltTime       = ITIMQQ(__TIME__);
 
  753    fClasses         = 
new THashTable(800,3); fClasses->UseRWLock();
 
  755    fStreamerInfo    = 
new TObjArray(100); fStreamerInfo->UseRWLock();
 
  756    fClassGenerators = 
new TList;
 
  760    if (!dlsym(RTLD_DEFAULT, 
"usedToIdentifyRootClingByDlSym")) {
 
  762       fPluginManager->LoadHandlersFromEnv(gEnv);
 
  765    TSystemDirectory *workdir = 
new TSystemDirectory(
"workdir", gSystem->WorkingDirectory());
 
  767    auto setNameLocked = [](TSeqCollection *l, 
const char *collection_name) {
 
  768       l->SetName(collection_name);
 
  775    fColors      = setNameLocked(
new TObjArray(1000), 
"ListOfColors");
 
  778    fGlobalFunctions = 0;
 
  781    fList        = 
new THashList(1000,3); fList->UseRWLock();
 
  782    fClosedObjects = setNameLocked(
new TList, 
"ClosedFiles");
 
  783    fFiles       = setNameLocked(
new TList, 
"Files");
 
  784    fMappedFiles = setNameLocked(
new TList, 
"MappedFiles");
 
  785    fSockets     = setNameLocked(
new TList, 
"Sockets");
 
  786    fCanvases    = setNameLocked(
new TList, 
"Canvases");
 
  787    fStyles      = setNameLocked(
new TList, 
"Styles");
 
  788    fFunctions   = setNameLocked(
new TList, 
"Functions");
 
  789    fTasks       = setNameLocked(
new TList, 
"Tasks");
 
  790    fGeometries  = setNameLocked(
new TList, 
"Geometries");
 
  791    fBrowsers    = setNameLocked(
new TList, 
"Browsers");
 
  792    fSpecials    = setNameLocked(
new TList, 
"Specials");
 
  793    fBrowsables  = (TList*)setNameLocked(
new TList, 
"Browsables");
 
  794    fCleanups    = setNameLocked(
new THashList, 
"Cleanups");
 
  795    fMessageHandlers = setNameLocked(
new TList, 
"MessageHandlers");
 
  796    fSecContexts = setNameLocked(
new TList, 
"SecContexts");
 
  797    fProofs      = setNameLocked(
new TList, 
"Proofs");
 
  798    fClipboard   = setNameLocked(
new TList, 
"Clipboard");
 
  799    fDataSets    = setNameLocked(
new TList, 
"DataSets");
 
  800    fTypes       = 
new TListOfTypes; fTypes->UseRWLock();
 
  802    TProcessID::AddProcessID();
 
  803    fUUIDs = 
new TProcessUUID();
 
  805    fRootFolder = 
new TFolder();
 
  806    fRootFolder->SetName(
"root");
 
  807    fRootFolder->SetTitle(
"root of all folders");
 
  808    fRootFolder->AddFolder(
"Classes",   
"List of Active Classes",fClasses);
 
  809    fRootFolder->AddFolder(
"Colors",    
"List of Active Colors",fColors);
 
  810    fRootFolder->AddFolder(
"MapFiles",  
"List of MapFiles",fMappedFiles);
 
  811    fRootFolder->AddFolder(
"Sockets",   
"List of Socket Connections",fSockets);
 
  812    fRootFolder->AddFolder(
"Canvases",  
"List of Canvases",fCanvases);
 
  813    fRootFolder->AddFolder(
"Styles",    
"List of Styles",fStyles);
 
  814    fRootFolder->AddFolder(
"Functions", 
"List of Functions",fFunctions);
 
  815    fRootFolder->AddFolder(
"Tasks",     
"List of Tasks",fTasks);
 
  816    fRootFolder->AddFolder(
"Geometries",
"List of Geometries",fGeometries);
 
  817    fRootFolder->AddFolder(
"Browsers",  
"List of Browsers",fBrowsers);
 
  818    fRootFolder->AddFolder(
"Specials",  
"List of Special Objects",fSpecials);
 
  819    fRootFolder->AddFolder(
"Handlers",  
"List of Message Handlers",fMessageHandlers);
 
  820    fRootFolder->AddFolder(
"Cleanups",  
"List of RecursiveRemove Collections",fCleanups);
 
  821    fRootFolder->AddFolder(
"StreamerInfo",
"List of Active StreamerInfo Classes",fStreamerInfo);
 
  822    fRootFolder->AddFolder(
"SecContexts",
"List of Security Contexts",fSecContexts);
 
  823    fRootFolder->AddFolder(
"PROOF Sessions", 
"List of PROOF sessions",fProofs);
 
  824    fRootFolder->AddFolder(
"ROOT Memory",
"List of Objects in the gROOT Directory",fList);
 
  825    fRootFolder->AddFolder(
"ROOT Files",
"List of Connected ROOT Files",fFiles);
 
  828    fCleanups->Add(fCanvases); fCanvases->SetBit(kMustCleanup);
 
  829    fCleanups->Add(fBrowsers); fBrowsers->SetBit(kMustCleanup);
 
  830    fCleanups->Add(fTasks);    fTasks->SetBit(kMustCleanup);
 
  831    fCleanups->Add(fFiles);    fFiles->SetBit(kMustCleanup);
 
  832    fCleanups->Add(fClosedObjects); fClosedObjects->SetBit(kMustCleanup);
 
  834    fCleanups->Add(fList);
 
  836    fExecutingMacro= kFALSE;
 
  837    fForceStyle    = kFALSE;
 
  839    fReadingObject = kFALSE;
 
  846    fDefCanvasName = 
"c1";
 
  847    fEditHistograms= kFALSE;
 
  848    fLineIsProcessing = 1;   
 
  855    fCutClassName = 
"TCutG";
 
  858    new TMessageHandler((TClass*)0);
 
  862    TStyle::BuildStyles();
 
  863    SetStyle(gEnv->GetValue(
"Canvas.Style", 
"Modern"));
 
  866    gBatchGuiFactory = 
new TGuiFactory;
 
  867    gGuiFactory      = gBatchGuiFactory;
 
  868    gGXBatch         = 
new TVirtualX(
"Batch", 
"ROOT Interface to batch graphics");
 
  869    gVirtualX        = gGXBatch;
 
  871 #if defined(R__WIN32) 
  873 #elif defined(R__HAS_COCOA) 
  876    if (gSystem->Getenv(
"DISPLAY"))
 
  883    while (initfunc && initfunc[i]) {
 
  890    fBrowsables->Add(fRootFolder, 
"root");
 
  891    fBrowsables->Add(fProofs, 
"PROOF Sessions");
 
  892    fBrowsables->Add(workdir, gSystem->WorkingDirectory());
 
  893    fBrowsables->Add(fFiles, 
"ROOT Files");
 
  895    atexit(CleanUpROOTAtExit);
 
  897    ROOT::Internal::gGetROOT = &ROOT::Internal::GetROOT2;
 
  906    using namespace ROOT::Internal;
 
  908    if (gROOTLocal == 
this) {
 
  911       gGetROOT = &GetROOT1;
 
  915       SetBit(TObject::kInvalidObject);
 
  923       if (!fVersionInt) 
return;
 
  927       SafeDelete(fBrowsables);
 
  932 #ifdef R__COMPLETE_MEM_TERMINATION 
  933       fSpecials->Delete();   SafeDelete(fSpecials);    
 
  936       fClosedObjects->Delete(
"slow"); 
 
  937       fFiles->Delete(
"slow");       
 
  939       fSecContexts->Delete(
"slow"); SafeDelete(fSecContexts); 
 
  940       fSockets->Delete();           SafeDelete(fSockets);     
 
  941       fMappedFiles->Delete(
"slow");                     
 
  942       TSeqCollection *tl = fMappedFiles; fMappedFiles = 0; 
delete tl;
 
  944       SafeDelete(fClosedObjects);
 
  947       TProcessID::Cleanup();                            
 
  949       fFunctions->Delete();  SafeDelete(fFunctions);   
 
  950       fGeometries->Delete(); SafeDelete(fGeometries);
 
  951       fBrowsers->Delete();   SafeDelete(fBrowsers);
 
  952       SafeDelete(fCanvases);
 
  953       fColors->Delete();     SafeDelete(fColors);
 
  954       fStyles->Delete();     SafeDelete(fStyles);
 
  956 #ifdef R__COMPLETE_MEM_TERMINATION 
  957       if (gGuiFactory != gBatchGuiFactory) SafeDelete(gGuiFactory);
 
  958       SafeDelete(gBatchGuiFactory);
 
  959       if (gGXBatch != gVirtualX) SafeDelete(gGXBatch);
 
  960       SafeDelete(gVirtualX);
 
  964       TQObject::BlockAllSignals(kTRUE);
 
  966       fMessageHandlers->Delete(); SafeDelete(fMessageHandlers);
 
  968 #ifdef R__COMPLETE_MEM_TERMINATION 
  969       SafeDelete(fCanvases);
 
  972       SafeDelete(fDataSets);
 
  973       SafeDelete(fClipboard);
 
  976       delete fPluginManager; gPluginMgr = fPluginManager = 0;
 
  977       delete gClassTable;  gClassTable = 0;
 
  978       delete gEnv; gEnv = 0;
 
  980       if (fTypes) fTypes->Delete();
 
  982       if (fGlobals) fGlobals->Delete();
 
  983       SafeDelete(fGlobals);
 
  984       if (fGlobalFunctions) fGlobalFunctions->Delete();
 
  985       SafeDelete(fGlobalFunctions);
 
  986       fEnums.load()->Delete();
 
  993       gSystem->CleanCompiledMacros();
 
 1000 #ifdef R__COMPLETE_MEM_TERMINATION 
 1022       SafeDelete(fCleanups);
 
 1027       delete fInterpreter;
 
 1031       TStorage::PrintStatistics();
 
 1034       fgRootInit = kFALSE;
 
 1042 void TROOT::AddClass(TClass *cl)
 
 1044    TClass::AddClass(cl);
 
 1052 void TROOT::AddClassGenerator(TClassGenerator *generator)
 
 1054    if (!generator) 
return;
 
 1055    fClassGenerators->Add(generator);
 
 1064 void TROOT::Append(TObject *obj, Bool_t replace )
 
 1066    R__LOCKGUARD(gROOTMutex);
 
 1067    TDirectory::Append(obj,replace);
 
 1073 void TROOT::Browse(TBrowser *b)
 
 1076    TIter next(fBrowsables);
 
 1078    while ((obj = (TObject *) next())) {
 
 1079       const char *opt = next.GetOption();
 
 1080       if (opt && strlen(opt))
 
 1083          b->Add(obj, obj->GetName());
 
 1092 Bool_t TROOT::ClassSaved(TClass *cl)
 
 1094    if (cl == 0) 
return kFALSE;
 
 1095    if (cl->TestBit(TClass::kClassSaved)) 
return kTRUE;
 
 1096    cl->SetBit(TClass::kClassSaved);
 
 1101    static void R__ListSlowClose(TList *files)
 
 1106       static TObject harmless;
 
 1107       TObjLink *cursor = files->FirstLink();
 
 1109          TDirectory *dir = 
static_cast<TDirectory*
>( cursor->GetObject() );
 
 1119             cursor->SetObject(&harmless); 
 
 1121             dir->Close(
"nodelete");
 
 1123             cursor->SetObject(dir);
 
 1125          cursor = cursor->Next();
 
 1131       files->Clear(
"nodelete");
 
 1134    static void R__ListSlowDeleteContent(TList *files)
 
 1138       static TObject harmless;
 
 1139       TObjLink *cursor = files->FirstLink();
 
 1141          TDirectory *dir = 
dynamic_cast<TDirectory*
>( cursor->GetObject() );
 
 1151             cursor->SetObject(&harmless); 
 
 1153             dir->GetList()->Delete(
"slow");
 
 1155             cursor->SetObject(dir);
 
 1157          cursor = cursor->Next();
 
 1166 void TROOT::CloseFiles()
 
 1168    if (fFiles && fFiles->First()) {
 
 1169       R__ListSlowClose(static_cast<TList*>(fFiles));
 
 1174    if (fSockets && fSockets->First()) {
 
 1175       if (0==fCleanups->FindObject(fSockets) ) {
 
 1176          fCleanups->Add(fSockets);
 
 1177          fSockets->SetBit(kMustCleanup);
 
 1179       CallFunc_t *socketCloser = gInterpreter->CallFunc_Factory();
 
 1181       TClass *socketClass = TClass::GetClass(
"TSocket");
 
 1182       gInterpreter->CallFunc_SetFuncProto(socketCloser, socketClass->GetClassInfo(), 
"Close", 
"", &offset);
 
 1183       if (gInterpreter->CallFunc_IsValid(socketCloser)) {
 
 1184          static TObject harmless;
 
 1185          TObjLink *cursor = 
static_cast<TList*
>(fSockets)->FirstLink();
 
 1188             TObject *socket = cursor->GetObject();
 
 1197             cursor->SetObject(&harmless); 
 
 1199             if (socket->IsA()->InheritsFrom(socketClass)) {
 
 1200                gInterpreter->CallFunc_Exec(socketCloser, ((
char*)socket)+offset);
 
 1202                socket->SetBit(kMustCleanup);
 
 1203                fClosedObjects->AddLast(socket);
 
 1206                Long_t other_offset;
 
 1207                CallFunc_t *otherCloser = gInterpreter->CallFunc_Factory();
 
 1208                gInterpreter->CallFunc_SetFuncProto(otherCloser, socket->IsA()->GetClassInfo(), 
"Close", 
"", &other_offset);
 
 1209                if (gInterpreter->CallFunc_IsValid(otherCloser)) {
 
 1210                   gInterpreter->CallFunc_Exec(otherCloser, ((
char*)socket)+other_offset);
 
 1212                   socket->SetBit(kMustCleanup);
 
 1213                   fClosedObjects->AddLast(socket);
 
 1215                   notclosed.AddLast(socket);
 
 1217                gInterpreter->CallFunc_Delete(otherCloser);
 
 1219                cursor->SetObject(socket);
 
 1221             cursor = cursor->Next();
 
 1226          cursor = notclosed.FirstLink();
 
 1228             static_cast<TList*
>(fSockets)->AddLast(cursor->GetObject());
 
 1229             cursor = cursor->Next();
 
 1232       gInterpreter->CallFunc_Delete(socketCloser);
 
 1234    if (fMappedFiles && fMappedFiles->First()) {
 
 1235       R__ListSlowClose(static_cast<TList*>(fMappedFiles));
 
 1244 void TROOT::EndOfProcessCleanups()
 
 1251       gInterpreter->ResetGlobals();
 
 1256    if (fClosedObjects && fClosedObjects->First()) {
 
 1257       R__ListSlowDeleteContent(static_cast<TList*>(fClosedObjects));
 
 1262    fFunctions->Delete();
 
 1263    fGeometries->Delete();
 
 1264    fBrowsers->Delete();
 
 1265    fCanvases->Delete(
"slow");
 
 1269    TQObject::BlockAllSignals(kTRUE);
 
 1272       gInterpreter->ShutDown();
 
 1280 TObject *TROOT::FindObject(
const TObject *)
 const 
 1282    Error(
"FindObject",
"Not yet implemented");
 
 1306 TObject *TROOT::FindObject(
const char *name)
 const 
 1308    if (name && strstr(name,
"/")) 
return FindObjectAny(name);
 
 1312    temp   = fFiles->FindObject(name);       
if (temp) 
return temp;
 
 1313    temp   = fMappedFiles->FindObject(name); 
if (temp) 
return temp;
 
 1315       R__LOCKGUARD(gROOTMutex);
 
 1316       temp   = fFunctions->FindObject(name);
if (temp) 
return temp;
 
 1318    temp   = fGeometries->FindObject(name);  
if (temp) 
return temp;
 
 1319    temp   = fCanvases->FindObject(name);    
if (temp) 
return temp;
 
 1320    temp   = fStyles->FindObject(name);      
if (temp) 
return temp;
 
 1322       R__LOCKGUARD(gROOTMutex);
 
 1323       temp = fSpecials->FindObject(name);   
if (temp) 
return temp;
 
 1325    TIter next(fGeometries);
 
 1327    while ((obj=next())) {
 
 1328       temp = obj->FindObject(name);         
if (temp) 
return temp;
 
 1330    if (gDirectory) temp = gDirectory->Get(name);
 
 1331    if (temp) 
return temp;
 
 1333       TVirtualPad *canvas = gPad->GetVirtCanvas();
 
 1334       if (fCanvases->FindObject(canvas)) {  
 
 1335          temp = canvas->FindObject(name);
 
 1336          if (!temp && canvas != gPad) temp  = gPad->FindObject(name);
 
 1360 TObject *TROOT::FindSpecialObject(
const char *name, 
void *&where)
 
 1366       temp  = fFiles->FindObject(name);
 
 1370       temp  = fMappedFiles->FindObject(name);
 
 1371       where = fMappedFiles;
 
 1374       R__LOCKGUARD(gROOTMutex);
 
 1375       temp  = fFunctions->FindObject(name);
 
 1379       temp  = fCanvases->FindObject(name);
 
 1383       temp  = fStyles->FindObject(name);
 
 1387       temp  = fSpecials->FindObject(name);
 
 1391       TObject *glast = fGeometries->Last();
 
 1392       if (glast) {where = glast; temp = glast->FindObject(name);}
 
 1394    if (!temp && gDirectory) {
 
 1395       temp  = gDirectory->Get(name);
 
 1398    if (!temp && gPad) {
 
 1399       TVirtualPad *canvas = gPad->GetVirtCanvas();
 
 1400       if (fCanvases->FindObject(canvas)) {  
 
 1401          temp  = canvas->FindObject(name);
 
 1403          if (!temp && canvas != gPad) {
 
 1404             temp  = gPad->FindObject(name);
 
 1409    if (!temp) 
return 0;
 
 1410    if (temp->TestBit(kNotDeleted)) 
return temp;
 
 1419 TObject *TROOT::FindObjectAny(
const char *name)
 const 
 1421    TObject *obj = fRootFolder->FindObjectAny(name);
 
 1422    if (obj) 
return obj;
 
 1423    return gDirectory->FindObjectAnyFile(name);
 
 1429 TObject *TROOT::FindObjectAnyFile(
const char *name)
 const 
 1431    R__LOCKGUARD(gROOTMutex);
 
 1433    TIter next(GetListOfFiles());
 
 1434    while ((d = (TDirectory*)next())) {
 
 1437       TObject *obj = d->TDirectory::FindObject(name);
 
 1438       if (obj) 
return obj;
 
 1446 const char *TROOT::FindObjectClassName(
const char *name)
 const 
 1449    TObject *obj = FindObject(name);
 
 1450    if (obj) 
return obj->ClassName();
 
 1453    TGlobal *g = GetGlobal(name);
 
 1454    if (g) 
return g->GetTypeName();
 
 1466 const char *TROOT::FindObjectPathName(
const TObject *)
 const 
 1468    Error(
"FindObjectPathName",
"Not yet implemented");
 
 1477 TClass *TROOT::FindSTLClass(
const char *name, Bool_t load, Bool_t silent)
 const 
 1491    R__LOCKGUARD(gInterpreterMutex);
 
 1494    std::string normalized;
 
 1495    TClassEdit::GetNormalizedName(normalized, name);
 
 1498    if (normalized != name) cl = TClass::GetClass(normalized.c_str(),load,silent);
 
 1500    if (load && cl==0) {
 
 1502       cl = gInterpreter->GenerateTClass(normalized.c_str(), kTRUE, silent);
 
 1511 TClass *TROOT::GetClass(
const char *name, Bool_t load, Bool_t silent)
 const 
 1513    return TClass::GetClass(name,load,silent);
 
 1521 TClass *TROOT::GetClass(
const std::type_info& typeinfo, Bool_t load, Bool_t silent)
 const 
 1523    return TClass::GetClass(typeinfo,load,silent);
 
 1529 TColor *TROOT::GetColor(Int_t color)
 const 
 1531    TColor::InitializeColors();
 
 1532    TObjArray *lcolors = (TObjArray*) GetListOfColors();
 
 1533    if (!lcolors) 
return 0;
 
 1534    if (color < 0 || color >= lcolors->GetSize()) 
return 0;
 
 1535    TColor *col = (TColor*)lcolors->At(color);
 
 1536    if (col && col->GetNumber() == color) 
return col;
 
 1537    TIter   next(lcolors);
 
 1538    while ((col = (TColor *) next()))
 
 1539       if (col->GetNumber() == color) 
return col;
 
 1547 TCanvas *TROOT::MakeDefCanvas()
 const 
 1549    return (TCanvas*)gROOT->ProcessLine(
"TCanvas::MakeDefCanvas();");
 
 1555 TDataType *TROOT::GetType(
const char *name, Bool_t )
 const 
 1557    return (TDataType*)gROOT->GetListOfTypes()->FindObject(name);
 
 1563 TFile *TROOT::GetFile(
const char *name)
 const 
 1565    R__LOCKGUARD(gROOTMutex);
 
 1566    return (TFile*)GetListOfFiles()->FindObject(name);
 
 1572 TStyle *TROOT::GetStyle(
const char *name)
 const 
 1574    return (TStyle*)GetListOfStyles()->FindObject(name);
 
 1580 TObject *TROOT::GetFunction(
const char *name)
 const 
 1582    if (name == 0 || name[0] == 0) {
 
 1587       R__LOCKGUARD(gROOTMutex);
 
 1588       TObject *f1 = fFunctions->FindObject(name);
 
 1592    gROOT->ProcessLine(
"TF1::InitStandardFunctions();");
 
 1594    R__LOCKGUARD(gROOTMutex);
 
 1595    return fFunctions->FindObject(name);
 
 1600 TFunctionTemplate *TROOT::GetFunctionTemplate(
const char *name)
 
 1602    if (!gInterpreter) 
return 0;
 
 1604    if (!fFuncTemplate) fFuncTemplate = 
new TListOfFunctionTemplates(0);
 
 1606    return (TFunctionTemplate*)fFuncTemplate->FindObject(name);
 
 1613 TGlobal *TROOT::GetGlobal(
const char *name, Bool_t load)
 const 
 1615    return (TGlobal *)gROOT->GetListOfGlobals(load)->FindObject(name);
 
 1621 TGlobal *TROOT::GetGlobal(
const TObject *addr, Bool_t )
 const 
 1623    if (addr == 0 || ((Long_t)addr) == -1) 
return 0;
 
 1625    TInterpreter::DeclId_t decl = gInterpreter->GetDataMemberAtAddr(addr);
 
 1627       TListOfDataMembers *globals = ((TListOfDataMembers*)(gROOT->GetListOfGlobals(kFALSE)));
 
 1628       return (TGlobal*)globals->Get(decl);
 
 1633    decl = gInterpreter->GetDataMemberWithValue(addr);
 
 1635       TListOfDataMembers *globals = ((TListOfDataMembers*)(gROOT->GetListOfGlobals(kFALSE)));
 
 1636       return (TGlobal*)globals->Get(decl);
 
 1645 TListOfFunctions *TROOT::GetGlobalFunctions()
 
 1647    if (!fGlobalFunctions) fGlobalFunctions = 
new TListOfFunctions(0);
 
 1648    return fGlobalFunctions;
 
 1654 TCollection *TROOT::GetListOfFunctionOverloads(
const char* name)
 const 
 1656    return ((TListOfFunctions*)fGlobalFunctions)->GetListForObject(name);
 
 1667 TFunction *TROOT::GetGlobalFunction(
const char *
function, 
const char *params,
 
 1671       R__LOCKGUARD(gROOTMutex);
 
 1672       return (TFunction *)GetListOfGlobalFunctions(load)->FindObject(
function);
 
 1675          Fatal(
"GetGlobalFunction", 
"fInterpreter not initialized");
 
 1677       R__LOCKGUARD(gROOTMutex);
 
 1678       TInterpreter::DeclId_t decl = gInterpreter->GetFunctionWithValues(0,
 
 1682       if (!decl) 
return 0;
 
 1684       TFunction *f = GetGlobalFunctions()->Get(decl);
 
 1687       Error(
"GetGlobalFunction",
 
 1688             "\nDid not find matching TFunction <%s> with \"%s\".",
 
 1700 TFunction *TROOT::GetGlobalFunctionWithPrototype(
const char *
function,
 
 1701                                                const char *proto, Bool_t load)
 
 1704       R__LOCKGUARD(gROOTMutex);
 
 1705       return (TFunction *)GetListOfGlobalFunctions(load)->FindObject(
function);
 
 1708          Fatal(
"GetGlobalFunctionWithPrototype", 
"fInterpreter not initialized");
 
 1710       R__LOCKGUARD(gROOTMutex);
 
 1711       TInterpreter::DeclId_t decl = gInterpreter->GetFunctionWithPrototype(0,
 
 1714       if (!decl) 
return 0;
 
 1716       TFunction *f = GetGlobalFunctions()->Get(decl);
 
 1719       Error(
"GetGlobalFunctionWithPrototype",
 
 1720             "\nDid not find matching TFunction <%s> with \"%s\".",
 
 1729 TObject *TROOT::GetGeometry(
const char *name)
 const 
 1731    return GetListOfGeometries()->FindObject(name);
 
 1736 TCollection *TROOT::GetListOfEnums(Bool_t load )
 
 1738    if(!fEnums.load()) {
 
 1739       R__LOCKGUARD(gROOTMutex);
 
 1742       if (!fEnums.load()) fEnums = 
new TListOfEnumsWithLock(0);
 
 1745       R__LOCKGUARD(gROOTMutex);
 
 1748    return fEnums.load();
 
 1753 TCollection *TROOT::GetListOfFunctionTemplates()
 
 1755    R__LOCKGUARD(gROOTMutex);
 
 1756    if(!fFuncTemplate) {
 
 1757       fFuncTemplate = 
new TListOfFunctionTemplates(0);
 
 1759    return fFuncTemplate;
 
 1770 TCollection *TROOT::GetListOfGlobals(Bool_t load)
 
 1773       fGlobals = 
new TListOfDataMembers(0);
 
 1777       TGlobalMappedFunction::MakeFunctor(
"gROOT", 
"TROOT*", ROOT::GetROOT, [] {
 
 1779          return (
void *)&ROOT::Internal::gROOTLocal;
 
 1782       TGlobalMappedFunction::MakeFunctor(
"gPad", 
"TVirtualPad*", TVirtualPad::Pad);
 
 1783       TGlobalMappedFunction::MakeFunctor(
"gVirtualX", 
"TVirtualX*", TVirtualX::Instance);
 
 1784       TGlobalMappedFunction::MakeFunctor(
"gDirectory", 
"TDirectory*", TDirectory::CurrentDirectory);
 
 1787       fGlobals->AddAll(&TGlobalMappedFunction::GetEarlyRegisteredGlobals());
 
 1788       TGlobalMappedFunction::GetEarlyRegisteredGlobals().SetOwner(kFALSE);
 
 1789       TGlobalMappedFunction::GetEarlyRegisteredGlobals().Clear();
 
 1793       Fatal(
"GetListOfGlobals", 
"fInterpreter not initialized");
 
 1795    if (load) fGlobals->Load();
 
 1808 TCollection *TROOT::GetListOfGlobalFunctions(Bool_t load)
 
 1810    R__LOCKGUARD(gROOTMutex);
 
 1812    if (!fGlobalFunctions) {
 
 1813       fGlobalFunctions = 
new TListOfFunctions(0);
 
 1817       Fatal(
"GetListOfGlobalFunctions", 
"fInterpreter not initialized");
 
 1823    if (load) fGlobalFunctions->Load();
 
 1825    return fGlobalFunctions;
 
 1847 TCollection *TROOT::GetListOfTypes(Bool_t )
 
 1850       Fatal(
"GetListOfTypes", 
"fInterpreter not initialized");
 
 1859 void TROOT::Idle(UInt_t idleTimeInSec, 
const char *command)
 
 1861    if (!fApplication.load())
 
 1862       TApplication::CreateApplication();
 
 1864    if (idleTimeInSec <= 0)
 
 1865       (*fApplication).RemoveIdleTimer();
 
 1867       (*fApplication).SetIdleTimer(idleTimeInSec, command);
 
 1874 static TClass* R__GetClassIfKnown(
const char* className)
 
 1877    const char* libsToLoad = gInterpreter->GetClassSharedLibs(className);
 
 1881       return TClass::GetClass(className);
 
 1882    } 
else if (gROOT->GetListOfClasses()
 
 1883               && (cla = (TClass*)gROOT->GetListOfClasses()->FindObject(className))) {
 
 1885    } 
else if (gClassTable->FindObject(className)) {
 
 1886       return TClass::GetClass(className);
 
 1895 Int_t TROOT::IgnoreInclude(
const char *fname, 
const char * )
 
 1897    if (fname == 0) 
return 0;
 
 1899    TString stem(fname);
 
 1901    Int_t where = stem.Last(
'.');
 
 1902    if (where != kNPOS) {
 
 1903       if (stem.EndsWith(
".so") || stem.EndsWith(
".sl") ||
 
 1904           stem.EndsWith(
".dl") || stem.EndsWith(
".a")  ||
 
 1905           stem.EndsWith(
".dll", TString::kIgnoreCase))
 
 1910    TString className = gSystem->BaseName(stem);
 
 1911    TClass* cla = R__GetClassIfKnown(className);
 
 1915       className.ReplaceAll(
"/", 
"::");
 
 1916       className.ReplaceAll(
"\\", 
"::");
 
 1917       if (className.Contains(
":::")) {
 
 1926       cla = R__GetClassIfKnown(className);
 
 1934    if (cla->GetDeclFileLine() <= 0) 
return 0; 
 
 1935    TString decfile = gSystem->BaseName(cla->GetDeclFileName());
 
 1936    if (decfile != gSystem->BaseName(fname)) {
 
 1945 void TROOT::InitSystem()
 
 1948 #if defined(R__UNIX) 
 1949 #if defined(R__HAS_COCOA) 
 1950       gSystem = 
new TMacOSXSystem;
 
 1952       gSystem = 
new TUnixSystem;
 
 1954 #elif defined(R__WIN32) 
 1955       gSystem = 
new TWinNTSystem;
 
 1957       gSystem = 
new TSystem;
 
 1960       if (gSystem->Init())
 
 1961          fprintf(stderr, 
"Fatal in <TROOT::InitSystem>: can't init operating system layer\n");
 
 1963       if (!gSystem->HomeDirectory()) {
 
 1964          fprintf(stderr, 
"Fatal in <TROOT::InitSystem>: HOME directory not set\n");
 
 1965          fprintf(stderr, 
"Fix this by defining the HOME shell variable\n");
 
 1969       gEnv = 
new TEnv(
".rootrc");
 
 1971       gDebug = gEnv->GetValue(
"Root.Debug", 0);
 
 1973       if (!gEnv->GetValue(
"Root.ErrorHandlers", 1))
 
 1974          gSystem->ResetSignals();
 
 1981       Int_t oldzipmode = gEnv->GetValue(
"Root.ZipMode", -1);
 
 1982       if (oldzipmode == 0) {
 
 1983          fprintf(stderr, 
"Warning in <TROOT::InitSystem>: ignoring old rootrc entry \"Root.ZipMode = 0\"!\n");
 
 1985          if (oldzipmode == -1 || oldzipmode == 1) {
 
 1993       Int_t zipmode = gEnv->GetValue(
"Root.CompressionAlgorithm", oldzipmode);
 
 1994       if (zipmode != 0) R__SetZipMode(zipmode);
 
 1997       if ((sdeb = gSystem->Getenv(
"ROOTDEBUG")))
 
 1998          gDebug = atoi(sdeb);
 
 2000       if (gDebug > 0 && isatty(2))
 
 2001          fprintf(stderr, 
"Info in <TROOT::InitSystem>: running with gDebug = %d\n", gDebug);
 
 2003       if (gEnv->GetValue(
"Root.MemStat", 0))
 
 2004          TStorage::EnableStatistics();
 
 2005       int msize = gEnv->GetValue(
"Root.MemStat.size", -1);
 
 2006       int mcnt  = gEnv->GetValue(
"Root.MemStat.cnt", -1);
 
 2007       if (msize != -1 || mcnt != -1)
 
 2008          TStorage::EnableStatistics(msize, mcnt);
 
 2010       fgMemCheck = gEnv->GetValue(
"Root.MemCheck", 0);
 
 2012 #if defined(R__HAS_COCOA) 
 2017       { TUrl dummy(
"/dummy"); }
 
 2019       TObject::SetObjectStat(gEnv->GetValue(
"Root.ObjectStat", 0));
 
 2026 void TROOT::InitThreads()
 
 2028    if (gEnv->GetValue(
"Root.UseThreads", 0) || gEnv->GetValue(
"Root.EnableThreadSafety", 0)) {
 
 2029       ROOT::EnableThreadSafety();
 
 2037 void TROOT::InitInterpreter()
 
 2041    if (!dlsym(RTLD_DEFAULT, 
"usedToIdentifyRootClingByDlSym")
 
 2042        && !dlsym(RTLD_DEFAULT, 
"usedToIdentifyStaticRoot")) {
 
 2048       void *LLVMEnablePrettyStackTraceAddr = 0;
 
 2051       LLVMEnablePrettyStackTraceAddr = dlsym(RTLD_DEFAULT, 
"LLVMEnablePrettyStackTrace");
 
 2053       if (LLVMEnablePrettyStackTraceAddr) {
 
 2054          Error(
"InitInterpreter()", 
"LLVM SYMBOLS ARE EXPOSED TO CLING! " 
 2055                "This will cause problems; please hide them or dlopen() them " 
 2056                "after the call to TROOT::InitInterpreter()!");
 
 2059       char *libRIO = gSystem->DynamicPathName(
"libRIO");
 
 2060       void *libRIOHandle = dlopen(libRIO, RTLD_NOW|RTLD_GLOBAL);
 
 2062       if (!libRIOHandle) {
 
 2063          TString err = dlerror();
 
 2064          fprintf(stderr, 
"Fatal in <TROOT::InitInterpreter>: cannot load library %s\n", err.Data());
 
 2068       char *libcling = gSystem->DynamicPathName(
"libCling");
 
 2069       gInterpreterLib = dlopen(libcling, RTLD_LAZY|RTLD_LOCAL);
 
 2072       if (!gInterpreterLib) {
 
 2073          TString err = dlerror();
 
 2074          fprintf(stderr, 
"Fatal in <TROOT::InitInterpreter>: cannot load library %s\n", err.Data());
 
 2079       gInterpreterLib = RTLD_DEFAULT;
 
 2081    CreateInterpreter_t *CreateInterpreter = (CreateInterpreter_t*) dlsym(gInterpreterLib, 
"CreateInterpreter");
 
 2082    if (!CreateInterpreter) {
 
 2083       TString err = dlerror();
 
 2084       fprintf(stderr, 
"Fatal in <TROOT::InitInterpreter>: cannot load symbol %s\n", err.Data());
 
 2088    atexit(at_exit_of_TROOT);
 
 2090    gDestroyInterpreter = (DestroyInterpreter_t*) dlsym(gInterpreterLib, 
"DestroyInterpreter");
 
 2091    if (!gDestroyInterpreter) {
 
 2092       TString err = dlerror();
 
 2093       fprintf(stderr, 
"Fatal in <TROOT::InitInterpreter>: cannot load symbol %s\n", err.Data());
 
 2097    const char *interpArgs[] = {
 
 2115    fInterpreter = CreateInterpreter(gInterpreterLib, interpArgs);
 
 2117    fCleanups->Add(fInterpreter);
 
 2118    fInterpreter->SetBit(kMustCleanup);
 
 2127    for (std::vector<ModuleHeaderInfo_t>::const_iterator
 
 2128            li = GetModuleHeaderInfoBuffer().begin(),
 
 2129            le = GetModuleHeaderInfoBuffer().end(); li != le; ++li) {
 
 2131       fInterpreter->RegisterModule(li->fModuleName,
 
 2137                                    li->fFwdNargsToKeepColl,
 
 2138                                    li->fClassesHeaders,
 
 2142    GetModuleHeaderInfoBuffer().clear();
 
 2144    fInterpreter->Initialize();
 
 2156 TClass *TROOT::LoadClass(
const char *requestedname, Bool_t silent)
 const 
 2158    return TClass::LoadClass(requestedname, silent);
 
 2172 Int_t TROOT::LoadClass(
const char * , 
const char *libname,
 
 2175    TString lib(libname);
 
 2178    if (
char *path = gSystem->DynamicPathName(lib, kTRUE)) {
 
 2187          int err = gSystem->Load(path, 0, kTRUE);
 
 2199          if (!gSystem->GetPathInfo(libname, stat) && (R_ISREG(stat.fMode) &&
 
 2200              !gSystem->AccessPathName(libname, kReadPermission)))
 
 2205       if (!lib.BeginsWith(
"lib")) {
 
 2207          return LoadClass(
"", lib.Data(), check);
 
 2219 Bool_t TROOT::IsRootFile(
const char *filename)
 const 
 2221    Bool_t result = kFALSE;
 
 2222    FILE *mayberootfile = fopen(filename,
"rb");
 
 2223    if (mayberootfile) {
 
 2225       if (fgets(header,5,mayberootfile)) {
 
 2226          result = strncmp(header,
"root",4)==0;
 
 2228       fclose(mayberootfile);
 
 2239 void TROOT::ls(Option_t *option)
 const 
 2243    TDirectory::ls(option);
 
 2257 Int_t TROOT::LoadMacro(
const char *filename, 
int *error, Bool_t check)
 
 2270       TString fname = gSystem->SplitAclicMode(filename, aclicMode, arguments, io);
 
 2272       if (arguments.Length()) {
 
 2273          Warning(
"LoadMacro", 
"argument(%s) ignored in %s", arguments.Data(), GetMacroPath());
 
 2275       char *mac = gSystem->Which(GetMacroPath(), fname, kReadPermission);
 
 2278             Error(
"LoadMacro", 
"macro %s not found in path %s", fname.Data(), GetMacroPath());
 
 2279          *terr = TInterpreter::kFatal;
 
 2286             gInterpreter->LoadMacro(fname.Data(), (TInterpreter::EErrorCode*)terr);
 
 2305 Long_t TROOT::Macro(
const char *filename, Int_t *error, Bool_t padUpdate)
 
 2313       TString fname = gSystem->SplitAclicMode(filename, aclicMode, arguments, io);
 
 2315       char *mac = gSystem->Which(GetMacroPath(), fname, kReadPermission);
 
 2317          Error(
"Macro", 
"macro %s not found in path %s", fname.Data(), GetMacroPath());
 
 2319             *error = TInterpreter::kFatal;
 
 2325          result = gInterpreter->ExecuteMacro(fname, (TInterpreter::EErrorCode*)error);
 
 2329       if (padUpdate && gPad)
 
 2339 void  TROOT::Message(Int_t 
id, 
const TObject *obj)
 
 2341    TIter next(fMessageHandlers);
 
 2342    TMessageHandler *mh;
 
 2343    while ((mh = (TMessageHandler*)next())) {
 
 2344       mh->HandleMessage(
id,obj);
 
 2359 Long_t TROOT::ProcessLine(
const char *line, Int_t *error)
 
 2361    TString sline = line;
 
 2362    sline = sline.Strip(TString::kBoth);
 
 2364    if (!fApplication.load())
 
 2365       TApplication::CreateApplication();
 
 2367    return (*fApplication).ProcessLine(sline, kFALSE, error);
 
 2379 Long_t TROOT::ProcessLineSync(
const char *line, Int_t *error)
 
 2381    TString sline = line;
 
 2382    sline = sline.Strip(TString::kBoth);
 
 2384    if (!fApplication.load())
 
 2385       TApplication::CreateApplication();
 
 2387    return (*fApplication).ProcessLine(sline, kTRUE, error);
 
 2396 Long_t TROOT::ProcessLineFast(
const char *line, Int_t *error)
 
 2398    TString sline = line;
 
 2399    sline = sline.Strip(TString::kBoth);
 
 2401    if (!fApplication.load())
 
 2402       TApplication::CreateApplication();
 
 2407       TInterpreter::EErrorCode *code = (TInterpreter::EErrorCode*)error;
 
 2408       result = gInterpreter->Calc(sline, code);
 
 2418 void TROOT::ReadGitInfo()
 
 2420 #ifdef ROOT_GIT_COMMIT 
 2421    fGitCommit = ROOT_GIT_COMMIT;
 
 2423 #ifdef ROOT_GIT_BRANCH 
 2424    fGitBranch = ROOT_GIT_BRANCH;
 
 2427    TString gitinfo = 
"gitinfo.txt";
 
 2428    char *filename = gSystem->ConcatFileName(TROOT::GetEtcDir(), gitinfo);
 
 2430    FILE *fp = fopen(filename, 
"r");
 
 2447 Bool_t &GetReadingObject() {
 
 2448    TTHREAD_TLS(Bool_t) fgReadingObject = false;
 
 2449    return fgReadingObject;
 
 2455 Bool_t TROOT::ReadingObject()
 const 
 2457    return GetReadingObject();
 
 2460 void TROOT::SetReadingObject(Bool_t flag)
 
 2462    GetReadingObject() = flag;
 
 2469 const char *TROOT::GetGitDate()
 
 2471    if (fGitDate == 
"") {
 
 2472       Int_t iday,imonth,iyear, ihour, imin;
 
 2473       static const char *months[] = { 
"Jan", 
"Feb", 
"Mar", 
"Apr", 
"May", 
"Jun",
 
 2474                                       "Jul", 
"Aug", 
"Sep", 
"Oct", 
"Nov", 
"Dec" };
 
 2475       Int_t idate = gROOT->GetBuiltDate();
 
 2476       Int_t itime = gROOT->GetBuiltTime();
 
 2478       imonth = (idate/100)%100;
 
 2479       iyear  = idate/10000;
 
 2482       fGitDate.Form(
"%s %02d %4d, %02d:%02d:00", months[imonth-1], iday, iyear, ihour, imin);
 
 2493 void TROOT::RecursiveRemove(TObject *obj)
 
 2495    R__READ_LOCKGUARD(ROOT::gCoreMutex);
 
 2497    fCleanups->RecursiveRemove(obj);
 
 2507 void TROOT::RefreshBrowsers()
 
 2509    TIter next(GetListOfBrowsers());
 
 2511    while ((b = (TBrowser*) next()))
 
 2512       b->SetRefreshFlag(kTRUE);
 
 2517 static void CallCloseFiles()
 
 2519    if (TROOT::Initialized() && ROOT::Internal::gROOTLocal) {
 
 2520       gROOT->CloseFiles();
 
 2530 void TROOT::RegisterModule(
const char* modulename,
 
 2531                            const char** headers,
 
 2532                            const char** includePaths,
 
 2533                            const char* payloadCode,
 
 2534                            const char* fwdDeclCode,
 
 2535                            void (*triggerFunc)(),
 
 2536                            const TInterpreter::FwdDeclArgsToKeepCollection_t& fwdDeclsArgToSkip,
 
 2537                            const char** classesHeaders,
 
 2596    atexit(CallCloseFiles);
 
 2599    if (TROOT::Initialized()) {
 
 2600       gCling->RegisterModule(modulename, headers, includePaths, payloadCode, fwdDeclCode, triggerFunc,
 
 2601                              fwdDeclsArgToSkip, classesHeaders, 
false, hasCxxModule);
 
 2603       GetModuleHeaderInfoBuffer().push_back(ModuleHeaderInfo_t(modulename, headers, includePaths, payloadCode,
 
 2604                                                                fwdDeclCode, triggerFunc, fwdDeclsArgToSkip,
 
 2605                                                                classesHeaders, hasCxxModule));
 
 2613 TObject *TROOT::Remove(TObject* obj)
 
 2615    R__LOCKGUARD(gROOTMutex);
 
 2616    return TDirectory::Remove(obj);
 
 2623 void TROOT::RemoveClass(TClass *oldcl)
 
 2625    TClass::RemoveClass(oldcl);
 
 2646 void TROOT::Reset(Option_t *option)
 
 2648    if (IsExecutingMacro()) 
return;  
 
 2650       if (!strncmp(option, 
"a", 1)) {
 
 2651          fInterpreter->Reset();
 
 2652          fInterpreter->SaveContext();
 
 2654          gInterpreter->ResetGlobals();
 
 2656       if (fGlobals) fGlobals->Unload();
 
 2657       if (fGlobalFunctions) fGlobalFunctions->Unload();
 
 2666 void TROOT::SaveContext()
 
 2669       gInterpreter->SaveGlobalsContext();
 
 2678 void TROOT::SetCutClassName(
const char *name)
 
 2681       Error(
"SetCutClassName",
"Invalid class name");
 
 2684    TClass *cl = TClass::GetClass(name);
 
 2686       Error(
"SetCutClassName",
"Unknown class:%s",name);
 
 2689    if (!cl->InheritsFrom(
"TCutG")) {
 
 2690       Error(
"SetCutClassName",
"Class:%s does not derive from TCutG",name);
 
 2693    fCutClassName = name;
 
 2699 void TROOT::SetEditorMode(
const char *mode)
 
 2702    if (!mode[0]) 
return;
 
 2703    if (!strcmp(mode,
"Arc"))      {fEditorMode = kArc;        
return;}
 
 2704    if (!strcmp(mode,
"Line"))     {fEditorMode = kLine;       
return;}
 
 2705    if (!strcmp(mode,
"Arrow"))    {fEditorMode = kArrow;      
return;}
 
 2706    if (!strcmp(mode,
"Button"))   {fEditorMode = kButton;     
return;}
 
 2707    if (!strcmp(mode,
"Diamond"))  {fEditorMode = kDiamond;    
return;}
 
 2708    if (!strcmp(mode,
"Ellipse"))  {fEditorMode = kEllipse;    
return;}
 
 2709    if (!strcmp(mode,
"Pad"))      {fEditorMode = kPad;        
return;}
 
 2710    if (!strcmp(mode,
"Pave"))     {fEditorMode = kPave;       
return;}
 
 2711    if (!strcmp(mode,
"PaveLabel")){fEditorMode = kPaveLabel;  
return;}
 
 2712    if (!strcmp(mode,
"PaveText")) {fEditorMode = kPaveText;   
return;}
 
 2713    if (!strcmp(mode,
"PavesText")){fEditorMode = kPavesText;  
return;}
 
 2714    if (!strcmp(mode,
"PolyLine")) {fEditorMode = kPolyLine;   
return;}
 
 2715    if (!strcmp(mode,
"CurlyLine")){fEditorMode = kCurlyLine;  
return;}
 
 2716    if (!strcmp(mode,
"CurlyArc")) {fEditorMode = kCurlyArc;   
return;}
 
 2717    if (!strcmp(mode,
"Text"))     {fEditorMode = kText;       
return;}
 
 2718    if (!strcmp(mode,
"Marker"))   {fEditorMode = kMarker;     
return;}
 
 2719    if (!strcmp(mode,
"CutG"))     {fEditorMode = kCutG;       
return;}
 
 2725 void TROOT::SetStyle(
const char *stylename)
 
 2727    TString style_name = stylename;
 
 2729    TStyle *style = GetStyle(style_name);
 
 2730    if (style) style->cd();
 
 2731    else       Error(
"SetStyle",
"Unknown style:%s",style_name.Data());
 
 2741 Int_t TROOT::DecreaseDirLevel()
 
 2743    return --fgDirLevel;
 
 2749 Int_t TROOT::GetDirLevel()
 
 2757 const char *TROOT::GetMacroPath()
 
 2759    TString ¯oPath = ROOT::GetMacroPath();
 
 2761    if (macroPath.Length() == 0) {
 
 2762       macroPath = gEnv->GetValue(
"Root.MacroPath", (
char*)0);
 
 2763 #if defined(R__WIN32) 
 2764       macroPath.ReplaceAll(
"; ", 
";");
 
 2766       macroPath.ReplaceAll(
": ", 
":");
 
 2768       if (macroPath.Length() == 0)
 
 2769 #
if !defined(R__WIN32)
 
 2770          macroPath = 
".:" + TROOT::GetMacroDir();
 
 2772          macroPath = 
".;" + TROOT::GetMacroDir();
 
 2783 void TROOT::SetMacroPath(
const char *newpath)
 
 2785    TString ¯oPath = ROOT::GetMacroPath();
 
 2787    if (!newpath || !*newpath)
 
 2790       macroPath = newpath;
 
 2809 void TROOT::SetWebDisplay(
const char *webdisplay)
 
 2811    const char *wd = webdisplay;
 
 2815    if (!strcmp(wd, 
"off")) {
 
 2816       fIsWebDisplay = kFALSE;
 
 2817       fIsWebDisplayBatch = kFALSE;
 
 2820       fIsWebDisplay = kTRUE;
 
 2821       if (!strncmp(wd, 
"batch", 5)) {
 
 2822          fIsWebDisplayBatch = kTRUE;
 
 2824       } 
else if (!strncmp(wd, 
"nobatch", 7)) {
 
 2825          fIsWebDisplayBatch = kFALSE;
 
 2828          fIsWebDisplayBatch = kFALSE;
 
 2837 Int_t TROOT::IncreaseDirLevel()
 
 2839    return ++fgDirLevel;
 
 2845 void TROOT::IndentLevel()
 
 2847    for (
int i = 0; i < fgDirLevel; i++) std::cout.put(
' ');
 
 2853 void TROOT::Initialize() {
 
 2860 Bool_t TROOT::Initialized()
 
 2868 Bool_t TROOT::MemCheck()
 
 2876 void TROOT::SetDirLevel(Int_t level)
 
 2884 Int_t TROOT::ConvertVersionCode2Int(Int_t code)
 
 2886    return 10000*(code>>16) + 100*((code&65280)>>8) + (code&255);
 
 2892 Int_t TROOT::ConvertVersionInt2Code(Int_t v)
 
 2895    int b = (v - a*10000)/100;
 
 2896    int c = v - a*10000 - b*100;
 
 2897    return (a << 16) + (b << 8) + c;
 
 2903 Int_t TROOT::RootVersionCode()
 
 2905    return ROOT_VERSION_CODE;
 
 2914 const std::vector<std::string> &TROOT::AddExtraInterpreterArgs(
const std::vector<std::string> &args) {
 
 2915    static std::vector<std::string> sArgs = {};
 
 2916    sArgs.insert(sArgs.begin(), args.begin(), args.end());
 
 2924 const char**& TROOT::GetExtraInterpreterArgs() {
 
 2925    static const char** extraInterpArgs = 0;
 
 2926    return extraInterpArgs;
 
 2932 static Bool_t IgnorePrefix() {
 
 2933    static Bool_t ignorePrefix = gSystem->Getenv(
"ROOTIGNOREPREFIX");
 
 2934    return ignorePrefix;
 
 2941 const TString& TROOT::GetRootSys() {
 
 2944    const static TString rootsys = ROOT::FoundationUtils::GetRootSys();
 
 2951 const TString& TROOT::GetBinDir() {
 
 2953    if (IgnorePrefix()) {
 
 2955       static TString rootbindir;
 
 2956       if (rootbindir.IsNull()) {
 
 2958          gSystem->PrependPathName(GetRootSys(), rootbindir);
 
 2963       const static TString rootbindir = ROOTBINDIR;
 
 2972 const TString& TROOT::GetLibDir() {
 
 2974    if (IgnorePrefix()) {
 
 2976       static TString rootlibdir;
 
 2977       if (rootlibdir.IsNull()) {
 
 2979          gSystem->PrependPathName(GetRootSys(), rootlibdir);
 
 2984       const static TString rootlibdir = ROOTLIBDIR;
 
 2993 const TString& TROOT::GetIncludeDir() {
 
 2996    const static TString includedir = ROOT::FoundationUtils::GetIncludeDir();
 
 3003 const TString& TROOT::GetEtcDir() {
 
 3006    const static TString etcdir = ROOT::FoundationUtils::GetEtcDir();
 
 3013 const TString& TROOT::GetDataDir() {
 
 3015    if (IgnorePrefix()) {
 
 3017       return GetRootSys();
 
 3020       const static TString rootdatadir = ROOTDATADIR;
 
 3029 const TString& TROOT::GetDocDir() {
 
 3031    if (IgnorePrefix()) {
 
 3033       return GetRootSys();
 
 3036       const static TString rootdocdir = ROOTDOCDIR;
 
 3045 const TString& TROOT::GetMacroDir() {
 
 3047    if (IgnorePrefix()) {
 
 3049       static TString rootmacrodir;
 
 3050       if (rootmacrodir.IsNull()) {
 
 3051          rootmacrodir = 
"macros";
 
 3052          gSystem->PrependPathName(GetRootSys(), rootmacrodir);
 
 3054       return rootmacrodir;
 
 3057       const static TString rootmacrodir = ROOTMACRODIR;
 
 3058       return rootmacrodir;
 
 3066 const TString& TROOT::GetTutorialDir() {
 
 3068    if (IgnorePrefix()) {
 
 3070       static TString roottutdir;
 
 3071       if (roottutdir.IsNull()) {
 
 3072          roottutdir = 
"tutorials";
 
 3073          gSystem->PrependPathName(GetRootSys(), roottutdir);
 
 3078       const static TString roottutdir = ROOTTUTDIR;
 
 3087 void TROOT::ShutDown()
 
 3090       gROOT->EndOfProcessCleanups();
 
 3091    else if (gInterpreter)
 
 3092       gInterpreter->ShutDown();
 
 3098 const TString& TROOT::GetSourceDir() {
 
 3100    if (IgnorePrefix()) {
 
 3102       static TString rootsrcdir;
 
 3103       if (rootsrcdir.IsNull()) {
 
 3105          gSystem->PrependPathName(GetRootSys(), rootsrcdir);
 
 3110       const static TString rootsrcdir = ROOTSRCDIR;
 
 3119 const TString& TROOT::GetIconPath() {
 
 3121    if (IgnorePrefix()) {
 
 3123       static TString rooticonpath;
 
 3124       if (rooticonpath.IsNull()) {
 
 3125          rooticonpath = 
"icons";
 
 3126          gSystem->PrependPathName(GetRootSys(), rooticonpath);
 
 3128       return rooticonpath;
 
 3131       const static TString rooticonpath = ROOTICONPATH;
 
 3132       return rooticonpath;
 
 3140 const TString& TROOT::GetTTFFontDir() {
 
 3142    if (IgnorePrefix()) {
 
 3144       static TString ttffontdir;
 
 3145       if (ttffontdir.IsNull()) {
 
 3146          ttffontdir = 
"fonts";
 
 3147          gSystem->PrependPathName(GetRootSys(), ttffontdir);
 
 3152       const static TString ttffontdir = TTFFONTDIR;
 
 3162 const char *TROOT::GetTutorialsDir() {
 
 3163    return GetTutorialDir();