Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-15 10:30:05

0001 // @(#)root/meta:$Id$
0002 // Author: Fons Rademakers   01/03/96
0003 
0004 /*************************************************************************
0005  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
0006  * All rights reserved.                                                  *
0007  *                                                                       *
0008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
0009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
0010  *************************************************************************/
0011 
0012 
0013 #ifndef ROOT_TInterpreter
0014 #define ROOT_TInterpreter
0015 
0016 //////////////////////////////////////////////////////////////////////////
0017 //                                                                      //
0018 // TInterpreter                                                         //
0019 //                                                                      //
0020 // This class defines an abstract interface to a generic command line   //
0021 // interpreter.                                                         //
0022 //                                                                      //
0023 //////////////////////////////////////////////////////////////////////////
0024 
0025 #include "TDataType.h"
0026 #include "TDictionary.h"
0027 #include "TInterpreterValue.h"
0028 #include "TNamed.h"
0029 #include "TVirtualRWMutex.h"
0030 
0031 #include <map>
0032 #include <typeinfo>
0033 #include <vector>
0034 #include <string>
0035 #include <utility>
0036 
0037 class TClass;
0038 class TEnv;
0039 class TFunction;
0040 class TMethod;
0041 class TObjArray;
0042 class TEnum;
0043 class TListOfEnums;
0044 class TSeqCollection;
0045 
0046 R__EXTERN TVirtualMutex *gInterpreterMutex;
0047 
0048 # define R__LOCKGUARD_CLING(mutex)  ::ROOT::Internal::InterpreterMutexRegistrationRAII _R__UNIQUE_(R__guard)(mutex); { }
0049 
0050 namespace ROOT {
0051 namespace Internal {
0052 struct InterpreterMutexRegistrationRAII {
0053    TLockGuard fLockGuard;
0054    InterpreterMutexRegistrationRAII(TVirtualMutex* mutex);
0055    ~InterpreterMutexRegistrationRAII();
0056 };
0057 }
0058 }
0059 
0060 class TInterpreter : public TNamed {
0061 
0062 protected:
0063            void Execute(TMethod *method, TObjArray *params, int *error = nullptr) override = 0;
0064    virtual Bool_t SetSuspendAutoParsing(Bool_t value) = 0;
0065 
0066    friend class SuspendAutoParsing;
0067 
0068 public:
0069    // See as in TSchemaType.h.
0070    typedef class std::map<std::string, std::string> MembersMap_t;
0071 
0072    enum EErrorCode {
0073       kNoError     = 0,
0074       kRecoverable = 1,
0075       kDangerous   = 2,
0076       kFatal       = 3,
0077       kProcessing  = 99
0078    };
0079 
0080    enum class EReturnType { kLong, kDouble, kString, kOther, kNoReturnType };
0081 
0082    struct CallFuncIFacePtr_t {
0083       enum EKind {
0084          kUninitialized,
0085          kGeneric,
0086          kCtor,
0087          kDtor
0088       };
0089 
0090       typedef void (*Generic_t)(void*, int, void**, void*);
0091       typedef void (*Ctor_t)(void**, void*, unsigned long);
0092       typedef void (*Dtor_t)(void*, unsigned long, int);
0093 
0094       CallFuncIFacePtr_t():
0095          fKind(kUninitialized), fGeneric(nullptr) {}
0096       CallFuncIFacePtr_t(Generic_t func):
0097          fKind(kGeneric), fGeneric(func) {}
0098       CallFuncIFacePtr_t(Ctor_t func):
0099          fKind(kCtor), fCtor(func) {}
0100       CallFuncIFacePtr_t(Dtor_t func):
0101          fKind(kDtor), fDtor(func) {}
0102 
0103       EKind fKind;
0104       union {
0105          Generic_t fGeneric;
0106          Ctor_t fCtor;
0107          Dtor_t fDtor;
0108       };
0109    };
0110 
0111    class SuspendAutoParsing {
0112       TInterpreter *fInterp;
0113       Bool_t        fPrevious;
0114    public:
0115       SuspendAutoParsing(TInterpreter *where, Bool_t value = kTRUE) : fInterp(where), fPrevious(fInterp->SetSuspendAutoParsing(value)) {}
0116       ~SuspendAutoParsing() { fInterp->SetSuspendAutoParsing(fPrevious); }
0117    };
0118    virtual Bool_t IsAutoParsingSuspended() const = 0;
0119 
0120    class SuspendAutoLoadingRAII {
0121       TInterpreter *fInterp = nullptr;
0122       bool fOldValue;
0123 
0124    public:
0125       SuspendAutoLoadingRAII(TInterpreter *interp) : fInterp(interp)
0126       {
0127          fOldValue = fInterp->SetClassAutoLoading(false);
0128       }
0129       ~SuspendAutoLoadingRAII() { fInterp->SetClassAutoLoading(fOldValue); }
0130    };
0131 
0132    typedef int (*AutoLoadCallBack_t)(const char*);
0133    typedef std::vector<std::pair<std::string, int> > FwdDeclArgsToKeepCollection_t;
0134 
0135    TInterpreter() { }   // for Dictionary
0136    TInterpreter(const char *name, const char *title = "Generic Interpreter");
0137    virtual ~TInterpreter() { }
0138 
0139    virtual void     AddIncludePath(const char *path) = 0;
0140    virtual void    *SetAutoLoadCallBack(void* /*cb*/) { return nullptr; }
0141    virtual void    *GetAutoLoadCallBack() const { return nullptr; }
0142    virtual Int_t    AutoLoad(const char *classname, Bool_t knowDictNotLoaded = kFALSE) = 0;
0143    virtual Int_t    AutoLoad(const std::type_info& typeinfo, Bool_t knowDictNotLoaded = kFALSE) = 0;
0144    virtual Int_t    AutoParse(const char* cls) = 0;
0145    virtual void     ClearFileBusy() = 0;
0146    virtual void     ClearStack() = 0; // Delete existing temporary values
0147    virtual Bool_t   Declare(const char* code) = 0;
0148    virtual void     EndOfLineAction() = 0;
0149    virtual TClass  *GetClass(const std::type_info& typeinfo, Bool_t load) const = 0;
0150    virtual Int_t    GetExitCode() const = 0;
0151    virtual TEnv    *GetMapfile() const { return nullptr; }
0152    ///\brief Returns whether the interpreter is waiting for more input, i.e.
0153    /// the collected input is incomplete.
0154    virtual Int_t    GetMore() const = 0;
0155    virtual TClass  *GenerateTClass(const char *classname, Bool_t emulation, Bool_t silent = kFALSE) = 0;
0156    virtual TClass  *GenerateTClass(ClassInfo_t *classinfo, Bool_t silent = kFALSE) = 0;
0157    virtual Int_t    GenerateDictionary(const char *classes, const char *includes = nullptr, const char *options = nullptr) = 0;
0158    virtual char    *GetPrompt() = 0;
0159    virtual const char *GetSharedLibs() = 0;
0160    virtual const char *GetClassSharedLibs(const char *cls, bool skipCore = true) = 0;
0161    virtual const char *GetSharedLibDeps(const char *lib, bool tryDyld = false) = 0;
0162    virtual const char *GetIncludePath() = 0;
0163    virtual const char *GetSTLIncludePath() const { return ""; }
0164    virtual TObjArray  *GetRootMapFiles() const = 0;
0165    virtual void     Initialize() = 0;
0166    virtual void     ShutDown() = 0;
0167    virtual void     InspectMembers(TMemberInspector&, const void* obj, const TClass* cl, Bool_t isTransient) = 0;
0168    virtual Bool_t   IsLoaded(const char *filename) const = 0;
0169    virtual Bool_t   IsLibraryLoaded(const char *libname) const = 0;
0170    virtual bool     IsValid() const = 0;
0171    virtual Bool_t   HasPCMForLibrary(const char *libname) const = 0;
0172    virtual Int_t    Load(const char *filenam, Bool_t system = kFALSE) = 0;
0173    virtual void     LoadMacro(const char *filename, EErrorCode *error = nullptr) = 0;
0174    virtual Int_t    LoadLibraryMap(const char *rootmapfile = nullptr) = 0;
0175    virtual Int_t    RescanLibraryMap() = 0;
0176    virtual Int_t    ReloadAllSharedLibraryMaps() = 0;
0177    virtual Int_t    UnloadAllSharedLibraryMaps() = 0;
0178    virtual Int_t    UnloadLibraryMap(const char *library) = 0;
0179    virtual Longptr_t ProcessLine(const char *line, EErrorCode *error = nullptr) = 0;
0180    virtual Longptr_t ProcessLineSynch(const char *line, EErrorCode *error = nullptr) = 0;
0181    virtual void     PrintIntro() = 0;
0182    virtual bool     RegisterPrebuiltModulePath(const std::string& FullPath,
0183                                                const std::string& ModuleMapName = "module.modulemap") const = 0;
0184    virtual void     RegisterModule(const char* /*modulename*/,
0185                                    const char** /*headers*/,
0186                                    const char** /*includePaths*/,
0187                                    const char* /*payloadCode*/,
0188                                    const char* /*fwdDeclsCode*/,
0189                                    void (* /*triggerFunc*/)(),
0190                                    const FwdDeclArgsToKeepCollection_t& fwdDeclArgsToKeep,
0191                                    const char** classesHeaders,
0192                                    Bool_t lateRegistration = false,
0193                                    Bool_t hasCxxModule = false) = 0;
0194    virtual void     AddAvailableIndentifiers(TSeqCollection&) = 0;
0195    virtual void     RegisterTClassUpdate(TClass *oldcl,DictFuncPtr_t dict) = 0;
0196    virtual void     UnRegisterTClassUpdate(const TClass *oldcl) = 0;
0197    virtual Int_t    SetClassSharedLibs(const char *cls, const char *libs) = 0;
0198    virtual void     SetGetline(const char*(*getlineFunc)(const char* prompt),
0199                                void (*histaddFunc)(const char* line)) = 0;
0200    virtual void     Reset() = 0;
0201    virtual void     ResetAll() = 0;
0202    virtual void     ResetGlobals() = 0;
0203    virtual void     ResetGlobalVar(void *obj) = 0;
0204    virtual void     RewindDictionary() = 0;
0205    virtual Int_t    DeleteGlobal(void *obj) = 0;
0206    virtual Int_t    DeleteVariable(const char* name) = 0;
0207    virtual void     SaveContext() = 0;
0208    virtual void     SaveGlobalsContext() = 0;
0209    virtual void     UpdateListOfGlobals() = 0;
0210    virtual void     UpdateListOfGlobalFunctions() = 0;
0211    virtual void     UpdateListOfTypes() = 0;
0212    virtual void     SetClassInfo(TClass *cl, Bool_t reload = kFALSE, Bool_t silent = kFALSE) = 0;
0213 
0214    enum ECheckClassInfo {
0215       kUnknown = 0, // backward compatible with false
0216       kKnown = 1,
0217       kWithClassDefInline = 2
0218    };
0219    virtual ECheckClassInfo CheckClassInfo(const char *name, Bool_t autoload, Bool_t isClassOrNamespaceOnly = kFALSE) = 0;
0220 
0221    virtual Bool_t   CheckClassTemplate(const char *name) = 0;
0222    virtual Longptr_t Calc(const char *line, EErrorCode* error = nullptr) = 0;
0223    virtual void     CreateListOfBaseClasses(TClass *cl) const = 0;
0224    virtual void     CreateListOfDataMembers(TClass *cl) const = 0;
0225    virtual void     CreateListOfMethods(TClass *cl) const = 0;
0226    virtual void     CreateListOfMethodArgs(TFunction *m) const = 0;
0227    virtual void     UpdateListOfMethods(TClass *cl) const = 0;
0228    virtual TString  GetMangledName(TClass *cl, const char *method, const char *params, Bool_t objectIsConst = kFALSE) = 0;
0229    virtual TString  GetMangledNameWithPrototype(TClass *cl, const char *method, const char *proto, Bool_t objectIsConst = kFALSE, ROOT::EFunctionMatchMode /* mode */ = ROOT::kConversionMatch) = 0;
0230    virtual void     GetInterpreterTypeName(const char *name, std::string &output, Bool_t full = kFALSE) = 0;
0231    virtual void    *GetInterfaceMethod(TClass *cl, const char *method, const char *params, Bool_t objectIsConst = kFALSE) = 0;
0232    virtual void    *GetInterfaceMethodWithPrototype(TClass *cl, const char *method, const char *proto, Bool_t objectIsConst = kFALSE, ROOT::EFunctionMatchMode /* mode */ = ROOT::kConversionMatch) = 0;
0233            void     Execute(const char *function, const char *params, int *error = nullptr) override = 0;
0234    virtual void     Execute(TObject *obj, TClass *cl, const char *method, const char *params, int *error = nullptr) = 0;
0235    virtual void     Execute(TObject *obj, TClass *cl, TMethod *method, TObjArray *params, int *error = nullptr) = 0;
0236    virtual void     ExecuteWithArgsAndReturn(TMethod *method, void* address, const void* args[] = nullptr, int /*nargs*/ = 0, void *ret= nullptr) const = 0;
0237    virtual Longptr_t ExecuteMacro(const char *filename, EErrorCode *error = nullptr) = 0;
0238    virtual Bool_t   IsErrorMessagesEnabled() const = 0;
0239    virtual Bool_t   SetErrorMessages(Bool_t enable = kTRUE) = 0;
0240    virtual Bool_t   IsProcessLineLocked() const = 0;
0241    virtual void     SetProcessLineLock(Bool_t lock = kTRUE) = 0;
0242    virtual const char *TypeName(const char *s) = 0;
0243    virtual std::string ToString(const char *type, void *obj) = 0;
0244 
0245    virtual void     SnapshotMutexState(ROOT::TVirtualRWMutex* mtx) = 0;
0246    virtual void     ForgetMutexState() = 0;
0247 
0248    // All the functions below must be virtual with a dummy implementation
0249    // These functions are redefined in TCling.
0250 
0251    // Misc
0252    virtual int    DisplayClass(FILE * /* fout */,const char * /* name */,int /* base */,int /* start */) const {return 0;}
0253    virtual int    DisplayIncludePath(FILE * /* fout */) const {return 0;}
0254    virtual void  *FindSym(const char * /* entry */) const {return nullptr;}
0255    virtual void   GenericError(const char * /* error */) const {}
0256    virtual Long_t GetExecByteCode() const {return 0;}
0257    virtual const char *GetTopLevelMacroName() const {return nullptr;};
0258    virtual const char *GetCurrentMacroName()  const {return nullptr;};
0259    virtual int    GetSecurityError() const{return 0;}
0260    virtual int    LoadFile(const char * /* path */) const {return 0;}
0261    virtual Bool_t LoadText(const char * /* text */) const {return kFALSE;}
0262    virtual const char *MapCppName(const char*) const {return nullptr;}
0263    virtual void   SetAlloclockfunc(void (*)()) const {}
0264    virtual void   SetAllocunlockfunc(void (*)()) const {}
0265    virtual int    SetClassAutoLoading(int) const {return 0;}
0266            int    SetClassAutoloading(int a) const { return SetClassAutoLoading(a); }  // Deprecated
0267    virtual int    SetClassAutoparsing(int) {return 0;};
0268    virtual void   SetErrmsgcallback(void * /* p */) const {}
0269    /// \brief Report diagnostics to the ROOT error handler (see TError.h).
0270    virtual void   ReportDiagnosticsToErrorHandler(bool /*enable*/ = true) {}
0271    virtual void   SetTempLevel(int /* val */) const {}
0272    virtual int    UnloadFile(const char * /* path */) const {return 0;}
0273 
0274    /// The created temporary must be deleted by the caller.
0275    /// Deprecated! Please use MakeInterpreterValue().
0276    TInterpreterValue *CreateTemporary() const {
0277       return MakeInterpreterValue().release();
0278    }
0279    virtual std::unique_ptr<TInterpreterValue> MakeInterpreterValue() const { return nullptr; }
0280    virtual void   CodeComplete(const std::string&, size_t&,
0281                                std::vector<std::string>&) {}
0282    virtual int Evaluate(const char*, TInterpreterValue&) {return 0;}
0283 
0284    // core/meta helper functions.
0285    virtual EReturnType MethodCallReturnType(TFunction *func) const = 0;
0286    virtual ULong64_t GetInterpreterStateMarker() const = 0;
0287    virtual bool DiagnoseIfInterpreterException(const std::exception &e) const = 0;
0288 
0289    typedef TDictionary::DeclId_t DeclId_t;
0290    virtual DeclId_t GetDeclId(CallFunc_t *info) const = 0;
0291    virtual DeclId_t GetDeclId(ClassInfo_t *info) const = 0;
0292    virtual DeclId_t GetDeclId(DataMemberInfo_t *info) const = 0;
0293    virtual DeclId_t GetDeclId(FuncTempInfo_t *info) const = 0;
0294    virtual DeclId_t GetDeclId(MethodInfo_t *info) const = 0;
0295    virtual DeclId_t GetDeclId(TypedefInfo_t *info) const = 0;
0296 
0297    virtual void SetDeclAttr(DeclId_t, const char* /* attribute */) = 0 ;
0298 
0299    virtual DeclId_t GetDataMember(ClassInfo_t *cl, const char *name) const = 0;
0300    virtual DeclId_t GetDataMemberAtAddr(const void *addr) const = 0;
0301    virtual DeclId_t GetDataMemberWithValue(const void *ptrvalue) const = 0;
0302    virtual DeclId_t GetEnum(TClass *cl, const char *name) const = 0;
0303    virtual TEnum*   CreateEnum(void *VD, TClass *cl) const = 0;
0304    virtual void     UpdateEnumConstants(TEnum* enumObj, TClass* cl) const = 0;
0305    virtual void     LoadEnums(TListOfEnums& cl) const = 0;
0306    virtual DeclId_t GetFunction(ClassInfo_t *cl, const char *funcname) = 0;
0307    virtual DeclId_t GetFunctionWithPrototype(ClassInfo_t *cl, const char* method, const char* proto, Bool_t objectIsConst = kFALSE, ROOT::EFunctionMatchMode mode = ROOT::kConversionMatch) = 0;
0308    virtual DeclId_t GetFunctionWithValues(ClassInfo_t *cl, const char* method, const char* params, Bool_t objectIsConst = kFALSE) = 0;
0309    virtual DeclId_t GetFunctionTemplate(ClassInfo_t *cl, const char *funcname) = 0;
0310    virtual void     GetFunctionOverloads(ClassInfo_t *cl, const char *funcname, std::vector<DeclId_t>& res) const = 0;
0311    virtual void     LoadFunctionTemplates(TClass* cl) const = 0;
0312    virtual std::vector<std::string> GetUsingNamespaces(ClassInfo_t *cl) const = 0;
0313 
0314    // CallFunc interface
0315    virtual void   CallFunc_Delete(CallFunc_t * /* func */) const {}
0316    virtual void   CallFunc_Exec(CallFunc_t * /* func */, void * /* address */) const {}
0317    virtual void   CallFunc_Exec(CallFunc_t * /* func */, void * /* address */, TInterpreterValue& /* val */) const {}
0318    virtual void   CallFunc_ExecWithReturn(CallFunc_t * /* func */, void * /* address */, void * /* ret */) const {}
0319    virtual void   CallFunc_ExecWithArgsAndReturn(CallFunc_t * /* func */, void * /* address */, const void* /* args */ [] = nullptr, int /*nargs*/ = 0, void * /* ret */ = nullptr) const {}
0320    virtual Longptr_t CallFunc_ExecInt(CallFunc_t * /* func */, void * /* address */) const {return 0;}
0321    virtual Long64_t  CallFunc_ExecInt64(CallFunc_t * /* func */, void * /* address */) const {return 0;}
0322    virtual Double_t  CallFunc_ExecDouble(CallFunc_t * /* func */, void * /* address */) const {return 0;}
0323    virtual CallFunc_t   *CallFunc_Factory() const {return nullptr;}
0324    virtual CallFunc_t   *CallFunc_FactoryCopy(CallFunc_t * /* func */) const {return nullptr;}
0325    virtual MethodInfo_t *CallFunc_FactoryMethod(CallFunc_t * /* func */) const {return nullptr;}
0326    virtual void   CallFunc_IgnoreExtraArgs(CallFunc_t * /*func */, bool /*ignore*/) const {}
0327    virtual void   CallFunc_Init(CallFunc_t * /* func */) const {}
0328    virtual Bool_t CallFunc_IsValid(CallFunc_t * /* func */) const {return 0;}
0329    virtual CallFuncIFacePtr_t CallFunc_IFacePtr(CallFunc_t * /* func */) const {return CallFuncIFacePtr_t();}
0330    virtual void   CallFunc_ResetArg(CallFunc_t * /* func */) const {}
0331    virtual void   CallFunc_SetArgArray(CallFunc_t * /* func */, Longptr_t * /* paramArr */, Int_t /* nparam */) const {}
0332    virtual void   CallFunc_SetArgs(CallFunc_t * /* func */, const char * /* param */) const {}
0333 
0334    virtual void   CallFunc_SetArg(CallFunc_t * /*func */, Long_t /* param */) const = 0;
0335    virtual void   CallFunc_SetArg(CallFunc_t * /*func */, ULong_t /* param */) const = 0;
0336    virtual void   CallFunc_SetArg(CallFunc_t * /* func */, Float_t /* param */) const = 0;
0337    virtual void   CallFunc_SetArg(CallFunc_t * /* func */, Double_t /* param */) const = 0;
0338    virtual void   CallFunc_SetArg(CallFunc_t * /* func */, Long64_t /* param */) const = 0;
0339    virtual void   CallFunc_SetArg(CallFunc_t * /* func */, ULong64_t /* param */) const = 0;
0340 
0341    void CallFunc_SetArg(CallFunc_t * func, Char_t param) const { CallFunc_SetArg(func,(Longptr_t)param); }
0342    void CallFunc_SetArg(CallFunc_t * func, Short_t param) const { CallFunc_SetArg(func,(Longptr_t)param); }
0343    void CallFunc_SetArg(CallFunc_t * func, Int_t param) const { CallFunc_SetArg(func,(Longptr_t)param); }
0344 
0345    void CallFunc_SetArg(CallFunc_t * func, UChar_t param) const { CallFunc_SetArg(func,(ULongptr_t)param); }
0346    void CallFunc_SetArg(CallFunc_t * func, UShort_t param) const { CallFunc_SetArg(func,(ULongptr_t)param); }
0347    void CallFunc_SetArg(CallFunc_t * func, UInt_t param) const { CallFunc_SetArg(func,(ULongptr_t)param); }
0348 
0349    template <typename T>
0350    void CallFunc_SetArgRef(CallFunc_t * func, T &param) const { CallFunc_SetArg(func,(ULongptr_t)&param); }
0351 
0352    void CallFunc_SetArg(CallFunc_t *func, void *arg)
0353    {
0354       CallFunc_SetArg(func,(Longptr_t) arg);
0355    }
0356 
0357    template <typename T>
0358    void CallFunc_SetArg(CallFunc_t *func, const T *arg)
0359    {
0360       CallFunc_SetArg(func,(Longptr_t) arg);
0361    }
0362 
0363    void CallFunc_SetArgImpl(CallFunc_t * /* func */)
0364    {
0365    }
0366 
0367    template <typename U>
0368    void CallFunc_SetArgImpl(CallFunc_t *func, const U& head)
0369    {
0370       CallFunc_SetArg(func, head);
0371    }
0372 
0373    template <typename U, typename... T>
0374    void CallFunc_SetArgImpl(CallFunc_t *func, const U& head, const T&... tail)
0375    {
0376       CallFunc_SetArg(func, head);
0377       CallFunc_SetArgImpl(func, tail...);
0378    }
0379 
0380    template <typename... T>
0381    void CallFunc_SetArguments(CallFunc_t *func, const T&... args)
0382    {
0383       R__LOCKGUARD(gInterpreterMutex);
0384 
0385       CallFunc_ResetArg(func);
0386       CallFunc_SetArgImpl(func,args...);
0387    }
0388 
0389    virtual void   CallFunc_SetFunc(CallFunc_t * /* func */, ClassInfo_t * /* info */, const char * /* method */, const char * /* params */, bool /* objectIsConst */, Longptr_t * /* Offset */) const {}
0390    virtual void   CallFunc_SetFunc(CallFunc_t * /* func */, ClassInfo_t * /* info */, const char * /* method */, const char * /* params */, Longptr_t * /* Offset */) const {}
0391    virtual void   CallFunc_SetFunc(CallFunc_t * /* func */, MethodInfo_t * /* info */) const {}
0392    virtual void   CallFunc_SetFuncProto(CallFunc_t * /* func */, ClassInfo_t * /* info */, const char * /* method */, const char * /* proto */, Longptr_t * /* Offset */, ROOT::EFunctionMatchMode /* mode */ = ROOT::kConversionMatch) const {}
0393    virtual void   CallFunc_SetFuncProto(CallFunc_t * /* func */, ClassInfo_t * /* info */, const char * /* method */, const char * /* proto */, bool /* objectIsConst */, Longptr_t * /* Offset */, ROOT::EFunctionMatchMode /* mode */ = ROOT::kConversionMatch) const {}
0394    virtual void   CallFunc_SetFuncProto(CallFunc_t* func, ClassInfo_t* info, const char* method, const std::vector<TypeInfo_t*> &proto, Longptr_t* Offset, ROOT::EFunctionMatchMode mode = ROOT::kConversionMatch) const = 0;
0395    virtual void   CallFunc_SetFuncProto(CallFunc_t* func, ClassInfo_t* info, const char* method, const std::vector<TypeInfo_t*> &proto, bool objectIsConst, Longptr_t* Offset, ROOT::EFunctionMatchMode mode = ROOT::kConversionMatch) const = 0;
0396 
0397    virtual std::string CallFunc_GetWrapperCode(CallFunc_t *func) const = 0;
0398 
0399    // ClassInfo interface
0400    virtual Bool_t ClassInfo_Contains(ClassInfo_t *info, DeclId_t decl) const = 0;
0401    virtual Long_t ClassInfo_ClassProperty(ClassInfo_t * /* info */) const {return 0;}
0402    virtual void   ClassInfo_Delete(ClassInfo_t * /* info */) const {}
0403    virtual void   ClassInfo_Delete(ClassInfo_t * /* info */, void * /* arena */) const {}
0404    virtual void   ClassInfo_DeleteArray(ClassInfo_t * /* info */, void * /* arena */, bool /* dtorOnly */) const {}
0405    virtual void   ClassInfo_Destruct(ClassInfo_t * /* info */, void * /* arena */) const {}
0406    virtual ClassInfo_t  *ClassInfo_Factory(Bool_t /*all*/ = kTRUE) const = 0;
0407    virtual ClassInfo_t  *ClassInfo_Factory(ClassInfo_t * /* cl */) const = 0;
0408    virtual ClassInfo_t  *ClassInfo_Factory(const char * /* name */) const = 0;
0409    virtual ClassInfo_t  *ClassInfo_Factory(DeclId_t declid) const = 0;
0410    virtual Longptr_t ClassInfo_GetBaseOffset(ClassInfo_t* /* fromDerived */,
0411                                             ClassInfo_t* /* toBase */, void* /* address */ = nullptr, bool /*isderived*/ = true) const {return 0;}
0412    virtual int    ClassInfo_GetMethodNArg(ClassInfo_t * /* info */, const char * /* method */,const char * /* proto */, Bool_t /* objectIsConst */ = false, ROOT::EFunctionMatchMode /* mode */ = ROOT::kConversionMatch) const {return 0;}
0413    virtual Bool_t ClassInfo_HasDefaultConstructor(ClassInfo_t * /* info */, Bool_t = kFALSE) const {return kFALSE;}
0414    virtual Bool_t ClassInfo_HasMethod(ClassInfo_t * /* info */, const char * /* name */) const {return kFALSE;}
0415    virtual void   ClassInfo_Init(ClassInfo_t * /* info */, const char * /* funcname */) const {}
0416    virtual void   ClassInfo_Init(ClassInfo_t * /* info */, int /* tagnum */) const {}
0417    virtual Bool_t ClassInfo_IsBase(ClassInfo_t * /* info */, const char * /* name */) const {return 0;}
0418    virtual Bool_t ClassInfo_IsEnum(const char * /* name */) const {return 0;}
0419    virtual Bool_t ClassInfo_IsScopedEnum(ClassInfo_t * /* info */) const {return 0;}
0420    virtual EDataType ClassInfo_GetUnderlyingType(ClassInfo_t * /* info */) const {return kNumDataTypes;}
0421    virtual Bool_t ClassInfo_IsLoaded(ClassInfo_t * /* info */) const {return 0;}
0422    virtual Bool_t ClassInfo_IsValid(ClassInfo_t * /* info */) const {return 0;}
0423    virtual Bool_t ClassInfo_IsValidMethod(ClassInfo_t * /* info */, const char * /* method */,const char * /* proto */, Longptr_t * /* offset */, ROOT::EFunctionMatchMode /* mode */ = ROOT::kConversionMatch) const {return 0;}
0424    virtual Bool_t ClassInfo_IsValidMethod(ClassInfo_t * /* info */, const char * /* method */,const char * /* proto */, Bool_t /* objectIsConst */, Longptr_t * /* offset */, ROOT::EFunctionMatchMode /* mode */ = ROOT::kConversionMatch) const {return 0;}
0425    virtual int    ClassInfo_Next(ClassInfo_t * /* info */) const {return 0;}
0426    virtual void  *ClassInfo_New(ClassInfo_t * /* info */) const {return nullptr;}
0427    virtual void  *ClassInfo_New(ClassInfo_t * /* info */, int /* n */) const {return nullptr;}
0428    virtual void  *ClassInfo_New(ClassInfo_t * /* info */, int /* n */, void * /* arena */) const {return nullptr;}
0429    virtual void  *ClassInfo_New(ClassInfo_t * /* info */, void * /* arena */) const {return nullptr;}
0430    virtual Long_t ClassInfo_Property(ClassInfo_t * /* info */) const {return 0;}
0431    virtual int    ClassInfo_Size(ClassInfo_t * /* info */) const {return 0;}
0432    virtual Longptr_t ClassInfo_Tagnum(ClassInfo_t * /* info */) const {return 0;}
0433    virtual const char *ClassInfo_FileName(ClassInfo_t * /* info */) const {return nullptr;}
0434    virtual const char *ClassInfo_FullName(ClassInfo_t * /* info */) const {return nullptr;}
0435    virtual const char *ClassInfo_Name(ClassInfo_t * /* info */) const {return nullptr;}
0436    virtual const char *ClassInfo_Title(ClassInfo_t * /* info */) const {return nullptr;}
0437    virtual const char *ClassInfo_TmpltName(ClassInfo_t * /* info */) const {return nullptr;}
0438 
0439 
0440    // BaseClassInfo interface
0441    virtual void   BaseClassInfo_Delete(BaseClassInfo_t * /* bcinfo */) const {}
0442    virtual BaseClassInfo_t  *BaseClassInfo_Factory(ClassInfo_t * /* info */) const {return nullptr;}
0443    virtual BaseClassInfo_t  *BaseClassInfo_Factory(ClassInfo_t* /* derived */,
0444                                                    ClassInfo_t* /* base */) const {return nullptr;}
0445    virtual int    BaseClassInfo_Next(BaseClassInfo_t * /* bcinfo */) const {return 0;}
0446    virtual int    BaseClassInfo_Next(BaseClassInfo_t * /* bcinfo */, int  /* onlyDirect */) const {return 0;}
0447    virtual Longptr_t BaseClassInfo_Offset(BaseClassInfo_t * /* toBaseClassInfo */, void* /* address */ = nullptr /*default for non-virtual*/, bool /*isderived*/ = true /*default for non-virtual*/) const {return 0;}
0448    virtual Long_t BaseClassInfo_Property(BaseClassInfo_t * /* bcinfo */) const {return 0;}
0449    virtual Longptr_t BaseClassInfo_Tagnum(BaseClassInfo_t * /* bcinfo */) const {return 0;}
0450    virtual ClassInfo_t*BaseClassInfo_ClassInfo(BaseClassInfo_t * /* bcinfo */) const = 0;
0451    virtual const char *BaseClassInfo_FullName(BaseClassInfo_t * /* bcinfo */) const {return nullptr;}
0452    virtual const char *BaseClassInfo_Name(BaseClassInfo_t * /* bcinfo */) const {return nullptr;}
0453    virtual const char *BaseClassInfo_TmpltName(BaseClassInfo_t * /* bcinfo */) const {return nullptr;}
0454 
0455    // DataMemberInfo interface
0456    virtual int    DataMemberInfo_ArrayDim(DataMemberInfo_t * /* dminfo */) const {return 0;}
0457    virtual void   DataMemberInfo_Delete(DataMemberInfo_t * /* dminfo */) const {}
0458    virtual DataMemberInfo_t  *DataMemberInfo_Factory(ClassInfo_t * /* clinfo */, TDictionary::EMemberSelection /*selection*/) const {return nullptr;}
0459    virtual DataMemberInfo_t  *DataMemberInfo_Factory(DeclId_t declid, ClassInfo_t* clinfo) const = 0;
0460    virtual DataMemberInfo_t  *DataMemberInfo_FactoryCopy(DataMemberInfo_t * /* dminfo */) const {return nullptr;}
0461    virtual Bool_t DataMemberInfo_IsValid(DataMemberInfo_t * /* dminfo */) const {return 0;}
0462    virtual int    DataMemberInfo_MaxIndex(DataMemberInfo_t * /* dminfo */, Int_t  /* dim */) const {return 0;}
0463    virtual int    DataMemberInfo_Next(DataMemberInfo_t * /* dminfo */) const {return 0;}
0464    virtual Longptr_t DataMemberInfo_Offset(DataMemberInfo_t * /* dminfo */) const {return 0;}
0465    virtual Long_t DataMemberInfo_Property(DataMemberInfo_t * /* dminfo */) const {return 0;}
0466    virtual Long_t DataMemberInfo_TypeProperty(DataMemberInfo_t * /* dminfo */) const {return 0;}
0467    virtual int    DataMemberInfo_TypeSize(DataMemberInfo_t * /* dminfo */) const {return 0;}
0468    virtual const char *DataMemberInfo_TypeName(DataMemberInfo_t * /* dminfo */) const {return nullptr;}
0469    virtual const char *DataMemberInfo_TypeTrueName(DataMemberInfo_t * /* dminfo */) const {return nullptr;}
0470    virtual const char *DataMemberInfo_Name(DataMemberInfo_t * /* dminfo */) const {return nullptr;}
0471    virtual const char *DataMemberInfo_Title(DataMemberInfo_t * /* dminfo */) const {return nullptr;}
0472    virtual const char *DataMemberInfo_ValidArrayIndex(DataMemberInfo_t * /* dminfo */) const {return nullptr;}
0473 
0474    // Function Template interface
0475    virtual void   FuncTempInfo_Delete(FuncTempInfo_t * /* ft_info */) const = 0;
0476    virtual FuncTempInfo_t  *FuncTempInfo_Factory(DeclId_t declid) const = 0;
0477    virtual FuncTempInfo_t  *FuncTempInfo_FactoryCopy(FuncTempInfo_t * /* ft_info */) const = 0;
0478    virtual Bool_t FuncTempInfo_IsValid(FuncTempInfo_t * /* ft_info */) const = 0;
0479    virtual UInt_t FuncTempInfo_TemplateNargs(FuncTempInfo_t * /* ft_info */) const = 0;
0480    virtual UInt_t FuncTempInfo_TemplateMinReqArgs(FuncTempInfo_t * /* ft_info */) const = 0;
0481    virtual Long_t FuncTempInfo_Property(FuncTempInfo_t * /* ft_info */) const = 0;
0482    virtual Long_t FuncTempInfo_ExtraProperty(FuncTempInfo_t * /* ft_info */) const = 0;
0483    virtual void FuncTempInfo_Name(FuncTempInfo_t * /* ft_info */, TString &name) const = 0;
0484    virtual void FuncTempInfo_Title(FuncTempInfo_t * /* ft_info */, TString &title) const = 0;
0485 
0486    // MethodInfo interface
0487    virtual void   MethodInfo_CreateSignature(MethodInfo_t * /* minfo */, TString & /* signature */) const {}
0488    virtual void   MethodInfo_Delete(MethodInfo_t * /* minfo */) const {}
0489    virtual MethodInfo_t  *MethodInfo_Factory() const {return nullptr;}
0490    virtual MethodInfo_t  *MethodInfo_Factory(ClassInfo_t * /*clinfo*/) const {return nullptr;}
0491    virtual MethodInfo_t  *MethodInfo_Factory(DeclId_t declid) const = 0;
0492    virtual MethodInfo_t  *MethodInfo_FactoryCopy(MethodInfo_t * /* minfo */) const {return nullptr;}
0493    virtual void  *MethodInfo_InterfaceMethod(MethodInfo_t * /* minfo */) const {return nullptr;}
0494    virtual Bool_t MethodInfo_IsValid(MethodInfo_t * /* minfo */) const {return 0;}
0495    virtual int    MethodInfo_NArg(MethodInfo_t * /* minfo */) const {return 0;}
0496    virtual int    MethodInfo_NDefaultArg(MethodInfo_t * /* minfo */) const {return 0;}
0497    virtual int    MethodInfo_Next(MethodInfo_t * /* minfo */) const {return 0;}
0498    virtual Long_t MethodInfo_Property(MethodInfo_t * /* minfo */) const = 0;
0499    virtual Long_t MethodInfo_ExtraProperty(MethodInfo_t * /* minfo */) const = 0;
0500    virtual TypeInfo_t  *MethodInfo_Type(MethodInfo_t * /* minfo */) const {return nullptr;}
0501    virtual EReturnType MethodInfo_MethodCallReturnType(MethodInfo_t* minfo) const = 0;
0502    virtual const char *MethodInfo_GetMangledName(MethodInfo_t * /* minfo */) const {return nullptr;}
0503    virtual const char *MethodInfo_GetPrototype(MethodInfo_t * /* minfo */) const {return nullptr;}
0504    virtual const char *MethodInfo_Name(MethodInfo_t * /* minfo */) const {return nullptr;}
0505    virtual const char *MethodInfo_TypeName(MethodInfo_t * /* minfo */) const {return nullptr;}
0506    virtual std::string MethodInfo_TypeNormalizedName(MethodInfo_t * /* minfo */) const {return "";}
0507    virtual const char *MethodInfo_Title(MethodInfo_t * /* minfo */) const {return nullptr;}
0508 
0509    // MethodArgInfo interface
0510    virtual void   MethodArgInfo_Delete(MethodArgInfo_t * /* marginfo */) const {}
0511    virtual MethodArgInfo_t  *MethodArgInfo_Factory() const {return nullptr;}
0512    virtual MethodArgInfo_t  *MethodArgInfo_Factory(MethodInfo_t * /*minfo*/) const {return nullptr;}
0513    virtual MethodArgInfo_t  *MethodArgInfo_FactoryCopy(MethodArgInfo_t * /* marginfo */) const {return nullptr;}
0514    virtual Bool_t MethodArgInfo_IsValid(MethodArgInfo_t * /* marginfo */) const {return 0;}
0515    virtual int    MethodArgInfo_Next(MethodArgInfo_t * /* marginfo */) const {return 0;}
0516    virtual Long_t MethodArgInfo_Property(MethodArgInfo_t * /* marginfo */) const {return 0;}
0517    virtual const char *MethodArgInfo_DefaultValue(MethodArgInfo_t * /* marginfo */) const {return nullptr;}
0518    virtual const char *MethodArgInfo_Name(MethodArgInfo_t * /* marginfo */) const {return nullptr;}
0519    virtual const char *MethodArgInfo_TypeName(MethodArgInfo_t * /* marginfo */) const {return nullptr;}
0520    virtual std::string MethodArgInfo_TypeNormalizedName(MethodArgInfo_t * /* marginfo */) const = 0;
0521    virtual TypeInfo_t *MethodArgInfo_TypeInfo(MethodArgInfo_t * /* marginfo */) const {return nullptr;}
0522 
0523 
0524    // TypeInfo interface
0525    virtual void    TypeInfo_Delete(TypeInfo_t * /* tinfo */) const {}
0526    virtual TypeInfo_t *TypeInfo_Factory() const {return nullptr;}
0527    virtual TypeInfo_t *TypeInfo_Factory(const char* /* name */) const {return nullptr;}
0528    virtual TypeInfo_t *TypeInfo_FactoryCopy(TypeInfo_t * /* tinfo */) const {return nullptr;}
0529    virtual void   TypeInfo_Init(TypeInfo_t * /* tinfo */, const char * /* funcname */) const {}
0530    virtual Bool_t TypeInfo_IsValid(TypeInfo_t * /* tinfo */) const {return 0;}
0531    virtual const char *TypeInfo_Name(TypeInfo_t * /* info */) const {return nullptr;}
0532    virtual Long_t TypeInfo_Property(TypeInfo_t * /* tinfo */) const {return 0;}
0533    virtual int    TypeInfo_RefType(TypeInfo_t * /* tinfo */) const {return 0;}
0534    virtual int    TypeInfo_Size(TypeInfo_t * /* tinfo */) const {return 0;}
0535    virtual const char *TypeInfo_TrueName(TypeInfo_t * /* tinfo */) const {return nullptr;}
0536    virtual void  *TypeInfo_QualTypePtr(TypeInfo_t * /* tinfo */) const {return nullptr;}
0537 
0538 
0539    // TypedefInfo interface
0540    virtual void   TypedefInfo_Delete(TypedefInfo_t * /* tinfo */) const {}
0541    virtual TypedefInfo_t  *TypedefInfo_Factory() const {return nullptr;}
0542    virtual TypedefInfo_t  *TypedefInfo_Factory(const char *) const {return nullptr;}
0543    virtual TypedefInfo_t  *TypedefInfo_FactoryCopy(TypedefInfo_t * /* tinfo */) const {return nullptr;}
0544    virtual void   TypedefInfo_Init(TypedefInfo_t * /* tinfo */, const char * /* funcname */) const {}
0545    virtual Bool_t TypedefInfo_IsValid(TypedefInfo_t * /* tinfo */) const {return 0;}
0546    virtual int    TypedefInfo_Next(TypedefInfo_t* /*tinfo*/) const {return 0;}
0547    virtual Long_t TypedefInfo_Property(TypedefInfo_t * /* tinfo */) const {return 0;}
0548    virtual int    TypedefInfo_Size(TypedefInfo_t * /* tinfo */) const {return 0;}
0549    virtual const char *TypedefInfo_TrueName(TypedefInfo_t * /* tinfo */) const {return nullptr;}
0550    virtual const char *TypedefInfo_Name(TypedefInfo_t * /* tinfo */) const {return nullptr;}
0551    virtual const char *TypedefInfo_Title(TypedefInfo_t * /* tinfo */) const {return nullptr;}
0552 
0553    // QualType Opaque Ptr interface
0554    virtual Bool_t IsSameType(const void * /* QualTypePtr1 */, const void * /* QualTypePtr2 */) const {return 0;}
0555    virtual Bool_t IsIntegerType(const void * /* QualTypePtr */) const {return 0;}
0556    virtual Bool_t IsSignedIntegerType(const void * /* QualTypePtr */) const {return 0;}
0557    virtual Bool_t IsUnsignedIntegerType(const void * /* QualTypePtr */) const {return 0;}
0558    virtual Bool_t IsFloatingType(const void * /* QualTypePtr */) const {return 0;}
0559    virtual Bool_t IsPointerType(const void * /* QualTypePtr */) const {return 0;}
0560    virtual Bool_t IsVoidPointerType(const void * /* QualTypePtr */) const {return 0;}
0561 
0562    static TInterpreter *Instance();
0563 
0564    ClassDefOverride(TInterpreter,0)  //ABC defining interface to generic interpreter
0565 };
0566 
0567 
0568 typedef TInterpreter *CreateInterpreter_t(void* shlibHandle, const char* argv[]);
0569 typedef void *DestroyInterpreter_t(TInterpreter*);
0570 
0571 #define gInterpreter (TInterpreter::Instance())
0572 R__EXTERN TInterpreter* gCling;
0573 
0574 inline ROOT::Internal::InterpreterMutexRegistrationRAII::InterpreterMutexRegistrationRAII(TVirtualMutex* mutex):
0575    fLockGuard(mutex)
0576 {
0577    if (gCoreMutex)
0578       ::gCling->SnapshotMutexState(gCoreMutex);
0579 }
0580 inline ROOT::Internal::InterpreterMutexRegistrationRAII::~InterpreterMutexRegistrationRAII()
0581 {
0582    if (gCoreMutex)
0583       ::gCling->ForgetMutexState();
0584 }
0585 
0586 #endif