ROOT logo
// @(#)Root/meta:$Id: TMethodCall.cxx 29701 2009-08-06 15:27:35Z pcanal $
// Author: Fons Rademakers   13/06/96

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TMethodCall                                                          //
//                                                                      //
// Method or function calling interface. Objects of this class contain  //
// the (CINT) environment to call a global function or a method for an  //
// object of a specific class with the desired arguments. This class is //
// espicially useful when a method has to be called more times for      //
// different objects and/or with different arguments. If a function or  //
// method needs to be called only once one better uses                  //
// TInterpreter::Execute().                                             //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TInterpreter.h"
#include "TMethodCall.h"
#include "TMethod.h"
#include "TClass.h"
#include "TROOT.h"
#include "Strlen.h"
#include "TVirtualMutex.h"

ClassImp(TMethodCall)

//______________________________________________________________________________
TMethodCall::TMethodCall()
{
   // Default TMethodCall ctor. Use Init() to initialize the method call
   // environment.

   fFunc     = 0;
   fOffset   = 0;
   fClass    = 0;
   fMetPtr   = 0;
   fMethod   = "";
   fParams   = "";
   fProto    = "";
   fDtorOnly = kFALSE;
   fRetType  = kNone;
}

//______________________________________________________________________________
TMethodCall::TMethodCall(TClass *cl, const char *method, const char *params)
{
   // Create a method invocation environment for a specific class, method and
   // parameters. The parameter string has the form: "\"aap\", 3, 4.35".
   // To execute the method call TMethodCall::Execute(object,...).
   // This two step method is much more efficient than calling for
   // every invocation TInterpreter::Execute(...).

   fFunc = 0;

   Init(cl, method, params);
}

//______________________________________________________________________________
TMethodCall::TMethodCall(const char *function, const char *params)
{
   // Create a global function invocation environment. The parameter
   // string has the form: "\"aap\", 3, 4,35". To execute the
   // function call TMethodCall::Execute(...).
   // This two step method is much more efficient than calling for
   // every invocation TInterpreter::Execute(...).

   fFunc = 0;

   Init(function, params);
}

//______________________________________________________________________________
TMethodCall::TMethodCall(const TMethodCall &orig) : TObject(orig)
{
   // Copy ctor.

   fFunc     = orig.fFunc ? gCint->CallFunc_FactoryCopy(orig.fFunc) : 0;
   fOffset   = orig.fOffset;
   fClass    = orig.fClass;
   fMethod   = orig.fMethod;
   fParams   = orig.fParams;
   fProto    = orig.fProto;
   fDtorOnly = orig.fDtorOnly;
   fRetType  = orig.fRetType;

   fMetPtr = 0;
}

//______________________________________________________________________________
TMethodCall &TMethodCall::operator=(const TMethodCall &rhs)
{
   // Assignement operator.

   if (this != &rhs) {
      gCint->CallFunc_Delete(fFunc);
      fFunc     = rhs.fFunc ? gCint->CallFunc_FactoryCopy(rhs.fFunc) : 0;
      fOffset   = rhs.fOffset;
      fClass    = rhs.fClass;
      fMethod   = rhs.fMethod;
      fParams   = rhs.fParams;
      fProto    = rhs.fProto;
      fDtorOnly = rhs.fDtorOnly;
      fRetType  = rhs.fRetType;

      delete fMetPtr;
      fMetPtr = 0;
   }

   return *this;
}

//______________________________________________________________________________
TMethodCall::~TMethodCall()
{
   // TMethodCall dtor.

   gCint->CallFunc_Delete(fFunc);
   delete fMetPtr;
}

//______________________________________________________________________________
TObject *TMethodCall::Clone(const char *) const
{
   // Return an exact copy of this object.

   TObject *newobj = new TMethodCall(*this);
   return newobj;
}

//______________________________________________________________________________
static TClass *R__FindScope(const char *function, UInt_t &pos, ClassInfo_t *cinfo)
{
   // Helper function to find the scope associated with a qualified
   // function name

   if (function) {
      UInt_t nested = 0;
      for(int i=strlen(function); i>=0; --i) {
         switch(function[i]) {
            case '<': --nested; break;
            case '>': ++nested; break;
            case ':':
               if (nested==0) {
                  if (i>2 && function[i-1]==':') {
                     TString scope(function);
                     scope[i-1] = 0;
                     pos = i+1;
                     TClass *cl = TClass::GetClass(scope);
                     if (!cl) gCint->ClassInfo_Init(cinfo, scope);
                     return cl;
                  }
               }
               break;
         }
      }
   }
   return 0;
}

//______________________________________________________________________________
void TMethodCall::Init(TClass *cl, const char *method, const char *params)
{
   // Initialize the method invocation environment. Necessary input
   // information: the class, method name and the parameter string
   // of the form "\"aap\", 3, 4.35".
   // To execute the method call TMethodCall::Execute(object,...).
   // This two step method is much more efficient than calling for
   // every invocation TInterpreter::Execute(...).

   ClassInfo_t *cinfo = gCint->ClassInfo_Factory();
   if (!cl) {
      UInt_t pos = 0;
      cl = R__FindScope(method,pos,cinfo);
      method = method+pos;
   }
   InitImplementation(method,params,0,cl,cinfo);
   gCint->ClassInfo_Delete(cinfo);
}

