Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TInterpreter.h
Go to the documentation of this file.
1 // @(#)root/meta:$Id$
2 // Author: Fons Rademakers 01/03/96
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 
13 #ifndef ROOT_TInterpreter
14 #define ROOT_TInterpreter
15 
16 //////////////////////////////////////////////////////////////////////////
17 // //
18 // TInterpreter //
19 // //
20 // This class defines an abstract interface to a generic command line //
21 // interpreter. //
22 // //
23 //////////////////////////////////////////////////////////////////////////
24 
25 #include "TDataType.h"
26 #include "TDictionary.h"
27 #include "TInterpreterValue.h"
28 #include "TVirtualRWMutex.h"
29 
30 #include <map>
31 #include <typeinfo>
32 #include <vector>
33 
34 class TClass;
35 class TEnv;
36 class TFunction;
37 class TMethod;
38 class TObjArray;
39 class TEnum;
40 class TListOfEnums;
41 
42 R__EXTERN TVirtualMutex *gInterpreterMutex;
43 
44 #if defined (_REENTRANT) || defined (WIN32)
45 # define R__LOCKGUARD_CLING(mutex) ::ROOT::Internal::InterpreterMutexRegistrationRAII _R__UNIQUE_(R__guard)(mutex); { }
46 #else
47 # define R__LOCKGUARD_CLING(mutex) (void)(mutex); { }
48 #endif
49 
50 namespace ROOT {
51 namespace Internal {
52 struct InterpreterMutexRegistrationRAII {
53  TLockGuard fLockGuard;
54  InterpreterMutexRegistrationRAII(TVirtualMutex* mutex);
55  ~InterpreterMutexRegistrationRAII();
56 };
57 }
58 }
59 
60 class TInterpreter : public TNamed {
61 
62 protected:
63  virtual void Execute(TMethod *method, TObjArray *params, int *error = 0) = 0;
64  virtual Bool_t SetSuspendAutoParsing(Bool_t value) = 0;
65 
66  friend class SuspendAutoParsing;
67 
68 public:
69  // See as in TSchemaType.h.
70  typedef class std::map<std::string, std::string> MembersMap_t;
71 
72  enum EErrorCode {
73  kNoError = 0,
74  kRecoverable = 1,
75  kDangerous = 2,
76  kFatal = 3,
77  kProcessing = 99
78  };
79 
80  enum class EReturnType { kLong, kDouble, kString, kOther, kNoReturnType };
81 
82  struct CallFuncIFacePtr_t {
83  enum EKind {
84  kUninitialized,
85  kGeneric,
86  kCtor,
87  kDtor
88  };
89 
90  typedef void (*Generic_t)(void*, int, void**, void*);
91  typedef void (*Ctor_t)(void**, void*, unsigned long);
92  typedef void (*Dtor_t)(void*, unsigned long, int);
93 
94  CallFuncIFacePtr_t():
95  fKind(kUninitialized), fGeneric(0) {}
96  CallFuncIFacePtr_t(Generic_t func):
97  fKind(kGeneric), fGeneric(func) {}
98  CallFuncIFacePtr_t(Ctor_t func):
99  fKind(kCtor), fCtor(func) {}
100  CallFuncIFacePtr_t(Dtor_t func):
101  fKind(kDtor), fDtor(func) {}
102 
103  EKind fKind;
104  union {
105  Generic_t fGeneric;
106  Ctor_t fCtor;
107  Dtor_t fDtor;
108  };
109  };
110 
111  class SuspendAutoParsing {
112  TInterpreter *fInterp;
113  Bool_t fPrevious;
114  public:
115  SuspendAutoParsing(TInterpreter *where, Bool_t value = kTRUE) : fInterp(where), fPrevious(fInterp->SetSuspendAutoParsing(value)) {}
116  ~SuspendAutoParsing() { fInterp->SetSuspendAutoParsing(fPrevious); }
117  };
118  virtual Bool_t IsAutoParsingSuspended() const = 0;
119 
120  class SuspendAutoloadingRAII {
121  TInterpreter *fInterp = nullptr;
122  bool fOldValue;
123 
124  public:
125  SuspendAutoloadingRAII(TInterpreter *interp) : fInterp(interp)
126  {
127  fOldValue = fInterp->SetClassAutoloading(false);
128  }
129  ~SuspendAutoloadingRAII() { fInterp->SetClassAutoloading(fOldValue); }
130  };
131 
132  typedef int (*AutoLoadCallBack_t)(const char*);
133  typedef std::vector<std::pair<std::string, int> > FwdDeclArgsToKeepCollection_t;
134 
135  TInterpreter() { } // for Dictionary
136  TInterpreter(const char *name, const char *title = "Generic Interpreter");
137  virtual ~TInterpreter() { }
138 
139  virtual void AddIncludePath(const char *path) = 0;
140  virtual void *SetAutoLoadCallBack(void* /*cb*/) { return 0; }
141  virtual void *GetAutoLoadCallBack() const { return 0; }
142  virtual Int_t AutoLoad(const char *classname, Bool_t knowDictNotLoaded = kFALSE) = 0;
143  virtual Int_t AutoLoad(const std::type_info& typeinfo, Bool_t knowDictNotLoaded = kFALSE) = 0;
144  virtual Int_t AutoParse(const char* cls) = 0;
145  virtual void ClearFileBusy() = 0;
146  virtual void ClearStack() = 0; // Delete existing temporary values
147  virtual Bool_t Declare(const char* code) = 0;
148  virtual void EnableAutoLoading() = 0;
149  virtual void EndOfLineAction() = 0;
150  virtual TClass *GetClass(const std::type_info& typeinfo, Bool_t load) const = 0;
151  virtual Int_t GetExitCode() const = 0;
152  virtual TEnv *GetMapfile() const { return 0; }
153  virtual Int_t GetMore() const = 0;
154  virtual TClass *GenerateTClass(const char *classname, Bool_t emulation, Bool_t silent = kFALSE) = 0;
155  virtual TClass *GenerateTClass(ClassInfo_t *classinfo, Bool_t silent = kFALSE) = 0;
156  virtual Int_t GenerateDictionary(const char *classes, const char *includes = 0, const char *options = 0) = 0;
157  virtual char *GetPrompt() = 0;
158  virtual const char *GetSharedLibs() = 0;
159  virtual const char *GetClassSharedLibs(const char *cls) = 0;
160  virtual const char *GetSharedLibDeps(const char *lib, bool tryDyld = false) = 0;
161  virtual const char *GetIncludePath() = 0;
162  virtual const char *GetSTLIncludePath() const { return ""; }
163  virtual TObjArray *GetRootMapFiles() const = 0;
164  virtual void Initialize() = 0;
165  virtual void ShutDown() = 0;
166  virtual void InspectMembers(TMemberInspector&, const void* obj, const TClass* cl, Bool_t isTransient) = 0;
167  virtual Bool_t IsLoaded(const char *filename) const = 0;
168  virtual Bool_t IsLibraryLoaded(const char *libname) const = 0;
169  virtual Bool_t HasPCMForLibrary(const char *libname) const = 0;
170  virtual Int_t Load(const char *filenam, Bool_t system = kFALSE) = 0;
171  virtual void LoadMacro(const char *filename, EErrorCode *error = 0) = 0;
172  virtual Int_t LoadLibraryMap(const char *rootmapfile = 0) = 0;
173  virtual Int_t RescanLibraryMap() = 0;
174  virtual Int_t ReloadAllSharedLibraryMaps() = 0;
175  virtual Int_t UnloadAllSharedLibraryMaps() = 0;
176  virtual Int_t UnloadLibraryMap(const char *library) = 0;
177  virtual Long_t ProcessLine(const char *line, EErrorCode *error = 0) = 0;
178  virtual Long_t ProcessLineSynch(const char *line, EErrorCode *error = 0) = 0;
179  virtual void PrintIntro() = 0;
180  virtual bool RegisterPrebuiltModulePath(const std::string& FullPath,
181  const std::string& ModuleMapName = "module.modulemap") const = 0;
182  virtual void RegisterModule(const char* /*modulename*/,
183  const char** /*headers*/,
184  const char** /*includePaths*/,
185  const char* /*payloadCode*/,
186  const char* /*fwdDeclsCode*/,
187  void (* /*triggerFunc*/)(),
188  const FwdDeclArgsToKeepCollection_t& fwdDeclArgsToKeep,
189  const char** classesHeaders,
190  Bool_t lateRegistration = false,
191  Bool_t hasCxxModule = false) = 0;
192  virtual void RegisterTClassUpdate(TClass *oldcl,DictFuncPtr_t dict) = 0;
193  virtual void UnRegisterTClassUpdate(const TClass *oldcl) = 0;
194  virtual Int_t SetClassSharedLibs(const char *cls, const char *libs) = 0;
195  virtual void SetGetline(const char*(*getlineFunc)(const char* prompt),
196  void (*histaddFunc)(const char* line)) = 0;
197  virtual void Reset() = 0;
198  virtual void ResetAll() = 0;
199  virtual void ResetGlobals() = 0;
200  virtual void ResetGlobalVar(void *obj) = 0;
201  virtual void RewindDictionary() = 0;
202  virtual Int_t DeleteGlobal(void *obj) = 0;
203  virtual Int_t DeleteVariable(const char* name) = 0;
204  virtual void SaveContext() = 0;
205  virtual void SaveGlobalsContext() = 0;
206  virtual void UpdateListOfGlobals() = 0;
207  virtual void UpdateListOfGlobalFunctions() = 0;
208  virtual void UpdateListOfTypes() = 0;
209  virtual void SetClassInfo(TClass *cl, Bool_t reload = kFALSE) = 0;
210 
211  enum ECheckClassInfo {
212  kUnknown = 0, // backward compatible with false
213  kKnown = 1,
214  kWithClassDefInline = 2
215  };
216  virtual ECheckClassInfo CheckClassInfo(const char *name, Bool_t autoload, Bool_t isClassOrNamespaceOnly = kFALSE) = 0;
217 
218  virtual Bool_t CheckClassTemplate(const char *name) = 0;
219  virtual Long_t Calc(const char *line, EErrorCode* error = 0) = 0;
220  virtual void CreateListOfBaseClasses(TClass *cl) const = 0;
221  virtual void CreateListOfDataMembers(TClass *cl) const = 0;
222  virtual void CreateListOfMethods(TClass *cl) const = 0;
223  virtual void CreateListOfMethodArgs(TFunction *m) const = 0;
224  virtual void UpdateListOfMethods(TClass *cl) const = 0;
225  virtual TString GetMangledName(TClass *cl, const char *method, const char *params, Bool_t objectIsConst = kFALSE) = 0;
226  virtual TString GetMangledNameWithPrototype(TClass *cl, const char *method, const char *proto, Bool_t objectIsConst = kFALSE, ROOT::EFunctionMatchMode /* mode */ = ROOT::kConversionMatch) = 0;
227  virtual void GetInterpreterTypeName(const char *name, std::string &output, Bool_t full = kFALSE) = 0;
228  virtual void *GetInterfaceMethod(TClass *cl, const char *method, const char *params, Bool_t objectIsConst = kFALSE) = 0;
229  virtual void *GetInterfaceMethodWithPrototype(TClass *cl, const char *method, const char *proto, Bool_t objectIsConst = kFALSE, ROOT::EFunctionMatchMode /* mode */ = ROOT::kConversionMatch) = 0;
230  virtual void Execute(const char *function, const char *params, int *error = 0) = 0;
231  virtual void Execute(TObject *obj, TClass *cl, const char *method, const char *params, int *error = 0) = 0;
232  virtual void Execute(TObject *obj, TClass *cl, TMethod *method, TObjArray *params, int *error = 0) = 0;
233  virtual void ExecuteWithArgsAndReturn(TMethod *method, void* address, const void* args[] = 0, int /*nargs*/ = 0, void* ret= 0) const = 0;
234  virtual Long_t ExecuteMacro(const char *filename, EErrorCode *error = 0) = 0;
235  virtual Bool_t IsErrorMessagesEnabled() const = 0;
236  virtual Bool_t SetErrorMessages(Bool_t enable = kTRUE) = 0;
237  virtual Bool_t IsProcessLineLocked() const = 0;
238  virtual void SetProcessLineLock(Bool_t lock = kTRUE) = 0;
239  virtual const char *TypeName(const char *s) = 0;
240  virtual std::string ToString(const char *type, void *obj) = 0;
241 
242  virtual void SnapshotMutexState(ROOT::TVirtualRWMutex* mtx) = 0;
243  virtual void ForgetMutexState() = 0;
244 
245  // All the functions below must be virtual with a dummy implementation
246  // These functions are redefined in TCling.
247 
248  // Misc
249  virtual int DisplayClass(FILE * /* fout */,const char * /* name */,int /* base */,int /* start */) const {return 0;}
250  virtual int DisplayIncludePath(FILE * /* fout */) const {return 0;}
251  virtual void *FindSym(const char * /* entry */) const {return 0;}
252  virtual void GenericError(const char * /* error */) const {;}
253  virtual Long_t GetExecByteCode() const {return 0;}
254  virtual const char *GetTopLevelMacroName() const {return 0;};
255  virtual const char *GetCurrentMacroName() const {return 0;};
256  virtual int GetSecurityError() const{return 0;}
257  virtual int LoadFile(const char * /* path */) const {return 0;}
258  virtual Bool_t LoadText(const char * /* text */) const {return kFALSE;}
259  virtual const char *MapCppName(const char*) const {return 0;}
260  virtual void SetAlloclockfunc(void (*)()) const {;}
261  virtual void SetAllocunlockfunc(void (*)()) const {;}
262  virtual int SetClassAutoloading(int) const {return 0;}
263  virtual int SetClassAutoparsing(int) {return 0;};
264  virtual void SetErrmsgcallback(void * /* p */) const {;}
265  virtual void SetTempLevel(int /* val */) const {;}
266  virtual int UnloadFile(const char * /* path */) const {return 0;}
267 
268  /// The created temporary must be deleted by the caller.
269  /// Deprecated! Please use MakeInterpreterValue().
270  TInterpreterValue *CreateTemporary() const {
271  return MakeInterpreterValue().release();
272  }
273  virtual std::unique_ptr<TInterpreterValue> MakeInterpreterValue() const { return 0; }
274  virtual void CodeComplete(const std::string&, size_t&,
275  std::vector<std::string>&) {;}
276  virtual int Evaluate(const char*, TInterpreterValue&) {return 0;}
277 
278  // core/meta helper functions.
279  virtual EReturnType MethodCallReturnType(TFunction *func) const = 0;
280  virtual ULong64_t GetInterpreterStateMarker() const = 0;
281  virtual bool DiagnoseIfInterpreterException(const std::exception &e) const = 0;
282 
283  typedef TDictionary::DeclId_t DeclId_t;
284  virtual DeclId_t GetDeclId(CallFunc_t *info) const = 0;
285  virtual DeclId_t GetDeclId(ClassInfo_t *info) const = 0;
286  virtual DeclId_t GetDeclId(DataMemberInfo_t *info) const = 0;
287  virtual DeclId_t GetDeclId(FuncTempInfo_t *info) const = 0;
288  virtual DeclId_t GetDeclId(MethodInfo_t *info) const = 0;
289  virtual DeclId_t GetDeclId(TypedefInfo_t *info) const = 0;
290 
291  virtual void SetDeclAttr(DeclId_t, const char* /* attribute */) = 0 ;
292 
293  virtual DeclId_t GetDataMember(ClassInfo_t *cl, const char *name) const = 0;
294  virtual DeclId_t GetDataMemberAtAddr(const void *addr) const = 0;
295  virtual DeclId_t GetDataMemberWithValue(const void *ptrvalue) const = 0;
296  virtual DeclId_t GetEnum(TClass *cl, const char *name) const = 0;
297  virtual TEnum* CreateEnum(void *VD, TClass *cl) const = 0;
298  virtual void UpdateEnumConstants(TEnum* enumObj, TClass* cl) const = 0;
299  virtual void LoadEnums(TListOfEnums& cl) const = 0;
300  virtual DeclId_t GetFunction(ClassInfo_t *cl, const char *funcname) = 0;
301  virtual DeclId_t GetFunctionWithPrototype(ClassInfo_t *cl, const char* method, const char* proto, Bool_t objectIsConst = kFALSE, ROOT::EFunctionMatchMode mode = ROOT::kConversionMatch) = 0;
302  virtual DeclId_t GetFunctionWithValues(ClassInfo_t *cl, const char* method, const char* params, Bool_t objectIsConst = kFALSE) = 0;
303  virtual DeclId_t GetFunctionTemplate(ClassInfo_t *cl, const char *funcname) = 0;
304  virtual void GetFunctionOverloads(ClassInfo_t *cl, const char *funcname, std::vector<DeclId_t>& res) const = 0;
305  virtual void LoadFunctionTemplates(TClass* cl) const = 0;
306  virtual std::vector<std::string> GetUsingNamespaces(ClassInfo_t *cl) const = 0;
307 
308  // CallFunc interface
309  virtual void CallFunc_Delete(CallFunc_t * /* func */) const {;}
310  virtual void CallFunc_Exec(CallFunc_t * /* func */, void * /* address */) const {;}
311  virtual void CallFunc_Exec(CallFunc_t * /* func */, void * /* address */, TInterpreterValue& /* val */) const {;}
312  virtual void CallFunc_ExecWithReturn(CallFunc_t * /* func */, void * /* address */, void * /* ret */) const {;}
313  virtual void CallFunc_ExecWithArgsAndReturn(CallFunc_t * /* func */, void * /* address */, const void* /* args */ [] = 0, int /*nargs*/ = 0, void * /* ret */ = 0) const {}
314  virtual Long_t CallFunc_ExecInt(CallFunc_t * /* func */, void * /* address */) const {return 0;}
315  virtual Long64_t CallFunc_ExecInt64(CallFunc_t * /* func */, void * /* address */) const {return 0;}
316  virtual Double_t CallFunc_ExecDouble(CallFunc_t * /* func */, void * /* address */) const {return 0;}
317  virtual CallFunc_t *CallFunc_Factory() const {return 0;}
318  virtual CallFunc_t *CallFunc_FactoryCopy(CallFunc_t * /* func */) const {return 0;}
319  virtual MethodInfo_t *CallFunc_FactoryMethod(CallFunc_t * /* func */) const {return 0;}
320  virtual void CallFunc_IgnoreExtraArgs(CallFunc_t * /*func */, bool /*ignore*/) const {;}
321  virtual void CallFunc_Init(CallFunc_t * /* func */) const {;}
322  virtual Bool_t CallFunc_IsValid(CallFunc_t * /* func */) const {return 0;}
323  virtual CallFuncIFacePtr_t CallFunc_IFacePtr(CallFunc_t * /* func */) const {return CallFuncIFacePtr_t();}
324  virtual void CallFunc_ResetArg(CallFunc_t * /* func */) const {;}
325  virtual void CallFunc_SetArgArray(CallFunc_t * /* func */, Long_t * /* paramArr */, Int_t /* nparam */) const {;}
326  virtual void CallFunc_SetArgs(CallFunc_t * /* func */, const char * /* param */) const {;}
327 
328  virtual void CallFunc_SetArg(CallFunc_t * /*func */, Long_t /* param */) const = 0;
329  virtual void CallFunc_SetArg(CallFunc_t * /*func */, ULong_t /* param */) const = 0;
330  virtual void CallFunc_SetArg(CallFunc_t * /* func */, Float_t /* param */) const = 0;
331  virtual void CallFunc_SetArg(CallFunc_t * /* func */, Double_t /* param */) const = 0;
332  virtual void CallFunc_SetArg(CallFunc_t * /* func */, Long64_t /* param */) const = 0;
333  virtual void CallFunc_SetArg(CallFunc_t * /* func */, ULong64_t /* param */) const = 0;
334 
335  void CallFunc_SetArg(CallFunc_t * func, Char_t param) const { CallFunc_SetArg(func,(Long_t)param); }
336  void CallFunc_SetArg(CallFunc_t * func, Short_t param) const { CallFunc_SetArg(func,(Long_t)param); }
337  void CallFunc_SetArg(CallFunc_t * func, Int_t param) const { CallFunc_SetArg(func,(Long_t)param); }
338 
339  void CallFunc_SetArg(CallFunc_t * func, UChar_t param) const { CallFunc_SetArg(func,(ULong_t)param); }
340  void CallFunc_SetArg(CallFunc_t * func, UShort_t param) const { CallFunc_SetArg(func,(ULong_t)param); }
341  void CallFunc_SetArg(CallFunc_t * func, UInt_t param) const { CallFunc_SetArg(func,(ULong_t)param); }
342 
343  template <typename T>
344  void CallFunc_SetArgRef(CallFunc_t * func, T &param) const { CallFunc_SetArg(func,(ULong_t)&param); }
345 
346  void CallFunc_SetArg(CallFunc_t *func, void *arg)
347  {
348  CallFunc_SetArg(func,(Long_t) arg);
349  }
350 
351  template <typename T>
352  void CallFunc_SetArg(CallFunc_t *func, const T *arg)
353  {
354  CallFunc_SetArg(func,(Long_t) arg);
355  }
356 
357  void CallFunc_SetArgImpl(CallFunc_t * /* func */)
358  {
359  }
360 
361  template <typename U>
362  void CallFunc_SetArgImpl(CallFunc_t *func, const U& head)
363  {
364  CallFunc_SetArg(func, head);
365  }
366 
367  template <typename U, typename... T>
368  void CallFunc_SetArgImpl(CallFunc_t *func, const U& head, const T&... tail)
369  {
370  CallFunc_SetArg(func, head);
371  CallFunc_SetArgImpl(func, tail...);
372  }
373 
374  template <typename... T>
375  void CallFunc_SetArguments(CallFunc_t *func, const T&... args)
376  {
377  R__LOCKGUARD(gInterpreterMutex);
378 
379  CallFunc_ResetArg(func);
380  CallFunc_SetArgImpl(func,args...);
381  }
382 
383  virtual void CallFunc_SetFunc(CallFunc_t * /* func */, ClassInfo_t * /* info */, const char * /* method */, const char * /* params */, bool /* objectIsConst */, Long_t * /* Offset */) const {;}
384  virtual void CallFunc_SetFunc(CallFunc_t * /* func */, ClassInfo_t * /* info */, const char * /* method */, const char * /* params */, Long_t * /* Offset */) const {;}
385  virtual void CallFunc_SetFunc(CallFunc_t * /* func */, MethodInfo_t * /* info */) const {;}
386  virtual void CallFunc_SetFuncProto(CallFunc_t * /* func */, ClassInfo_t * /* info */, const char * /* method */, const char * /* proto */, Long_t * /* Offset */, ROOT::EFunctionMatchMode /* mode */ = ROOT::kConversionMatch) const {;}
387  virtual void CallFunc_SetFuncProto(CallFunc_t * /* func */, ClassInfo_t * /* info */, const char * /* method */, const char * /* proto */, bool /* objectIsConst */, Long_t * /* Offset */, ROOT::EFunctionMatchMode /* mode */ = ROOT::kConversionMatch) const {;}
388  virtual void CallFunc_SetFuncProto(CallFunc_t* func, ClassInfo_t* info, const char* method, const std::vector<TypeInfo_t*> &proto, Long_t* Offset, ROOT::EFunctionMatchMode mode = ROOT::kConversionMatch) const = 0;
389  virtual void CallFunc_SetFuncProto(CallFunc_t* func, ClassInfo_t* info, const char* method, const std::vector<TypeInfo_t*> &proto, bool objectIsConst, Long_t* Offset, ROOT::EFunctionMatchMode mode = ROOT::kConversionMatch) const = 0;
390 
391  virtual std::string CallFunc_GetWrapperCode(CallFunc_t *func) const = 0;
392 
393  // ClassInfo interface
394  virtual Bool_t ClassInfo_Contains(ClassInfo_t *info, DeclId_t decl) const = 0;
395  virtual Long_t ClassInfo_ClassProperty(ClassInfo_t * /* info */) const {return 0;}
396  virtual void ClassInfo_Delete(ClassInfo_t * /* info */) const {;}
397  virtual void ClassInfo_Delete(ClassInfo_t * /* info */, void * /* arena */) const {;}
398  virtual void ClassInfo_DeleteArray(ClassInfo_t * /* info */, void * /* arena */, bool /* dtorOnly */) const {;}
399  virtual void ClassInfo_Destruct(ClassInfo_t * /* info */, void * /* arena */) const {;}
400  virtual ClassInfo_t *ClassInfo_Factory(Bool_t /*all*/ = kTRUE) const = 0;
401  virtual ClassInfo_t *ClassInfo_Factory(ClassInfo_t * /* cl */) const = 0;
402  virtual ClassInfo_t *ClassInfo_Factory(const char * /* name */) const = 0;
403  virtual ClassInfo_t *ClassInfo_Factory(DeclId_t declid) const = 0;
404  virtual Long_t ClassInfo_GetBaseOffset(ClassInfo_t* /* fromDerived */,
405  ClassInfo_t* /* toBase */, void* /* address */ = 0, bool /*isderived*/ = true) const {return 0;}
406  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;}
407  virtual Bool_t ClassInfo_HasDefaultConstructor(ClassInfo_t * /* info */) const {return 0;}
408  virtual Bool_t ClassInfo_HasMethod(ClassInfo_t * /* info */, const char * /* name */) const {return 0;}
409  virtual void ClassInfo_Init(ClassInfo_t * /* info */, const char * /* funcname */) const {;}
410  virtual void ClassInfo_Init(ClassInfo_t * /* info */, int /* tagnum */) const {;}
411  virtual Bool_t ClassInfo_IsBase(ClassInfo_t * /* info */, const char * /* name */) const {return 0;}
412  virtual Bool_t ClassInfo_IsEnum(const char * /* name */) const {return 0;}
413  virtual Bool_t ClassInfo_IsScopedEnum(ClassInfo_t * /* info */) const {return 0;}
414  virtual EDataType ClassInfo_GetUnderlyingType(ClassInfo_t * /* info */) const {return kNumDataTypes;}
415  virtual Bool_t ClassInfo_IsLoaded(ClassInfo_t * /* info */) const {return 0;}
416  virtual Bool_t ClassInfo_IsValid(ClassInfo_t * /* info */) const {return 0;}
417  virtual Bool_t ClassInfo_IsValidMethod(ClassInfo_t * /* info */, const char * /* method */,const char * /* proto */, Long_t * /* offset */, ROOT::EFunctionMatchMode /* mode */ = ROOT::kConversionMatch) const {return 0;}
418  virtual Bool_t ClassInfo_IsValidMethod(ClassInfo_t * /* info */, const char * /* method */,const char * /* proto */, Bool_t /* objectIsConst */, Long_t * /* offset */, ROOT::EFunctionMatchMode /* mode */ = ROOT::kConversionMatch) const {return 0;}
419  virtual int ClassInfo_Next(ClassInfo_t * /* info */) const {return 0;}
420  virtual void *ClassInfo_New(ClassInfo_t * /* info */) const {return 0;}
421  virtual void *ClassInfo_New(ClassInfo_t * /* info */, int /* n */) const {return 0;}
422  virtual void *ClassInfo_New(ClassInfo_t * /* info */, int /* n */, void * /* arena */) const {return 0;}
423  virtual void *ClassInfo_New(ClassInfo_t * /* info */, void * /* arena */) const {return 0;}
424  virtual Long_t ClassInfo_Property(ClassInfo_t * /* info */) const {return 0;}
425  virtual int ClassInfo_Size(ClassInfo_t * /* info */) const {return 0;}
426  virtual Long_t ClassInfo_Tagnum(ClassInfo_t * /* info */) const {return 0;}
427  virtual const char *ClassInfo_FileName(ClassInfo_t * /* info */) const {return 0;}
428  virtual const char *ClassInfo_FullName(ClassInfo_t * /* info */) const {return 0;}
429  virtual const char *ClassInfo_Name(ClassInfo_t * /* info */) const {return 0;}
430  virtual const char *ClassInfo_Title(ClassInfo_t * /* info */) const {return 0;}
431  virtual const char *ClassInfo_TmpltName(ClassInfo_t * /* info */) const {return 0;}
432 
433 
434  // BaseClassInfo interface
435  virtual void BaseClassInfo_Delete(BaseClassInfo_t * /* bcinfo */) const {;}
436  virtual BaseClassInfo_t *BaseClassInfo_Factory(ClassInfo_t * /* info */) const {return 0;}
437  virtual BaseClassInfo_t *BaseClassInfo_Factory(ClassInfo_t* /* derived */,
438  ClassInfo_t* /* base */) const {return 0;}
439  virtual int BaseClassInfo_Next(BaseClassInfo_t * /* bcinfo */) const {return 0;}
440  virtual int BaseClassInfo_Next(BaseClassInfo_t * /* bcinfo */, int /* onlyDirect */) const {return 0;}
441  virtual Long_t BaseClassInfo_Offset(BaseClassInfo_t * /* toBaseClassInfo */, void* /* address */ = 0 /*default for non-virtual*/, bool /*isderived*/ = true /*default for non-virtual*/) const {return 0;}
442  virtual Long_t BaseClassInfo_Property(BaseClassInfo_t * /* bcinfo */) const {return 0;}
443  virtual Long_t BaseClassInfo_Tagnum(BaseClassInfo_t * /* bcinfo */) const {return 0;}
444  virtual ClassInfo_t*BaseClassInfo_ClassInfo(BaseClassInfo_t * /* bcinfo */) const = 0;
445  virtual const char *BaseClassInfo_FullName(BaseClassInfo_t * /* bcinfo */) const {return 0;}
446  virtual const char *BaseClassInfo_Name(BaseClassInfo_t * /* bcinfo */) const {return 0;}
447  virtual const char *BaseClassInfo_TmpltName(BaseClassInfo_t * /* bcinfo */) const {return 0;}
448 
449  // DataMemberInfo interface
450  virtual int DataMemberInfo_ArrayDim(DataMemberInfo_t * /* dminfo */) const {return 0;}
451  virtual void DataMemberInfo_Delete(DataMemberInfo_t * /* dminfo */) const {;}
452  virtual DataMemberInfo_t *DataMemberInfo_Factory(ClassInfo_t * /* clinfo */ = 0) const {return 0;}
453  virtual DataMemberInfo_t *DataMemberInfo_Factory(DeclId_t declid, ClassInfo_t* clinfo) const = 0;
454  virtual DataMemberInfo_t *DataMemberInfo_FactoryCopy(DataMemberInfo_t * /* dminfo */) const {return 0;}
455  virtual Bool_t DataMemberInfo_IsValid(DataMemberInfo_t * /* dminfo */) const {return 0;}
456  virtual int DataMemberInfo_MaxIndex(DataMemberInfo_t * /* dminfo */, Int_t /* dim */) const {return 0;}
457  virtual int DataMemberInfo_Next(DataMemberInfo_t * /* dminfo */) const {return 0;}
458  virtual Long_t DataMemberInfo_Offset(DataMemberInfo_t * /* dminfo */) const {return 0;}
459  virtual Long_t DataMemberInfo_Property(DataMemberInfo_t * /* dminfo */) const {return 0;}
460  virtual Long_t DataMemberInfo_TypeProperty(DataMemberInfo_t * /* dminfo */) const {return 0;}
461  virtual int DataMemberInfo_TypeSize(DataMemberInfo_t * /* dminfo */) const {return 0;}
462  virtual const char *DataMemberInfo_TypeName(DataMemberInfo_t * /* dminfo */) const {return 0;}
463  virtual const char *DataMemberInfo_TypeTrueName(DataMemberInfo_t * /* dminfo */) const {return 0;}
464  virtual const char *DataMemberInfo_Name(DataMemberInfo_t * /* dminfo */) const {return 0;}
465  virtual const char *DataMemberInfo_Title(DataMemberInfo_t * /* dminfo */) const {return 0;}
466  virtual const char *DataMemberInfo_ValidArrayIndex(DataMemberInfo_t * /* dminfo */) const {return 0;}
467 
468  // Function Template interface
469  virtual void FuncTempInfo_Delete(FuncTempInfo_t * /* ft_info */) const = 0;
470  virtual FuncTempInfo_t *FuncTempInfo_Factory(DeclId_t declid) const = 0;
471  virtual FuncTempInfo_t *FuncTempInfo_FactoryCopy(FuncTempInfo_t * /* ft_info */) const = 0;
472  virtual Bool_t FuncTempInfo_IsValid(FuncTempInfo_t * /* ft_info */) const = 0;
473  virtual UInt_t FuncTempInfo_TemplateNargs(FuncTempInfo_t * /* ft_info */) const = 0;
474  virtual UInt_t FuncTempInfo_TemplateMinReqArgs(FuncTempInfo_t * /* ft_info */) const = 0;
475  virtual Long_t FuncTempInfo_Property(FuncTempInfo_t * /* ft_info */) const = 0;
476  virtual Long_t FuncTempInfo_ExtraProperty(FuncTempInfo_t * /* ft_info */) const = 0;
477  virtual void FuncTempInfo_Name(FuncTempInfo_t * /* ft_info */, TString &name) const = 0;
478  virtual void FuncTempInfo_Title(FuncTempInfo_t * /* ft_info */, TString &title) const = 0;
479 
480  // MethodInfo interface
481  virtual void MethodInfo_CreateSignature(MethodInfo_t * /* minfo */, TString & /* signature */) const {;}
482  virtual void MethodInfo_Delete(MethodInfo_t * /* minfo */) const {;}
483  virtual MethodInfo_t *MethodInfo_Factory() const {return 0;}
484  virtual MethodInfo_t *MethodInfo_Factory(ClassInfo_t * /*clinfo*/) const {return 0;}
485  virtual MethodInfo_t *MethodInfo_Factory(DeclId_t declid) const = 0;
486  virtual MethodInfo_t *MethodInfo_FactoryCopy(MethodInfo_t * /* minfo */) const {return 0;}
487  virtual void *MethodInfo_InterfaceMethod(MethodInfo_t * /* minfo */) const {return 0;}
488  virtual Bool_t MethodInfo_IsValid(MethodInfo_t * /* minfo */) const {return 0;}
489  virtual int MethodInfo_NArg(MethodInfo_t * /* minfo */) const {return 0;}
490  virtual int MethodInfo_NDefaultArg(MethodInfo_t * /* minfo */) const {return 0;}
491  virtual int MethodInfo_Next(MethodInfo_t * /* minfo */) const {return 0;}
492  virtual Long_t MethodInfo_Property(MethodInfo_t * /* minfo */) const = 0;
493  virtual Long_t MethodInfo_ExtraProperty(MethodInfo_t * /* minfo */) const = 0;
494  virtual TypeInfo_t *MethodInfo_Type(MethodInfo_t * /* minfo */) const {return 0;}
495  virtual EReturnType MethodInfo_MethodCallReturnType(MethodInfo_t* minfo) const = 0;
496  virtual const char *MethodInfo_GetMangledName(MethodInfo_t * /* minfo */) const {return 0;}
497  virtual const char *MethodInfo_GetPrototype(MethodInfo_t * /* minfo */) const {return 0;}
498  virtual const char *MethodInfo_Name(MethodInfo_t * /* minfo */) const {return 0;}
499  virtual const char *MethodInfo_TypeName(MethodInfo_t * /* minfo */) const {return 0;}
500  virtual std::string MethodInfo_TypeNormalizedName(MethodInfo_t * /* minfo */) const {return "";}
501  virtual const char *MethodInfo_Title(MethodInfo_t * /* minfo */) const {return 0;}
502 
503  // MethodArgInfo interface
504  virtual void MethodArgInfo_Delete(MethodArgInfo_t * /* marginfo */) const {;}
505  virtual MethodArgInfo_t *MethodArgInfo_Factory() const {return 0;}
506  virtual MethodArgInfo_t *MethodArgInfo_Factory(MethodInfo_t * /*minfo*/) const {return 0;}
507  virtual MethodArgInfo_t *MethodArgInfo_FactoryCopy(MethodArgInfo_t * /* marginfo */) const {return 0;}
508  virtual Bool_t MethodArgInfo_IsValid(MethodArgInfo_t * /* marginfo */) const {return 0;}
509  virtual int MethodArgInfo_Next(MethodArgInfo_t * /* marginfo */) const {return 0;}
510  virtual Long_t MethodArgInfo_Property(MethodArgInfo_t * /* marginfo */) const {return 0;}
511  virtual const char *MethodArgInfo_DefaultValue(MethodArgInfo_t * /* marginfo */) const {return 0;}
512  virtual const char *MethodArgInfo_Name(MethodArgInfo_t * /* marginfo */) const {return 0;}
513  virtual const char *MethodArgInfo_TypeName(MethodArgInfo_t * /* marginfo */) const {return 0;}
514  virtual std::string MethodArgInfo_TypeNormalizedName(MethodArgInfo_t * /* marginfo */) const = 0;
515 
516 
517  // TypeInfo interface
518  virtual void TypeInfo_Delete(TypeInfo_t * /* tinfo */) const {;}
519  virtual TypeInfo_t *TypeInfo_Factory() const {return 0;}
520  virtual TypeInfo_t *TypeInfo_Factory(const char* /* name */) const {return 0;}
521  virtual TypeInfo_t *TypeInfo_FactoryCopy(TypeInfo_t * /* tinfo */) const {return 0;}
522  virtual void TypeInfo_Init(TypeInfo_t * /* tinfo */, const char * /* funcname */) const {;}
523  virtual Bool_t TypeInfo_IsValid(TypeInfo_t * /* tinfo */) const {return 0;}
524  virtual const char *TypeInfo_Name(TypeInfo_t * /* info */) const {return 0;}
525  virtual Long_t TypeInfo_Property(TypeInfo_t * /* tinfo */) const {return 0;}
526  virtual int TypeInfo_RefType(TypeInfo_t * /* tinfo */) const {return 0;}
527  virtual int TypeInfo_Size(TypeInfo_t * /* tinfo */) const {return 0;}
528  virtual const char *TypeInfo_TrueName(TypeInfo_t * /* tinfo */) const {return 0;}
529 
530 
531  // TypedefInfo interface
532  virtual void TypedefInfo_Delete(TypedefInfo_t * /* tinfo */) const {;}
533  virtual TypedefInfo_t *TypedefInfo_Factory() const {return 0;}
534  virtual TypedefInfo_t *TypedefInfo_Factory(const char *) const {return 0;}
535  virtual TypedefInfo_t *TypedefInfo_FactoryCopy(TypedefInfo_t * /* tinfo */) const {return 0;}
536  virtual void TypedefInfo_Init(TypedefInfo_t * /* tinfo */, const char * /* funcname */) const {;}
537  virtual Bool_t TypedefInfo_IsValid(TypedefInfo_t * /* tinfo */) const {return 0;}
538  virtual int TypedefInfo_Next(TypedefInfo_t* /*tinfo*/) const {return 0;}
539  virtual Long_t TypedefInfo_Property(TypedefInfo_t * /* tinfo */) const {return 0;}
540  virtual int TypedefInfo_Size(TypedefInfo_t * /* tinfo */) const {return 0;}
541  virtual const char *TypedefInfo_TrueName(TypedefInfo_t * /* tinfo */) const {return 0;}
542  virtual const char *TypedefInfo_Name(TypedefInfo_t * /* tinfo */) const {return 0;}
543  virtual const char *TypedefInfo_Title(TypedefInfo_t * /* tinfo */) const {return 0;}
544 
545  static TInterpreter *Instance();
546 
547  ClassDef(TInterpreter,0) //ABC defining interface to generic interpreter
548 };
549 
550 
551 typedef TInterpreter *CreateInterpreter_t(void* shlibHandle, const char* argv[]);
552 typedef void *DestroyInterpreter_t(TInterpreter*);
553 
554 #ifndef __CINT__
555 #define gInterpreter (TInterpreter::Instance())
556 R__EXTERN TInterpreter* gCling;
557 #endif
558 
559 inline ROOT::Internal::InterpreterMutexRegistrationRAII::InterpreterMutexRegistrationRAII(TVirtualMutex* mutex):
560  fLockGuard(mutex)
561 {
562  if (gCoreMutex)
563  ::gCling->SnapshotMutexState(gCoreMutex);
564 }
565 inline ROOT::Internal::InterpreterMutexRegistrationRAII::~InterpreterMutexRegistrationRAII()
566 {
567  if (gCoreMutex)
568  ::gCling->ForgetMutexState();
569 }
570 
571 #endif