35 #define TParameter PyROOT::TParameter
37 typedef PyROOT::TParameter TParameter;
43 const int SMALL_ARGS_N = 8;
47 typedef std::vector< TClassRef > ClassRefs_t;
48 static ClassRefs_t g_classrefs( 1 );
49 static const ClassRefs_t::size_type GLOBAL_HANDLE = 1;
51 typedef std::map< std::string, ClassRefs_t::size_type > Name2ClassRefIndex_t;
52 static Name2ClassRefIndex_t g_name2classrefidx;
54 typedef std::map< Cppyy::TCppMethod_t, CallFunc_t* > Method2CallFunc_t;
55 static Method2CallFunc_t g_method2callfunc;
57 typedef std::vector< TFunction > GlobalFuncs_t;
58 static GlobalFuncs_t g_globalfuncs;
60 typedef std::vector< TGlobal* > GlobalVars_t;
61 static GlobalVars_t g_globalvars;
64 Cppyy::TCppScope_t Cppyy::gGlobalScope = GLOBAL_HANDLE;
67 static std::set< std::string > gSmartPtrTypes =
68 {
"auto_ptr",
"shared_ptr",
"weak_ptr",
"unique_ptr" };
74 class ApplicationStarter {
76 ApplicationStarter() {
82 assert( g_classrefs.size() == GLOBAL_HANDLE );
83 g_name2classrefidx[
"" ] = GLOBAL_HANDLE;
84 g_classrefs.push_back(TClassRef(
""));
86 g_name2classrefidx[
"std" ] = GLOBAL_HANDLE;
87 g_name2classrefidx[
"::std" ] = GLOBAL_HANDLE;
89 g_globalvars.push_back(
nullptr );
92 ~ApplicationStarter() {
93 for (
auto ifunc : g_method2callfunc )
94 gInterpreter->CallFunc_Delete( ifunc.second );
96 } _applicationStarter;
103 TClassRef& type_from_handle( Cppyy::TCppScope_t scope )
105 assert( (ClassRefs_t::size_type) scope < g_classrefs.size() );
106 return g_classrefs[ (ClassRefs_t::size_type)scope ];
111 TFunction* type_get_method( Cppyy::TCppType_t klass, Cppyy::TCppIndex_t idx )
113 TClassRef& cr = type_from_handle( klass );
115 return (TFunction*)cr->GetListOfMethods()->At( idx );
116 assert( klass == (Cppyy::TCppType_t)GLOBAL_HANDLE );
117 return (TFunction*)idx;
121 Cppyy::TCppScope_t declaring_scope( Cppyy::TCppMethod_t method )
123 TMethod* m =
dynamic_cast<TMethod*
>( (TFunction*)method );
124 if ( m )
return Cppyy::GetScope( m->GetClass()->GetName() );
125 return (Cppyy::TCppScope_t)GLOBAL_HANDLE;
130 Cppyy::TCppIndex_t Cppyy::GetNumScopes( TCppScope_t scope )
132 TClassRef& cr = type_from_handle( scope );
133 if ( cr.GetClass() )
return 0;
134 assert( scope == (TCppScope_t)GLOBAL_HANDLE );
135 return gClassTable->Classes();
138 std::string Cppyy::GetScopeName( TCppScope_t parent, TCppIndex_t iscope )
141 TClassRef& cr = type_from_handle( parent );
142 if ( cr.GetClass() )
return 0;
143 assert( parent == (TCppScope_t)GLOBAL_HANDLE );
144 std::string name = gClassTable->At( iscope );
145 if ( name.find(
"::") == std::string::npos )
150 std::string Cppyy::GetName(
const std::string& name )
152 if( name.size() == 0)
return name;
155 for ( std::string::size_type pos = name.size() - 1; pos > 0; pos-- ) {
156 std::string::value_type c = name[pos];
163 else if ( tpl_open == 0 && c ==
':'&& name[ pos - 1 ] ==
':' ) {
165 return name.substr( pos+1 );
171 std::string Cppyy::ResolveName(
const std::string& cppitem_name )
174 std::string tclean = TClassEdit::CleanType( cppitem_name.c_str() );
176 TDataType* dt = gROOT->GetType( tclean.c_str() );
177 if ( dt )
return dt->GetFullTypeName();
178 return TClassEdit::ResolveTypedef( tclean.c_str(), true );
181 std::string Cppyy::ResolveEnum(
const TEnum* en)
184 auto ut = en->GetUnderlyingType();
185 if (ut != EDataType::kNumDataTypes)
186 return TDataType::GetTypeName(ut);
192 std::string Cppyy::ResolveEnum(
const std::string& enum_type)
194 return ResolveEnum(TEnum::GetEnum(enum_type.c_str()));
197 Cppyy::TCppScope_t Cppyy::GetScope(
const std::string& sname )
199 std::string scope_name;
200 if ( sname.find(
"std::", 0, 5 ) == 0 )
201 scope_name = sname.substr( 5, std::string::npos );
205 scope_name = ResolveName( scope_name );
206 auto icr = g_name2classrefidx.find( scope_name );
207 if ( icr != g_name2classrefidx.end() )
208 return (TCppType_t)icr->second;
211 TClassRef cr( TClass::GetClass( scope_name.c_str(), kTRUE, kTRUE ) );
212 if ( !cr.GetClass() )
213 return (TCppScope_t)NULL;
217 ClassRefs_t::size_type sz = g_classrefs.size();
218 g_name2classrefidx[ scope_name ] = sz;
219 g_classrefs.push_back( TClassRef( scope_name.c_str() ) );
220 return (TCppScope_t)sz;
223 Cppyy::TCppType_t Cppyy::GetTemplate(
const std::string& )
225 return (TCppType_t)0;
228 Cppyy::TCppType_t Cppyy::GetActualClass( TCppType_t klass, TCppObject_t obj )
230 TClassRef& cr = type_from_handle( klass );
231 TClass* clActual = cr->GetActualClass( (
void*)obj );
232 if ( clActual && clActual != cr.GetClass() ) {
234 return (TCppType_t)GetScope( clActual->GetName() );
239 size_t Cppyy::SizeOf( TCppType_t klass )
241 TClassRef& cr = type_from_handle( klass );
242 if ( cr.GetClass() )
return (
size_t)cr->Size();
246 Bool_t Cppyy::IsBuiltin(
const std::string& type_name )
248 TDataType* dt = gROOT->GetType( TClassEdit::CleanType( type_name.c_str(), 1 ).c_str() );
249 if ( dt )
return dt->GetType() != kOther_t;
253 Bool_t Cppyy::IsComplete(
const std::string& type_name )
258 Int_t oldEIL = gErrorIgnoreLevel;
259 gErrorIgnoreLevel = 3000;
260 TClass* klass = TClass::GetClass( TClassEdit::ShortType( type_name.c_str(), 1 ).c_str() );
261 if ( klass && klass->GetClassInfo() )
262 b = gInterpreter->ClassInfo_IsLoaded( klass->GetClassInfo() );
264 ClassInfo_t* ci = gInterpreter->ClassInfo_Factory( type_name.c_str() );
266 b = gInterpreter->ClassInfo_IsLoaded( ci );
267 gInterpreter->ClassInfo_Delete( ci );
270 gErrorIgnoreLevel = oldEIL;
275 Cppyy::TCppObject_t Cppyy::Allocate( TCppType_t type )
277 TClassRef& cr = type_from_handle( type );
278 return (TCppObject_t)malloc( cr->Size() );
281 void Cppyy::Deallocate( TCppType_t , TCppObject_t instance )
286 Cppyy::TCppObject_t Cppyy::Construct( TCppType_t type )
288 TClassRef& cr = type_from_handle( type );
289 return (TCppObject_t)cr->New();
292 void Cppyy::Destruct( TCppType_t type, TCppObject_t instance )
294 TClassRef& cr = type_from_handle( type );
295 cr->Destructor( (
void*)instance );
300 static inline ClassInfo_t* GetGlobalNamespaceInfo()
302 static ClassInfo_t* gcl = gInterpreter->ClassInfo_Factory();
306 static CallFunc_t* GetCallFunc( Cppyy::TCppMethod_t method )
308 auto icf = g_method2callfunc.find( method );
309 if ( icf != g_method2callfunc.end() )
312 CallFunc_t* callf =
nullptr;
313 TFunction* func = (TFunction*)method;
314 std::string callString =
"";
317 Cppyy::TCppScope_t scope = declaring_scope( method );
318 const TClassRef& klass = type_from_handle( scope );
319 if ( klass.GetClass() || (func && scope == GLOBAL_HANDLE) ) {
320 ClassInfo_t* gcl = klass.GetClass() ? klass->GetClassInfo() :
nullptr;
322 gcl = GetGlobalNamespaceInfo();
324 TCollection* method_args = func->GetListOfMethodArgs();
325 TIter iarg( method_args );
327 TMethodArg* method_arg = 0;
328 while ((method_arg = (TMethodArg*)iarg.Next())) {
329 std::string fullType = method_arg->GetTypeNormalizedName();
330 if ( callString.empty() )
331 callString = fullType;
333 callString +=
", " + fullType;
337 callf = gInterpreter->CallFunc_Factory();
339 gInterpreter->CallFunc_SetFuncProto(
342 func ? func->GetName() : klass->GetName(),
344 func ? (func->Property() & kIsConstMethod) : kFALSE,
353 if ( ! gInterpreter->CallFunc_IsValid( callf ) ) {
354 gInterpreter->CallFunc_SetFuncProto(
357 func ? func->GetName() : klass->GetName(),
359 func ? (func->Property() & kIsConstMethod) : kFALSE,
366 if ( !( callf && gInterpreter->CallFunc_IsValid( callf ) ) ) {
367 PyErr_Format( PyExc_RuntimeError,
"could not resolve %s::%s(%s)",
368 const_cast<TClassRef&>(klass).GetClassName(),
369 func ? func->GetName() :
const_cast<TClassRef&
>(klass).GetClassName(),
370 callString.c_str() );
371 if ( callf ) gInterpreter->CallFunc_Delete( callf );
375 g_method2callfunc[ method ] = callf;
379 static inline void copy_args(
void* args_,
void** vargs ) {
380 std::vector<TParameter>& args = *(std::vector<TParameter>*)args_;
381 for ( std::vector<TParameter>::size_type i = 0; i < args.size(); ++i ) {
382 switch ( args[i].fTypeCode ) {
384 vargs[i] = (
void*)&args[i].fValue.fLong;
387 vargs[i] = (
void*)&args[i].fValue.fFloat;
390 vargs[i] = (
void*)&args[i].fValue.fDouble;
393 vargs[i] = (
void*)&args[i].fValue.fLongDouble;
399 vargs[i] = (
void*)&args[i].fValue.fVoidp;
402 vargs[i] = args[i].fValue.fVoidp;
405 vargs[i] = args[i].fRef;
408 std::cerr <<
"unknown type code: " << args[i].fTypeCode << std::endl;
415 Cppyy::TCppMethod_t method,
void* args_,
void*
self,
void* result )
417 const std::vector<TParameter>& args = *(std::vector<TParameter>*)args_;
419 CallFunc_t* callf = GetCallFunc( method );
423 TInterpreter::CallFuncIFacePtr_t faceptr = gCling->CallFunc_IFacePtr( callf );
424 if ( faceptr.fKind == TInterpreter::CallFuncIFacePtr_t::kGeneric ) {
425 if ( args.size() <= SMALL_ARGS_N ) {
426 void* smallbuf[SMALL_ARGS_N];
427 copy_args( args_, smallbuf );
428 faceptr.fGeneric(
self, args.size(), smallbuf, result );
430 std::vector<void*> buf( args.size() );
431 copy_args( args_, buf.data() );
432 faceptr.fGeneric(
self, args.size(), buf.data(), result );
437 if ( faceptr.fKind == TInterpreter::CallFuncIFacePtr_t::kCtor ) {
438 if ( args.size() <= SMALL_ARGS_N ) {
439 void* smallbuf[SMALL_ARGS_N];
440 copy_args( args_, (
void**)smallbuf );
441 faceptr.fCtor( (
void**)smallbuf, result, args.size() );
443 std::vector<void*> buf( args.size() );
444 copy_args( args_, buf.data() );
445 faceptr.fCtor( buf.data(), result, args.size() );
450 if ( faceptr.fKind == TInterpreter::CallFuncIFacePtr_t::kDtor ) {
451 std::cerr <<
" DESTRUCTOR NOT IMPLEMENTED YET! " << std::endl;
458 template<
typename T >
459 static inline T CallT( Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self,
void* args )
462 if ( FastCall( method, args, (
void*)
self, &t ) )
467 #define CPPYY_IMP_CALL( typecode, rtype ) \
468 rtype Cppyy::Call##typecode( TCppMethod_t method, TCppObject_t self, void* args )\
470 return CallT< rtype >( method, self, args ); \
473 void Cppyy::CallV( TCppMethod_t method, TCppObject_t
self,
void* args )
475 if ( ! FastCall( method, args, (
void*)
self,
nullptr ) )
479 CPPYY_IMP_CALL( B, UChar_t )
480 CPPYY_IMP_CALL( C, Char_t )
481 CPPYY_IMP_CALL( H, Short_t )
482 CPPYY_IMP_CALL( I, Int_t )
483 CPPYY_IMP_CALL( L, Long_t )
484 CPPYY_IMP_CALL( LL, Long64_t )
485 CPPYY_IMP_CALL( F, Float_t )
486 CPPYY_IMP_CALL( D, Double_t )
487 CPPYY_IMP_CALL( LD, LongDouble_t )
489 void* Cppyy::CallR( TCppMethod_t method, TCppObject_t self,
void* args )
492 if ( FastCall( method, args, (
void*)
self, &r ) )
497 Char_t* Cppyy::CallS( TCppMethod_t method, TCppObject_t
self,
void* args )
500 if ( FastCall( method, args, (
void*)
self, &s ) )
505 Cppyy::TCppObject_t Cppyy::CallConstructor(
506 TCppMethod_t method, TCppType_t ,
void* args ) {
508 if ( FastCall( method, args,
nullptr, &obj ) )
509 return (TCppObject_t)obj;
510 return (TCppObject_t)0;
513 void Cppyy::CallDestructor( TCppType_t type, TCppObject_t
self )
515 TClassRef& cr = type_from_handle( type );
516 cr->Destructor( (
void*)
self, kTRUE );
519 Cppyy::TCppObject_t Cppyy::CallO( TCppMethod_t method,
520 TCppObject_t
self,
void* args, TCppType_t result_type )
522 TClassRef& cr = type_from_handle( result_type );
523 size_t s = gInterpreter->ClassInfo_Size(cr->GetClassInfo());
524 void* obj = malloc( s );
525 if ( FastCall( method, args,
self, obj ) )
526 return (TCppObject_t)obj;
527 return (TCppObject_t)0;
530 Cppyy::TCppMethPtrGetter_t Cppyy::GetMethPtrGetter(
531 TCppScope_t , TCppIndex_t )
533 return (TCppMethPtrGetter_t)0;
538 void* Cppyy::AllocateFunctionArgs(
size_t nargs )
540 return new TParameter[nargs];
543 void Cppyy::DeallocateFunctionArgs(
void* args )
545 delete [] (TParameter*)args;
548 size_t Cppyy::GetFunctionArgSizeof()
550 return sizeof( TParameter );
553 size_t Cppyy::GetFunctionArgTypeoffset()\
555 return offsetof( TParameter, fTypeCode );
560 Bool_t Cppyy::IsNamespace( TCppScope_t scope ) {
562 if (scope == GLOBAL_HANDLE)
565 TClassRef& cr = type_from_handle( scope );
567 return cr->Property() & kIsNamespace;
571 Bool_t Cppyy::IsAbstract( TCppType_t klass ) {
573 TClassRef& cr = type_from_handle( klass );
575 return cr->Property() & kIsAbstract;
579 Bool_t Cppyy::IsEnum(
const std::string& type_name ) {
580 return gInterpreter->ClassInfo_IsEnum( type_name.c_str() );
585 std::string Cppyy::GetFinalName( TCppType_t klass )
587 if ( klass == GLOBAL_HANDLE )
590 TClassRef& cr = type_from_handle( klass );
591 return cr->GetName();
594 std::string Cppyy::GetScopedFinalName( TCppType_t klass )
597 TClassRef& cr = type_from_handle( klass );
598 return cr->GetName();
601 Bool_t Cppyy::HasComplexHierarchy( TCppType_t )
607 Cppyy::TCppIndex_t Cppyy::GetNumBases( TCppType_t klass )
610 TClassRef& cr = type_from_handle( klass );
611 if ( cr.GetClass() && cr->GetListOfBases() != 0 )
612 return cr->GetListOfBases()->GetSize();
616 std::string Cppyy::GetBaseName( TCppType_t klass, TCppIndex_t ibase )
618 TClassRef& cr = type_from_handle( klass );
619 return ((TBaseClass*)cr->GetListOfBases()->At( ibase ))->GetName();
622 Bool_t Cppyy::IsSubtype( TCppType_t derived, TCppType_t base )
624 if ( derived == base )
626 TClassRef& derived_type = type_from_handle( derived );
627 TClassRef& base_type = type_from_handle( base );
628 return derived_type->GetBaseClass( base_type ) != 0;
631 void Cppyy::AddSmartPtrType(
const std::string& type_name ) {
632 gSmartPtrTypes.insert( ResolveName( type_name ) );
635 Bool_t Cppyy::IsSmartPtr(
const std::string& type_name ) {
638 const std::string& real_name = ResolveName( type_name );
639 return gSmartPtrTypes.find(
640 real_name.substr( 0,real_name.find(
"<" ) ) ) != gSmartPtrTypes.end();
644 ptrdiff_t Cppyy::GetBaseOffset( TCppType_t derived, TCppType_t base,
645 TCppObject_t address,
int direction,
bool rerror )
648 if ( derived == base || !(base && derived) )
651 TClassRef& cd = type_from_handle( derived );
652 TClassRef& cb = type_from_handle( base );
654 if ( !cd.GetClass() || !cb.GetClass() )
658 if ( ! (cd->GetClassInfo() && cb->GetClassInfo()) ) {
662 if ( cd->IsLoaded() ) {
664 std::ostringstream msg;
665 msg <<
"failed offset calculation between " << cb->GetName() <<
" and " << cd->GetName();
666 PyErr_Warn( PyExc_RuntimeWarning, const_cast<char*>( msg.str().c_str() ) );
670 return rerror ? (ptrdiff_t)offset : 0;
673 offset = gInterpreter->ClassInfo_GetBaseOffset(
674 cd->GetClassInfo(), cb->GetClassInfo(), (
void*)address, direction > 0 );
676 return rerror ? (ptrdiff_t)offset : 0;
678 return (ptrdiff_t)(direction < 0 ? -offset : offset);
683 Cppyy::TCppIndex_t Cppyy::GetNumMethods( TCppScope_t scope )
685 TClassRef& cr = type_from_handle( scope );
686 if ( cr.GetClass() && cr->GetListOfMethods() ) {
687 Cppyy::TCppIndex_t nMethods = (TCppIndex_t)cr->GetListOfMethods()->GetSize();
688 if ( nMethods == (TCppIndex_t)0 ) {
689 std::string clName = GetScopedFinalName( scope );
690 if ( clName.find(
'<' ) != std::string::npos ) {
692 if ( TClass::GetClass( (
"std::" + clName).c_str() ) )
693 clName =
"std::" + clName;
694 std::ostringstream stmt;
695 stmt <<
"template class " << clName <<
";";
696 gInterpreter->Declare( stmt.str().c_str() );
698 return (TCppIndex_t)cr->GetListOfMethods( kTRUE )->GetSize();
702 }
else if ( scope == (TCppScope_t)GLOBAL_HANDLE ) {
704 return (TCppIndex_t)0;
706 return (TCppIndex_t)0;
709 Cppyy::TCppIndex_t Cppyy::GetMethodIndexAt( TCppScope_t , TCppIndex_t )
711 return (TCppIndex_t)0;
714 std::vector< Cppyy::TCppMethod_t > Cppyy::GetMethodsFromName(
715 TCppScope_t scope,
const std::string& name,
bool alsoInBases )
720 std::vector< TCppMethod_t > methods;
721 if ( scope == GLOBAL_HANDLE ) {
722 TCollection* funcs = gROOT->GetListOfGlobalFunctions( kTRUE );
723 g_globalfuncs.reserve(funcs->GetSize());
728 while ( (func = (TFunction*)ifunc.Next()) ) {
730 std::string fn = func->GetName();
731 if ( fn.rfind( name, 0 ) == 0 ) {
733 if ( (name.size() == fn.size()) ||
734 (name.size() < fn.size() && fn[name.size()] ==
'<') ) {
735 methods.push_back( (TCppMethod_t)func );
740 TClassRef& cr = type_from_handle( scope );
741 if ( cr.GetClass() ) {
743 TMethod* m = alsoInBases ? cr->GetMethodAllAny( name.c_str() ) : cr->GetMethodAny( name.c_str() );
744 if ( m ) methods.push_back( (TCppMethod_t)m );
751 Cppyy::TCppMethod_t Cppyy::GetMethod( TCppScope_t scope, TCppIndex_t imeth )
753 TFunction* f = type_get_method( scope, imeth );
754 return (Cppyy::TCppMethod_t)f;
757 std::string Cppyy::GetMethodName( TCppMethod_t method )
760 std::string name = ((TFunction*)method)->GetName();
768 std::string Cppyy::GetMethodResultType( TCppMethod_t method )
771 TFunction* f = (TFunction*)method;
772 if ( f->ExtraProperty() & kIsConstructor )
773 return "constructor";
774 return f->GetReturnTypeNormalizedName();
779 Cppyy::TCppIndex_t Cppyy::GetMethodNumArgs( TCppMethod_t method )
782 return ((TFunction*)method)->GetNargs();
786 Cppyy::TCppIndex_t Cppyy::GetMethodReqArgs( TCppMethod_t method )
789 TFunction* f = (TFunction*)method;
790 return (TCppIndex_t)(f->GetNargs() - f->GetNargsOpt());
792 return (TCppIndex_t)0;
795 std::string Cppyy::GetMethodArgName( TCppMethod_t method,
int iarg )
798 TFunction* f = (TFunction*)method;
799 TMethodArg* arg = (TMethodArg*)f->GetListOfMethodArgs()->At( iarg );
800 return arg->GetName();
805 std::string Cppyy::GetMethodArgType( TCppMethod_t method,
int iarg )
808 TFunction* f = (TFunction*)method;
809 TMethodArg* arg = (TMethodArg*)f->GetListOfMethodArgs()->At( iarg );
810 return arg->GetTypeNormalizedName();
815 std::string Cppyy::GetMethodArgDefault( TCppMethod_t method,
int iarg )
818 TFunction* f = (TFunction*)method;
819 TMethodArg* arg = (TMethodArg*)f->GetListOfMethodArgs()->At( iarg );
820 const char* def = arg->GetDefault();
828 std::string Cppyy::GetMethodSignature( TCppScope_t , TCppIndex_t )
833 Bool_t Cppyy::IsConstMethod( TCppMethod_t method )
836 TFunction* f = (TFunction*)method;
837 return f->Property() & kIsConstMethod;
843 bool Cppyy::ExistsMethodTemplate(TCppScope_t scope,
const std::string& name)
845 if (scope == (TCppScope_t)GLOBAL_HANDLE) {
846 return (
bool)gROOT->GetFunctionTemplate(name.c_str());
848 TClassRef& cr = type_from_handle(scope);
850 return (
bool)cr->GetFunctionTemplate(name.c_str());
856 Cppyy::TCppMethod_t Cppyy::GetMethodTemplate(
857 TCppScope_t scope,
const std::string& name,
const std::string& proto)
859 if (scope == (TCppScope_t)GLOBAL_HANDLE) {
860 return (TCppMethod_t)gROOT->GetGlobalFunctionWithPrototype(name.c_str(), proto.c_str());
862 TClassRef& cr = type_from_handle(scope);
864 return (TCppMethod_t)cr->GetMethodWithPrototype(name.c_str(), proto.c_str());
867 return (TCppMethod_t)
nullptr;
870 Bool_t Cppyy::IsMethodTemplate( TCppMethod_t method )
873 TFunction* f = (TFunction*)method;
874 std::string name = f->GetName();
875 return (name[name.size()-1] ==
'>') && (name.find(
'<') != std::string::npos);
880 Cppyy::TCppIndex_t Cppyy::GetMethodNumTemplateArgs(
881 TCppScope_t , TCppIndex_t )
883 return (TCppIndex_t)0;
886 std::string Cppyy::GetMethodTemplateArgName(
887 TCppScope_t , TCppIndex_t , TCppIndex_t )
892 Cppyy::TCppIndex_t Cppyy::GetGlobalOperator(
893 TCppScope_t , TCppType_t , TCppType_t ,
const std::string& )
895 return (TCppIndex_t)0;
899 Bool_t Cppyy::IsConstructor( TCppMethod_t method )
902 TFunction* f = (TFunction*)method;
903 return f->ExtraProperty() & kIsConstructor;
908 Bool_t Cppyy::IsPublicMethod( TCppMethod_t method )
911 TFunction* f = (TFunction*)method;
912 return f->Property() & kIsPublic;
917 Bool_t Cppyy::IsStaticMethod( TCppMethod_t method )
920 TFunction* f = (TFunction*)method;
921 return f->Property() & kIsStatic;
927 Cppyy::TCppIndex_t Cppyy::GetNumDatamembers( TCppScope_t scope )
929 TClassRef& cr = type_from_handle( scope );
930 if ( cr.GetClass() && cr->GetListOfDataMembers() )
931 return cr->GetListOfDataMembers()->GetSize();
932 else if ( scope == (TCppScope_t)GLOBAL_HANDLE ) {
933 std::cerr <<
" global data should be retrieved lazily " << std::endl;
934 TCollection* vars = gROOT->GetListOfGlobals( kTRUE );
935 if ( g_globalvars.size() != (GlobalVars_t::size_type)vars->GetSize() ) {
936 g_globalvars.clear();
937 g_globalvars.reserve(vars->GetSize());
942 while ( (var = (TGlobal*)ivar.Next()) )
943 g_globalvars.push_back( var );
945 return (TCppIndex_t)g_globalvars.size();
947 return (TCppIndex_t)0;
950 std::string Cppyy::GetDatamemberName( TCppScope_t scope, TCppIndex_t idata )
952 TClassRef& cr = type_from_handle( scope );
954 TDataMember* m = (TDataMember*)cr->GetListOfDataMembers()->At( idata );
957 assert( scope == (TCppScope_t)GLOBAL_HANDLE );
958 TGlobal* gbl = g_globalvars[ idata ];
959 return gbl->GetName();
962 std::string Cppyy::GetDatamemberType( TCppScope_t scope, TCppIndex_t idata )
964 if ( scope == GLOBAL_HANDLE ) {
965 TGlobal* gbl = g_globalvars[ idata ];
966 std::string fullType = gbl->GetFullTypeName();
967 if ( fullType[fullType.size()-1] ==
'*' && \
968 fullType.find(
"char", 0, 4 ) == std::string::npos )
969 fullType.append(
"*" );
970 else if ( (
int)gbl->GetArrayDim() > 1 )
971 fullType.append(
"*" );
972 else if ( (
int)gbl->GetArrayDim() == 1 ) {
973 std::ostringstream s;
974 s <<
'[' << gbl->GetMaxIndex( 0 ) <<
']' << std::ends;
975 fullType.append( s.str() );
980 TClassRef& cr = type_from_handle( scope );
981 if ( cr.GetClass() ) {
982 TDataMember* m = (TDataMember*)cr->GetListOfDataMembers()->At( idata );
983 std::string fullType = m->GetTrueTypeName();
984 if ( (
int)m->GetArrayDim() > 1 || (!m->IsBasic() && m->IsaPointer()) )
985 fullType.append(
"*" );
986 else if ( (
int)m->GetArrayDim() == 1 ) {
987 std::ostringstream s;
988 s <<
'[' << m->GetMaxIndex( 0 ) <<
']' << std::ends;
989 fullType.append( s.str() );
997 ptrdiff_t Cppyy::GetDatamemberOffset( TCppScope_t scope, TCppIndex_t idata )
999 if ( scope == GLOBAL_HANDLE ) {
1000 TGlobal* gbl = g_globalvars[ idata ];
1001 return (ptrdiff_t)gbl->GetAddress();
1004 TClassRef& cr = type_from_handle( scope );
1005 if ( cr.GetClass() ) {
1006 TDataMember* m = (TDataMember*)cr->GetListOfDataMembers()->At( idata );
1007 return (ptrdiff_t)m->GetOffsetCint();
1010 return (ptrdiff_t)0;
1013 Cppyy::TCppIndex_t Cppyy::GetDatamemberIndex( TCppScope_t scope,
const std::string& name )
1015 if ( scope == GLOBAL_HANDLE ) {
1016 TGlobal* gb = (TGlobal*)gROOT->GetListOfGlobals( kTRUE )->FindObject( name.c_str() );
1017 if ( gb && gb->GetAddress() && gb->GetAddress() != (
void*)-1 ) {
1018 g_globalvars.push_back( gb );
1019 return g_globalvars.size() - 1;
1023 TClassRef& cr = type_from_handle( scope );
1024 if ( cr.GetClass() ) {
1026 (TDataMember*)cr->GetListOfDataMembers()->FindObject( name.c_str() );
1028 if ( dm )
return (TCppIndex_t)cr->GetListOfDataMembers()->IndexOf( dm );
1032 return (TCppIndex_t)-1;
1037 Bool_t Cppyy::IsPublicData( TCppScope_t scope, TCppIndex_t idata )
1039 if ( scope == GLOBAL_HANDLE )
1041 TClassRef& cr = type_from_handle( scope );
1042 if ( cr->Property() & kIsNamespace )
1044 TDataMember* m = (TDataMember*)cr->GetListOfDataMembers()->At( idata );
1045 return m->Property() & kIsPublic;
1048 Bool_t Cppyy::IsStaticData( TCppScope_t scope, TCppIndex_t idata )
1050 if ( scope == GLOBAL_HANDLE )
1052 TClassRef& cr = type_from_handle( scope );
1053 if ( cr->Property() & kIsNamespace )
1055 TDataMember* m = (TDataMember*)cr->GetListOfDataMembers()->At( idata );
1056 return m->Property() & kIsStatic;
1059 Bool_t Cppyy::IsConstData( TCppScope_t scope, TCppIndex_t idata )
1061 if ( scope == GLOBAL_HANDLE ) {
1062 TGlobal* gbl = g_globalvars[ idata ];
1063 return gbl->Property() & kIsConstant;
1065 TClassRef& cr = type_from_handle( scope );
1066 if ( cr.GetClass() ) {
1067 TDataMember* m = (TDataMember*)cr->GetListOfDataMembers()->At( idata );
1068 return m->Property() & kIsConstant;
1073 Bool_t Cppyy::IsEnumData( TCppScope_t scope, TCppIndex_t idata )
1075 if ( scope == GLOBAL_HANDLE ) {
1076 TGlobal* gbl = g_globalvars[ idata ];
1077 return gbl->Property() & kIsEnum;
1079 TClassRef& cr = type_from_handle( scope );
1080 if ( cr.GetClass() ) {
1081 TDataMember* m = (TDataMember*)cr->GetListOfDataMembers()->At( idata );
1082 return m->Property() & kIsEnum;
1087 Int_t Cppyy::GetDimensionSize( TCppScope_t scope, TCppIndex_t idata,
int dimension )
1089 if ( scope == GLOBAL_HANDLE ) {
1090 TGlobal* gbl = g_globalvars[ idata ];
1091 return gbl->GetMaxIndex( dimension );
1093 TClassRef& cr = type_from_handle( scope );
1094 if ( cr.GetClass() ) {
1095 TDataMember* m = (TDataMember*)cr->GetListOfDataMembers()->At( idata );
1096 return m->GetMaxIndex( dimension );
1102 Cppyy::TCppEnum_t Cppyy::GetEnum(TCppScope_t scope,
const std::string& enum_name)
1104 if (scope == GLOBAL_HANDLE)
1105 return (TCppEnum_t)gROOT->GetListOfEnums(kTRUE)->FindObject(enum_name.c_str());
1107 TClassRef& cr = type_from_handle(scope);
1109 return (TCppEnum_t)cr->GetListOfEnums(kTRUE)->FindObject(enum_name.c_str());
1111 return (TCppEnum_t)0;
1114 Cppyy::TCppIndex_t Cppyy::GetNumEnumData(TCppEnum_t etype)
1116 return (TCppIndex_t)((TEnum*)etype)->GetConstants()->GetSize();
1119 std::string Cppyy::GetEnumDataName(TCppEnum_t etype, TCppIndex_t idata)
1121 return ((TEnumConstant*)((TEnum*)etype)->GetConstants()->At(idata))->GetName();
1124 long long Cppyy::GetEnumDataValue(TCppEnum_t etype, TCppIndex_t idata)
1126 TEnumConstant* ecst = (TEnumConstant*)((TEnum*)etype)->GetConstants()->At(idata);
1127 return (
long long)ecst->GetValue();