//______________________________________________________________________________
void TMethodCall::Init(const char *function, const char *params)
{
   // Initialize the function invocation environment. Necessary input
   // information: the function name and the parameter string of
   // the form "\"aap\", 3, 4.35".
   // To execute the method call TMethodCall::Execute(...).
   // This two step method is much more efficient than calling for
   // every invocation TInterpreter::Execute(...).

   UInt_t pos = 0;
   ClassInfo_t *cinfo = gCint->ClassInfo_Factory();
   TClass *cl = R__FindScope(function,pos,cinfo);
   InitImplementation(function+pos, params, 0, cl, cinfo);
   gCint->ClassInfo_Delete(cinfo);
}

//______________________________________________________________________________
void TMethodCall::InitImplementation(const char *methodname, const char *params,
                                     const char *proto, TClass *cl,
                                     const ClassInfo_t *cinfo) 
{
   // This function implements Init and InitWithPrototype.

   // 'methodname' should NOT have any scope information in it.  The scope
   // information should be passed via the TClass or CINT ClassInfo.

   if (!fFunc)
      fFunc = gCint->CallFunc_Factory();
   else
      gCint->CallFunc_Init(fFunc);

   fClass    = cl;
   fMetPtr   = 0;
   fMethod   = methodname;
   fParams   = params ? params : "";
   fProto    = proto ? proto : "";
   fDtorOnly = kFALSE;
   fRetType  = kNone;

   ClassInfo_t *scope = 0;
   ClassInfo_t *global = gCint->ClassInfo_Factory();
   if (cl) scope = (ClassInfo_t*)cl->GetClassInfo();
   else    scope = (ClassInfo_t*)cinfo;
  
   if (!scope) return;

   R__LOCKGUARD2(gCINTMutex);
   if (params && params[0]) {
      gCint->CallFunc_SetFunc(fFunc, scope, (char *)methodname, (char *)params, &fOffset);
   } else if (proto && proto[0]) {
      gCint->CallFunc_SetFuncProto(fFunc, scope, (char *)methodname, (char *)proto, &fOffset);
   } else {
      // No parameters
      gCint->CallFunc_SetFunc(fFunc, scope, (char *)methodname, "", &fOffset);
   }
   
   gCint->ClassInfo_Delete(global);
}

//______________________________________________________________________________
void TMethodCall::InitWithPrototype(TClass *cl, const char *method, const char *proto)
{
   // Initialize the method invocation environment. Necessary input
   // information: the class, method name and the prototype string of
   // the form: "char*,int,float".
   // To execute the method call TMethodCall::Execute(object,...).
   // This two step method is much more efficient than calling for
   // every invocation TInterpreter::Execute(...).

   ClassInfo_t *cinfo = gCint->ClassInfo_Factory();
   if (!cl) {
      UInt_t pos = 0;
      cl = R__FindScope(method,pos,cinfo);
      method = method+pos;
   }
   InitImplementation(method, 0, proto, cl, cinfo);
   gCint->ClassInfo_Delete(cinfo);
}

//______________________________________________________________________________
void TMethodCall::InitWithPrototype(const char *function, const char *proto)
{
   // Initialize the function invocation environment. Necessary input
   // information: the function name and the prototype string of
   // the form: "char*,int,float".
   // To execute the method call TMethodCall::Execute(...).
   // This two step method is much more efficient than calling for
   // every invocation TInterpreter::Execute(...).

   UInt_t pos = 0;
   ClassInfo_t *cinfo = gCint->ClassInfo_Factory();
   TClass *cl = R__FindScope(function,pos,cinfo);
   InitImplementation(function+pos, 0, proto, cl, cinfo);
   gCint->ClassInfo_Delete(cinfo);
}

//______________________________________________________________________________
Bool_t TMethodCall::IsValid() const
{
   // Return true if the method call has been properly initialized and is
   // usable.

   return fFunc ? gCint->CallFunc_IsValid(fFunc) : kFALSE;
}

//______________________________________________________________________________
TFunction *TMethodCall::GetMethod()
{
   // Returns the TMethod describing the method to be executed. This takes
   // all overriding and overloading into account (call TClass::GetMethod()).
   // Since finding the method is expensive the result is cached.

   // Since the object in the list of global function are often deleted
   // we need to copy them.

   if (!fMetPtr) {
      if (fClass) {
         if (fProto == "") {
            fMetPtr = fClass->GetMethod(fMethod.Data(), fParams.Data());
         } else {
            fMetPtr = fClass->GetMethodWithPrototype(fMethod.Data(), fProto.Data());
         }
         TMethod *met = dynamic_cast<TMethod*>(fMetPtr);
         if (met) fMetPtr = new TMethod(*met);
      } else {
         if (fProto == "")
            fMetPtr = gROOT->GetGlobalFunction(fMethod.Data(), fParams.Data(), kTRUE);
         else
            fMetPtr = gROOT->GetGlobalFunctionWithPrototype(fMethod.Data(), fProto.Data(), kTRUE);
         if (fMetPtr) fMetPtr = new TFunction(*fMetPtr);
      }
   }

   return fMetPtr;
}

//______________________________________________________________________________
void TMethodCall::Execute(void *object)
{
   // Execute the method (with preset arguments) for the specified object.

   if (!fFunc) return;
   
   R__LOCKGUARD2(gCINTMutex);
   void *address = 0;
   if (object) address = (void*)((Long_t)object + fOffset);
   gCint->SetTempLevel(1);
   if (fDtorOnly) {
      Long_t saveglobalvar = gCint->Getgvp();
      gCint->Setgvp((Long_t)address);
      gCint->CallFunc_Exec(fFunc,address);
      gCint->Setgvp(saveglobalvar);
   } else
      gCint->CallFunc_Exec(fFunc,address);
   gCint->SetTempLevel(-1);
}

//______________________________________________________________________________
void TMethodCall::Execute(void *object, const char *params)
{
   // Execute the method for the specified object and argument values.

   if (!fFunc) return;
   
   R__LOCKGUARD2(gCINTMutex);
   gCint->CallFunc_SetArgs(fFunc, (char *)params);

   void *address = 0;
   if (object) address = (void*)((Long_t)object + fOffset);
   gCint->SetTempLevel(1);
   gCint->CallFunc_Exec(fFunc,address);
   gCint->SetTempLevel(-1);
}

//______________________________________________________________________________
void TMethodCall::Execute(void *object, Long_t &retLong)
{
   // Execute the method (with preset arguments) for the specified object.

   if (!fFunc) return;
   
   R__LOCKGUARD2(gCINTMutex);
   void *address = 0;
   if (object) address = (void*)((Long_t)object + fOffset);
   gCint->SetTempLevel(1);
   retLong = gCint->CallFunc_ExecInt(fFunc,address);
   gCint->SetTempLevel(-1);
}

//______________________________________________________________________________
void TMethodCall::Execute(void *object, const char *params, Long_t &retLong)
{
   // Execute the method for the specified object and argument values.

   if (!fFunc) return;
   
   R__LOCKGUARD2(gCINTMutex);
   gCint->CallFunc_SetArgs(fFunc, (char *)params);

   void *address = 0;
   if (object) address = (void*)((Long_t)object + fOffset);
   gCint->SetTempLevel(1);
   retLong = gCint->CallFunc_ExecInt(fFunc,address);
   gCint->SetTempLevel(-1);
}

//______________________________________________________________________________
void TMethodCall::Execute(void *object, Double_t &retDouble)
{
   // Execute the method (with preset arguments) for the specified object.

   if (!fFunc) return;
   
   R__LOCKGUARD2(gCINTMutex);
   void *address = 0;
   if (object) address = (void*)((Long_t)object + fOffset);
   gCint->SetTempLevel(1);
   retDouble = gCint->CallFunc_ExecDouble(fFunc,address);
   gCint->SetTempLevel(-1);
}

//______________________________________________________________________________
void TMethodCall::Execute(void *object, const char *params, Double_t &retDouble)
{
   // Execute the method for the specified object and argument values.

   if (!fFunc) return;
   
   R__LOCKGUARD2(gCINTMutex);
   gCint->CallFunc_SetArgs(fFunc, (char *)params);

   void *address = 0;
   if (object) address = (void*)((Long_t)object + fOffset);
   gCint->SetTempLevel(1);
   retDouble = gCint->CallFunc_ExecDouble(fFunc,address);
   gCint->SetTempLevel(-1);
}

//______________________________________________________________________________
void TMethodCall::Execute(void *object, char **retText)
{
   // Execute the method (with preset arguments) for the specified object.

   if (!fFunc) return;
   
   R__LOCKGUARD2(gCINTMutex);
   void *address = 0;
   if (object) address = (void*)((Long_t)object + fOffset);
   gCint->SetTempLevel(1);
   *retText =(char*) (gCint->CallFunc_ExecInt(fFunc,address));
   gCint->SetTempLevel(-1);
}

//______________________________________________________________________________
void TMethodCall::Execute(void *object, const char *params, char **retText)
{
   // Execute the method for the specified object and argument values.

   if (!fFunc) return;
   
   R__LOCKGUARD2(gCINTMutex);
   gCint->CallFunc_SetArgs(fFunc, (char *)params);

   void *address = 0;
   if (object) address = (void*)((Long_t)object + fOffset);
   gCint->SetTempLevel(1);
   *retText =(char*)(gCint->CallFunc_ExecInt(fFunc,address));
   gCint->SetTempLevel(-1);
}

//______________________________________________________________________________
TMethodCall::EReturnType TMethodCall::ReturnType()
{
   // Returns the return type of the method. Either (unsigned) long,
   // int, short and char, or float and double or anything else.
   // Since finding the return type is expensive the result is cached.

   if ( fRetType == kNone) {
      TFunction *func = GetMethod();
      if (func == 0) {
         fRetType = kOther;
         Error("ReturnType","Unknown method");
         return kOther;
      }

      // count the number of stars in the name.
      Int_t nstar = 0;
      const char* rettype = func->GetReturnTypeName();
      const char* returntype = rettype;
      while (*returntype) {
         if (*returntype == '*') nstar++;
         returntype++;
      }

      TypedefInfo_t *atype = gCint->TypedefInfo_Factory();
      gCint->TypedefInfo_Init(atype,gCint->TypeName(rettype));
      //be careful, below this point rettype cannot be reused (point to a static in TCint)
      
      const char *name = gCint->TypedefInfo_TrueName(atype);

      Bool_t isEnum = kFALSE;
      TypeInfo_t *typed = 0;
      if (!strcmp("(unknown)",name)) {
         typed = gCint->TypeInfo_Factory();         
         gCint->TypeInfo_Init(typed,func->GetReturnTypeName());
         name  = gCint->TypeInfo_TrueName(typed);
         if (gCint->TypeInfo_Property(typed)&kIsEnum) {
            isEnum = kTRUE;
         }
      }

      if ((nstar==1) &&
          (!strcmp("unsigned char", name)        || !strcmp("char", name)         ||
           !strcmp("UChar_t", name)              || !strcmp("Char_t", name)       ||
           !strcmp("const unsigned char", name)  || !strcmp("const char", name)   ||
           !strcmp("const UChar_t", name)        || !strcmp("const Char_t", name) ||
           !strcmp("unsigned char*", name)       || !strcmp("char*", name)        ||
           !strcmp("UChar_t*", name)             || !strcmp("Char_t*", name)      ||
           !strcmp("const unsigned char*", name) || !strcmp("const char*", name)  ||
           !strcmp("const UChar_t*", name)       || !strcmp("const Char_t*", name)))
         fRetType = kString;
      else if (!strcmp("unsigned int", name)   || !strcmp("int", name)      ||
               !strcmp("unsigned long", name)  || !strcmp("long", name)     ||
               !strcmp("unsigned long long", name) || !strcmp("long long", name) ||
               !strcmp("unsigned short", name) || !strcmp("short", name)    ||
               !strcmp("unsigned char", name)  || !strcmp("char", name)     ||
               !strcmp("UInt_t", name)         || !strcmp("Int_t", name)    ||
               !strcmp("ULong_t", name)        || !strcmp("Long_t", name)   ||
               !strcmp("ULong64_t", name)      || !strcmp("Long_t64", name) ||
               !strcmp("UShort_t", name)       || !strcmp("Short_t", name)  ||
               !strcmp("UChar_t", name)        || !strcmp("Char_t", name)   ||
               !strcmp("Bool_t", name)         || !strcmp("bool", name)     ||
               strstr(name, "enum"))
         fRetType = kLong;
      else if (!strcmp("float", name)   || !strcmp("double", name)    ||
               !strcmp("Float_t", name) || !strcmp("Double_t", name))
         fRetType = kDouble;
      else if (isEnum)
         fRetType = kLong;
      else
         fRetType = kOther;
      gCint->TypeInfo_Delete(typed);
      gCint->TypedefInfo_Delete(atype);

   }

   return fRetType;
}

//______________________________________________________________________________
void TMethodCall::SetParamPtrs(void *paramArr, Int_t nparam)
{
   // ParamArr is an array containing the function argument values.
   // If nparam = -1 then paramArr must contain values for all function
   // arguments, otherwise Nargs-NargsOpt <= nparam <= Nargs, where
   // Nargs is the number of all arguments and NargsOpt is the number
   // of default arguments.

   if (!fFunc) return;
   R__LOCKGUARD2(gCINTMutex);
   gCint->CallFunc_SetArgArray(fFunc,(Long_t *)paramArr, nparam);
}

//______________________________________________________________________________
void TMethodCall::ResetParam()
{
   // Reset parameter list. To be used before the first call the SetParam().

   if (!fFunc) return;
   gCint->CallFunc_ResetArg(fFunc);
}

//______________________________________________________________________________
void TMethodCall::SetParam(Long_t l)
{
   // Add a long method parameter.

   if (!fFunc) return;
   gCint->CallFunc_SetArg(fFunc,l);
}

//______________________________________________________________________________
void TMethodCall::SetParam(Double_t d)
{
   // Add a double method parameter.

   if (!fFunc) return;
   gCint->CallFunc_SetArg(fFunc,d);
}

//______________________________________________________________________________
void TMethodCall::SetParam(Long64_t ll)
{
   // Add a long long method parameter.

   if (!fFunc) return;
   gCint->CallFunc_SetArg(fFunc,ll);
}

//______________________________________________________________________________
void TMethodCall::SetParam(ULong64_t ull)
{
   // Add a unsigned long long method parameter.

   if (!fFunc) return;   
   gCint->CallFunc_SetArg(fFunc,ull);
}
 TMethodCall.cxx:1
 TMethodCall.cxx:2
 TMethodCall.cxx:3
 TMethodCall.cxx:4
 TMethodCall.cxx:5
 TMethodCall.cxx:6
 TMethodCall.cxx:7
 TMethodCall.cxx:8
 TMethodCall.cxx:9
 TMethodCall.cxx:10
 TMethodCall.cxx:11
 TMethodCall.cxx:12
 TMethodCall.cxx:13
 TMethodCall.cxx:14
 TMethodCall.cxx:15
 TMethodCall.cxx:16
 TMethodCall.cxx:17
 TMethodCall.cxx:18
 TMethodCall.cxx:19
 TMethodCall.cxx:20
 TMethodCall.cxx:21
 TMethodCall.cxx:22
 TMethodCall.cxx:23
 TMethodCall.cxx:24
 TMethodCall.cxx:25
 TMethodCall.cxx:26
 TMethodCall.cxx:27
 TMethodCall.cxx:28
 TMethodCall.cxx:29
 TMethodCall.cxx:30
 TMethodCall.cxx:31
 TMethodCall.cxx:32
 TMethodCall.cxx:33
 TMethodCall.cxx:34
 TMethodCall.cxx:35
 TMethodCall.cxx:36
 TMethodCall.cxx:37
 TMethodCall.cxx:38
 TMethodCall.cxx:39
 TMethodCall.cxx:40
 TMethodCall.cxx:41
 TMethodCall.cxx:42
 TMethodCall.cxx:43
 TMethodCall.cxx:44
 TMethodCall.cxx:45
 TMethodCall.cxx:46
 TMethodCall.cxx:47
 TMethodCall.cxx:48
 TMethodCall.cxx:49
 TMethodCall.cxx:50
 TMethodCall.cxx:51
 TMethodCall.cxx:52
 TMethodCall.cxx:53
 TMethodCall.cxx:54
 TMethodCall.cxx:55
 TMethodCall.cxx:56
 TMethodCall.cxx:57
 TMethodCall.cxx:58
 TMethodCall.cxx:59
 TMethodCall.cxx:60
 TMethodCall.cxx:61
 TMethodCall.cxx:62
 TMethodCall.cxx:63
 TMethodCall.cxx:64
 TMethodCall.cxx:65
 TMethodCall.cxx:66
 TMethodCall.cxx:67
 TMethodCall.cxx:68
 TMethodCall.cxx:69
 TMethodCall.cxx:70
 TMethodCall.cxx:71
 TMethodCall.cxx:72
 TMethodCall.cxx:73
 TMethodCall.cxx:74
 TMethodCall.cxx:75
 TMethodCall.cxx:76
 TMethodCall.cxx:77
 TMethodCall.cxx:78
 TMethodCall.cxx:79
 TMethodCall.cxx:80
 TMethodCall.cxx:81
 TMethodCall.cxx:82
 TMethodCall.cxx:83
 TMethodCall.cxx:84
 TMethodCall.cxx:85
 TMethodCall.cxx:86
 TMethodCall.cxx:87
 TMethodCall.cxx:88
 TMethodCall.cxx:89
 TMethodCall.cxx:90
 TMethodCall.cxx:91
 TMethodCall.cxx:92
 TMethodCall.cxx:93
 TMethodCall.cxx:94
 TMethodCall.cxx:95
 TMethodCall.cxx:96
 TMethodCall.cxx:97
 TMethodCall.cxx:98
 TMethodCall.cxx:99
 TMethodCall.cxx:100
 TMethodCall.cxx:101
 TMethodCall.cxx:102
 TMethodCall.cxx:103
 TMethodCall.cxx:104
 TMethodCall.cxx:105
 TMethodCall.cxx:106
 TMethodCall.cxx:107
 TMethodCall.cxx:108
 TMethodCall.cxx:109
 TMethodCall.cxx:110
 TMethodCall.cxx:111
 TMethodCall.cxx:112
 TMethodCall.cxx:113
 TMethodCall.cxx:114
 TMethodCall.cxx:115
 TMethodCall.cxx:116
 TMethodCall.cxx:117
 TMethodCall.cxx:118
 TMethodCall.cxx:119
 TMethodCall.cxx:120
 TMethodCall.cxx:121
 TMethodCall.cxx:122
 TMethodCall.cxx:123
 TMethodCall.cxx:124
 TMethodCall.cxx:125
 TMethodCall.cxx:126
 TMethodCall.cxx:127
 TMethodCall.cxx:128
 TMethodCall.cxx:129
 TMethodCall.cxx:130
 TMethodCall.cxx:131
 TMethodCall.cxx:132
 TMethodCall.cxx:133
 TMethodCall.cxx:134
 TMethodCall.cxx:135
 TMethodCall.cxx:136
 TMethodCall.cxx:137
 TMethodCall.cxx:138
 TMethodCall.cxx:139
 TMethodCall.cxx:140
 TMethodCall.cxx:141
 TMethodCall.cxx:142
 TMethodCall.cxx:143
 TMethodCall.cxx:144
 TMethodCall.cxx:145
 TMethodCall.cxx:146
 TMethodCall.cxx:147
 TMethodCall.cxx:148
 TMethodCall.cxx:149
 TMethodCall.cxx:150
 TMethodCall.cxx:151
 TMethodCall.cxx:152
 TMethodCall.cxx:153
 TMethodCall.cxx:154
 TMethodCall.cxx:155
 TMethodCall.cxx:156
 TMethodCall.cxx:157
 TMethodCall.cxx:158
 TMethodCall.cxx:159
 TMethodCall.cxx:160
 TMethodCall.cxx:161
 TMethodCall.cxx:162
 TMethodCall.cxx:163
 TMethodCall.cxx:164
 TMethodCall.cxx:165
 TMethodCall.cxx:166
 TMethodCall.cxx:167
 TMethodCall.cxx:168
 TMethodCall.cxx:169
 TMethodCall.cxx:170
 TMethodCall.cxx:171
 TMethodCall.cxx:172
 TMethodCall.cxx:173
 TMethodCall.cxx:174
 TMethodCall.cxx:175
 TMethodCall.cxx:176
 TMethodCall.cxx:177
 TMethodCall.cxx:178
 TMethodCall.cxx:179
 TMethodCall.cxx:180
 TMethodCall.cxx:181
 TMethodCall.cxx:182
 TMethodCall.cxx:183
 TMethodCall.cxx:184
 TMethodCall.cxx:185
 TMethodCall.cxx:186
 TMethodCall.cxx:187
 TMethodCall.cxx:188
 TMethodCall.cxx:189
 TMethodCall.cxx:190
 TMethodCall.cxx:191
 TMethodCall.cxx:192
 TMethodCall.cxx:193
 TMethodCall.cxx:194
 TMethodCall.cxx:195
 TMethodCall.cxx:196
 TMethodCall.cxx:197
 TMethodCall.cxx:198
 TMethodCall.cxx:199
 TMethodCall.cxx:200
 TMethodCall.cxx:201
 TMethodCall.cxx:202
 TMethodCall.cxx:203
 TMethodCall.cxx:204
 TMethodCall.cxx:205
 TMethodCall.cxx:206
 TMethodCall.cxx:207
 TMethodCall.cxx:208
 TMethodCall.cxx:209
 TMethodCall.cxx:210
 TMethodCall.cxx:211
 TMethodCall.cxx:212
 TMethodCall.cxx:213
 TMethodCall.cxx:214
 TMethodCall.cxx:215
 TMethodCall.cxx:216
 TMethodCall.cxx:217
 TMethodCall.cxx:218
 TMethodCall.cxx:219
 TMethodCall.cxx:220
 TMethodCall.cxx:221
 TMethodCall.cxx:222
 TMethodCall.cxx:223
 TMethodCall.cxx:224
 TMethodCall.cxx:225
 TMethodCall.cxx:226
 TMethodCall.cxx:227
 TMethodCall.cxx:228
 TMethodCall.cxx:229
 TMethodCall.cxx:230
 TMethodCall.cxx:231
 TMethodCall.cxx:232
 TMethodCall.cxx:233
 TMethodCall.cxx:234
 TMethodCall.cxx:235
 TMethodCall.cxx:236
 TMethodCall.cxx:237
 TMethodCall.cxx:238
 TMethodCall.cxx:239
 TMethodCall.cxx:240
 TMethodCall.cxx:241
 TMethodCall.cxx:242
 TMethodCall.cxx:243
 TMethodCall.cxx:244
 TMethodCall.cxx:245
 TMethodCall.cxx:246
 TMethodCall.cxx:247
 TMethodCall.cxx:248
 TMethodCall.cxx:249
 TMethodCall.cxx:250
 TMethodCall.cxx:251
 TMethodCall.cxx:252
 TMethodCall.cxx:253
 TMethodCall.cxx:254
 TMethodCall.cxx:255
 TMethodCall.cxx:256
 TMethodCall.cxx:257
 TMethodCall.cxx:258
 TMethodCall.cxx:259
 TMethodCall.cxx:260
 TMethodCall.cxx:261
 TMethodCall.cxx:262
 TMethodCall.cxx:263
 TMethodCall.cxx:264
 TMethodCall.cxx:265
 TMethodCall.cxx:266
 TMethodCall.cxx:267
 TMethodCall.cxx:268
 TMethodCall.cxx:269
 TMethodCall.cxx:270
 TMethodCall.cxx:271
 TMethodCall.cxx:272
 TMethodCall.cxx:273
 TMethodCall.cxx:274
 TMethodCall.cxx:275
 TMethodCall.cxx:276
 TMethodCall.cxx:277
 TMethodCall.cxx:278
 TMethodCall.cxx:279
 TMethodCall.cxx:280
 TMethodCall.cxx:281
 TMethodCall.cxx:282
 TMethodCall.cxx:283
 TMethodCall.cxx:284
 TMethodCall.cxx:285
 TMethodCall.cxx:286
 TMethodCall.cxx:287
 TMethodCall.cxx:288
 TMethodCall.cxx:289
 TMethodCall.cxx:290
 TMethodCall.cxx:291
 TMethodCall.cxx:292
 TMethodCall.cxx:293
 TMethodCall.cxx:294
 TMethodCall.cxx:295
 TMethodCall.cxx:296
 TMethodCall.cxx:297
 TMethodCall.cxx:298
 TMethodCall.cxx:299
 TMethodCall.cxx:300
 TMethodCall.cxx:301
 TMethodCall.cxx:302
 TMethodCall.cxx:303
 TMethodCall.cxx:304
 TMethodCall.cxx:305
 TMethodCall.cxx:306
 TMethodCall.cxx:307
 TMethodCall.cxx:308
 TMethodCall.cxx:309
 TMethodCall.cxx:310
 TMethodCall.cxx:311
 TMethodCall.cxx:312
 TMethodCall.cxx:313
 TMethodCall.cxx:314
 TMethodCall.cxx:315
 TMethodCall.cxx:316
 TMethodCall.cxx:317
 TMethodCall.cxx:318
 TMethodCall.cxx:319
 TMethodCall.cxx:320
 TMethodCall.cxx:321
 TMethodCall.cxx:322
 TMethodCall.cxx:323
 TMethodCall.cxx:324
 TMethodCall.cxx:325
 TMethodCall.cxx:326
 TMethodCall.cxx:327
 TMethodCall.cxx:328
 TMethodCall.cxx:329
 TMethodCall.cxx:330
 TMethodCall.cxx:331
 TMethodCall.cxx:332
 TMethodCall.cxx:333
 TMethodCall.cxx:334
 TMethodCall.cxx:335
 TMethodCall.cxx:336
 TMethodCall.cxx:337
 TMethodCall.cxx:338
 TMethodCall.cxx:339
 TMethodCall.cxx:340
 TMethodCall.cxx:341
 TMethodCall.cxx:342
 TMethodCall.cxx:343
 TMethodCall.cxx:344
 TMethodCall.cxx:345
 TMethodCall.cxx:346
 TMethodCall.cxx:347
 TMethodCall.cxx:348
 TMethodCall.cxx:349
 TMethodCall.cxx:350
 TMethodCall.cxx:351
 TMethodCall.cxx:352
 TMethodCall.cxx:353
 TMethodCall.cxx:354
 TMethodCall.cxx:355
 TMethodCall.cxx:356
 TMethodCall.cxx:357
 TMethodCall.cxx:358
 TMethodCall.cxx:359
 TMethodCall.cxx:360
 TMethodCall.cxx:361
 TMethodCall.cxx:362
 TMethodCall.cxx:363
 TMethodCall.cxx:364
 TMethodCall.cxx:365
 TMethodCall.cxx:366
 TMethodCall.cxx:367
 TMethodCall.cxx:368
 TMethodCall.cxx:369
 TMethodCall.cxx:370
 TMethodCall.cxx:371
 TMethodCall.cxx:372
 TMethodCall.cxx:373
 TMethodCall.cxx:374
 TMethodCall.cxx:375
 TMethodCall.cxx:376
 TMethodCall.cxx:377
 TMethodCall.cxx:378
 TMethodCall.cxx:379
 TMethodCall.cxx:380
 TMethodCall.cxx:381
 TMethodCall.cxx:382
 TMethodCall.cxx:383
 TMethodCall.cxx:384
 TMethodCall.cxx:385
 TMethodCall.cxx:386
 TMethodCall.cxx:387
 TMethodCall.cxx:388
 TMethodCall.cxx:389
 TMethodCall.cxx:390
 TMethodCall.cxx:391
 TMethodCall.cxx:392
 TMethodCall.cxx:393
 TMethodCall.cxx:394
 TMethodCall.cxx:395
 TMethodCall.cxx:396
 TMethodCall.cxx:397
 TMethodCall.cxx:398
 TMethodCall.cxx:399
 TMethodCall.cxx:400
 TMethodCall.cxx:401
 TMethodCall.cxx:402
 TMethodCall.cxx:403
 TMethodCall.cxx:404
 TMethodCall.cxx:405
 TMethodCall.cxx:406
 TMethodCall.cxx:407
 TMethodCall.cxx:408
 TMethodCall.cxx:409
 TMethodCall.cxx:410
 TMethodCall.cxx:411
 TMethodCall.cxx:412
 TMethodCall.cxx:413
 TMethodCall.cxx:414
 TMethodCall.cxx:415
 TMethodCall.cxx:416
 TMethodCall.cxx:417
 TMethodCall.cxx:418
 TMethodCall.cxx:419
 TMethodCall.cxx:420
 TMethodCall.cxx:421
 TMethodCall.cxx:422
 TMethodCall.cxx:423
 TMethodCall.cxx:424
 TMethodCall.cxx:425
 TMethodCall.cxx:426
 TMethodCall.cxx:427
 TMethodCall.cxx:428
 TMethodCall.cxx:429
 TMethodCall.cxx:430
 TMethodCall.cxx:431
 TMethodCall.cxx:432
 TMethodCall.cxx:433
 TMethodCall.cxx:434
 TMethodCall.cxx:435
 TMethodCall.cxx:436
 TMethodCall.cxx:437
 TMethodCall.cxx:438
 TMethodCall.cxx:439
 TMethodCall.cxx:440
 TMethodCall.cxx:441
 TMethodCall.cxx:442
 TMethodCall.cxx:443
 TMethodCall.cxx:444
 TMethodCall.cxx:445
 TMethodCall.cxx:446
 TMethodCall.cxx:447
 TMethodCall.cxx:448
 TMethodCall.cxx:449
 TMethodCall.cxx:450
 TMethodCall.cxx:451
 TMethodCall.cxx:452
 TMethodCall.cxx:453
 TMethodCall.cxx:454
 TMethodCall.cxx:455
 TMethodCall.cxx:456
 TMethodCall.cxx:457
 TMethodCall.cxx:458
 TMethodCall.cxx:459
 TMethodCall.cxx:460
 TMethodCall.cxx:461
 TMethodCall.cxx:462
 TMethodCall.cxx:463
 TMethodCall.cxx:464
 TMethodCall.cxx:465
 TMethodCall.cxx:466
 TMethodCall.cxx:467
 TMethodCall.cxx:468
 TMethodCall.cxx:469
 TMethodCall.cxx:470
 TMethodCall.cxx:471
 TMethodCall.cxx:472
 TMethodCall.cxx:473
 TMethodCall.cxx:474
 TMethodCall.cxx:475
 TMethodCall.cxx:476
 TMethodCall.cxx:477
 TMethodCall.cxx:478
 TMethodCall.cxx:479
 TMethodCall.cxx:480
 TMethodCall.cxx:481
 TMethodCall.cxx:482
 TMethodCall.cxx:483
 TMethodCall.cxx:484
 TMethodCall.cxx:485
 TMethodCall.cxx:486
 TMethodCall.cxx:487
 TMethodCall.cxx:488
 TMethodCall.cxx:489
 TMethodCall.cxx:490
 TMethodCall.cxx:491
 TMethodCall.cxx:492
 TMethodCall.cxx:493
 TMethodCall.cxx:494
 TMethodCall.cxx:495
 TMethodCall.cxx:496
 TMethodCall.cxx:497
 TMethodCall.cxx:498
 TMethodCall.cxx:499
 TMethodCall.cxx:500
 TMethodCall.cxx:501
 TMethodCall.cxx:502
 TMethodCall.cxx:503
 TMethodCall.cxx:504
 TMethodCall.cxx:505
 TMethodCall.cxx:506
 TMethodCall.cxx:507
 TMethodCall.cxx:508
 TMethodCall.cxx:509
 TMethodCall.cxx:510
 TMethodCall.cxx:511
 TMethodCall.cxx:512
 TMethodCall.cxx:513
 TMethodCall.cxx:514
 TMethodCall.cxx:515
 TMethodCall.cxx:516
 TMethodCall.cxx:517
 TMethodCall.cxx:518
 TMethodCall.cxx:519
 TMethodCall.cxx:520
 TMethodCall.cxx:521
 TMethodCall.cxx:522
 TMethodCall.cxx:523
 TMethodCall.cxx:524
 TMethodCall.cxx:525
 TMethodCall.cxx:526
 TMethodCall.cxx:527
 TMethodCall.cxx:528
 TMethodCall.cxx:529
 TMethodCall.cxx:530
 TMethodCall.cxx:531
 TMethodCall.cxx:532
 TMethodCall.cxx:533
 TMethodCall.cxx:534
 TMethodCall.cxx:535
 TMethodCall.cxx:536
 TMethodCall.cxx:537
 TMethodCall.cxx:538
 TMethodCall.cxx:539
 TMethodCall.cxx:540
 TMethodCall.cxx:541
 TMethodCall.cxx:542
 TMethodCall.cxx:543
 TMethodCall.cxx:544
 TMethodCall.cxx:545
 TMethodCall.cxx:546
 TMethodCall.cxx:547
 TMethodCall.cxx:548
 TMethodCall.cxx:549
 TMethodCall.cxx:550
 TMethodCall.cxx:551
 TMethodCall.cxx:552
 TMethodCall.cxx:553
 TMethodCall.cxx:554
 TMethodCall.cxx:555
 TMethodCall.cxx:556
 TMethodCall.cxx:557
 TMethodCall.cxx:558
 TMethodCall.cxx:559
 TMethodCall.cxx:560
 TMethodCall.cxx:561
 TMethodCall.cxx:562
 TMethodCall.cxx:563
 TMethodCall.cxx:564
 TMethodCall.cxx:565
 TMethodCall.cxx:566
 TMethodCall.cxx:567
 TMethodCall.cxx:568
 TMethodCall.cxx:569
 TMethodCall.cxx:570
 TMethodCall.cxx:571
 TMethodCall.cxx:572
 TMethodCall.cxx:573
 TMethodCall.cxx:574
 TMethodCall.cxx:575
 TMethodCall.cxx:576
 TMethodCall.cxx:577
 TMethodCall.cxx:578
 TMethodCall.cxx:579
 TMethodCall.cxx:580
 TMethodCall.cxx:581
 TMethodCall.cxx:582
 TMethodCall.cxx:583
 TMethodCall.cxx:584
 TMethodCall.cxx:585
 TMethodCall.cxx:586
 TMethodCall.cxx:587
 TMethodCall.cxx:588
 TMethodCall.cxx:589
 TMethodCall.cxx:590
 TMethodCall.cxx:591
 TMethodCall.cxx:592
 TMethodCall.cxx:593
 TMethodCall.cxx:594
 TMethodCall.cxx:595
 TMethodCall.cxx:596