25 typedef TExecutor* (*ExecutorFactory_t) ();
26 typedef std::map< std::string, ExecutorFactory_t > ExecFactories_t;
27 ExecFactories_t gExecFactories;
29 R__EXTERN PyObject* gNullPtrObject;
38 GILControl( PyROOT::TCallContext* ctxt ) :
39 fSave( nullptr ), fRelease( ReleasesGIL( ctxt ) ) {
41 if ( fRelease ) fSave = PyEval_SaveThread();
46 if ( fRelease ) PyEval_RestoreThread( fSave );
56 #define PYROOT_IMPL_GILCALL( rtype, tcode ) \
57 static inline rtype GILCall##tcode( \
58 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t self, PyROOT::TCallContext* ctxt ) {\
59 GILControl gc( ctxt ); \
60 return Cppyy::Call##tcode( method, self, &ctxt->fArgs ); \
63 PYROOT_IMPL_GILCALL(
void, V )
64 PYROOT_IMPL_GILCALL( UChar_t, B )
65 PYROOT_IMPL_GILCALL( Char_t, C )
66 PYROOT_IMPL_GILCALL( Short_t, H )
67 PYROOT_IMPL_GILCALL( Int_t, I )
68 PYROOT_IMPL_GILCALL( Long_t, L )
69 PYROOT_IMPL_GILCALL( Long64_t, LL )
70 PYROOT_IMPL_GILCALL( Float_t, F )
71 PYROOT_IMPL_GILCALL( Double_t, D )
72 PYROOT_IMPL_GILCALL( LongDouble_t, LD )
73 PYROOT_IMPL_GILCALL(
void*, R )
74 PYROOT_IMPL_GILCALL( Char_t*, S )
76 static inline Cppyy::TCppObject_t GILCallO( Cppyy::TCppMethod_t method,
77 Cppyy::TCppObject_t self, PyROOT::TCallContext* ctxt, Cppyy::TCppType_t klass ) {
78 GILControl gc( ctxt );
79 return Cppyy::CallO( method,
self, &ctxt->fArgs, klass );
82 static inline Cppyy::TCppObject_t GILCallConstructor(
83 Cppyy::TCppMethod_t method, Cppyy::TCppType_t klass, PyROOT::TCallContext* ctxt ) {
84 GILControl gc( ctxt );
85 return Cppyy::CallConstructor( method, klass, &ctxt->fArgs );
88 static inline PyObject* PyROOT_PyUnicode_FromInt( Int_t c ) {
90 if ( c < 0 )
return PyROOT_PyUnicode_FromFormat(
"%c", 256 - std::abs(c));
91 return PyROOT_PyUnicode_FromFormat(
"%c", c );
94 static inline PyObject* PyROOT_PyBool_FromInt( Int_t b ) {
95 PyObject* result = (Bool_t)b ? Py_True : Py_False;
102 PyObject* PyROOT::TBoolExecutor::Execute(
103 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
106 Bool_t retval = GILCallB( method,
self, ctxt );
107 PyObject* result = retval ? Py_True : Py_False;
115 PyObject* PyROOT::TBoolConstRefExecutor::Execute(
116 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
118 return PyROOT_PyBool_FromInt( *((Bool_t*)GILCallR( method,
self, ctxt )) );
125 PyObject* PyROOT::TCharExecutor::Execute(
126 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
128 return PyROOT_PyUnicode_FromInt( (Int_t)GILCallC( method,
self, ctxt ) );
135 PyObject* PyROOT::TCharConstRefExecutor::Execute(
136 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
138 return PyROOT_PyUnicode_FromInt( *((Char_t*)GILCallR( method,
self, ctxt )) );
145 PyObject* PyROOT::TUCharExecutor::Execute(
146 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
148 return PyROOT_PyUnicode_FromInt( (UChar_t)GILCallB( method,
self, ctxt ) );
155 PyObject* PyROOT::TUCharConstRefExecutor::Execute(
156 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
158 return PyROOT_PyUnicode_FromInt( *((UChar_t*)GILCallR( method,
self, ctxt )) );
164 PyObject* PyROOT::TIntExecutor::Execute(
165 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
167 return PyInt_FromLong( (Int_t)GILCallI( method,
self, ctxt ) );
173 PyObject* PyROOT::TShortExecutor::Execute(
174 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
176 return PyInt_FromLong( (Short_t)GILCallH( method,
self, ctxt ) );
182 PyObject* PyROOT::TLongExecutor::Execute(
183 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
185 return PyLong_FromLong( (Long_t)GILCallL( method,
self, ctxt ) );
191 PyObject* PyROOT::TULongExecutor::Execute(
192 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
194 return PyLong_FromUnsignedLong( (ULong_t)GILCallLL( method,
self, ctxt ) );
200 PyObject* PyROOT::TLongLongExecutor::Execute(
201 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
203 Long64_t result = GILCallLL( method,
self, ctxt );
204 return PyLong_FromLongLong( result );
210 PyObject* PyROOT::TULongLongExecutor::Execute(
211 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
213 ULong64_t result = (ULong64_t)GILCallLL( method,
self, ctxt );
214 return PyLong_FromUnsignedLongLong( result );
220 PyObject* PyROOT::TFloatExecutor::Execute(
221 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
223 return PyFloat_FromDouble( (Double_t)GILCallF( method,
self, ctxt ) );
229 PyObject* PyROOT::TDoubleExecutor::Execute(
230 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
232 return PyFloat_FromDouble( (Double_t)GILCallD( method,
self, ctxt ) );
238 PyObject* PyROOT::TLongDoubleExecutor::Execute(
239 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
241 return PyFloat_FromDouble( (Double_t)GILCallLD( method,
self, ctxt ) );
247 Bool_t PyROOT::TRefExecutor::SetAssignable( PyObject* pyobject )
249 if ( pyobject != 0 ) {
250 Py_INCREF( pyobject );
251 fAssignable = pyobject;
261 #define PYROOT_IMPLEMENT_BASIC_REFEXECUTOR( name, type, stype, F1, F2 ) \
262 PyObject* PyROOT::T##name##RefExecutor::Execute( \
263 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t self, TCallContext* ctxt )\
265 type* ref = (type*)GILCallR( method, self, ctxt ); \
266 if ( ! fAssignable ) \
267 return F1( (stype)*ref ); \
269 *ref = (type)F2( fAssignable ); \
270 Py_DECREF( fAssignable ); \
272 Py_INCREF( Py_None ); \
277 PYROOT_IMPLEMENT_BASIC_REFEXECUTOR( Bool, Bool_t, Long_t, PyROOT_PyBool_FromInt, PyLong_AsLong )
278 PYROOT_IMPLEMENT_BASIC_REFEXECUTOR( Char, Char_t, Long_t, PyROOT_PyUnicode_FromInt, PyLong_AsLong )
279 PYROOT_IMPLEMENT_BASIC_REFEXECUTOR( UChar, UChar_t, ULong_t, PyROOT_PyUnicode_FromInt, PyLongOrInt_AsULong )
280 PYROOT_IMPLEMENT_BASIC_REFEXECUTOR( Short, Short_t, Long_t, PyInt_FromLong, PyLong_AsLong )
281 PYROOT_IMPLEMENT_BASIC_REFEXECUTOR( UShort, UShort_t, ULong_t, PyInt_FromLong, PyLongOrInt_AsULong )
282 PYROOT_IMPLEMENT_BASIC_REFEXECUTOR( Int, Int_t, Long_t, PyInt_FromLong, PyLong_AsLong )
283 PYROOT_IMPLEMENT_BASIC_REFEXECUTOR( UInt, UInt_t, ULong_t, PyLong_FromUnsignedLong, PyLongOrInt_AsULong )
284 PYROOT_IMPLEMENT_BASIC_REFEXECUTOR( Long, Long_t, Long_t, PyLong_FromLong, PyLong_AsLong )
285 PYROOT_IMPLEMENT_BASIC_REFEXECUTOR( ULong, ULong_t, ULong_t, PyLong_FromUnsignedLong, PyLongOrInt_AsULong )
286 PYROOT_IMPLEMENT_BASIC_REFEXECUTOR(
287 LongLong, Long64_t, Long64_t, PyLong_FromLongLong, PyLong_AsLongLong )
288 PYROOT_IMPLEMENT_BASIC_REFEXECUTOR(
289 ULongLong, ULong64_t, ULong64_t, PyLong_FromUnsignedLongLong, PyLongOrInt_AsULong64 )
290 PYROOT_IMPLEMENT_BASIC_REFEXECUTOR( Float, Float_t, Double_t, PyFloat_FromDouble, PyFloat_AsDouble )
291 PYROOT_IMPLEMENT_BASIC_REFEXECUTOR( Double, Double_t, Double_t, PyFloat_FromDouble, PyFloat_AsDouble )
292 PYROOT_IMPLEMENT_BASIC_REFEXECUTOR(
293 LongDouble, LongDouble_t, LongDouble_t, PyFloat_FromDouble, PyFloat_AsDouble )
298 PyObject* PyROOT::TSTLStringRefExecutor::Execute(
299 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t self, TCallContext* ctxt )
301 if ( ! fAssignable ) {
302 std::string* result = (std::string*)GILCallR( method,
self, ctxt );
303 return PyROOT_PyUnicode_FromStringAndSize( result->c_str(), result->size() );
305 std::string* result = (std::string*)GILCallR( method,
self, ctxt );
306 *result = std::string(
307 PyROOT_PyUnicode_AsString( fAssignable ), PyROOT_PyUnicode_GET_SIZE( fAssignable ) );
309 Py_DECREF( fAssignable );
312 Py_INCREF( Py_None );
320 PyObject* PyROOT::TVoidExecutor::Execute(
321 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
323 GILCallV( method,
self, ctxt );
324 Py_INCREF( Py_None );
331 PyObject* PyROOT::TCStringExecutor::Execute(
332 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
334 char* result = (
char*)GILCallS( method,
self, ctxt );
336 Py_INCREF( PyStrings::gEmptyString );
337 return PyStrings::gEmptyString;
340 return PyROOT_PyUnicode_FromString( result );
345 PyObject* PyROOT::TVoidArrayExecutor::Execute(
346 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
349 Long_t* result = (Long_t*)GILCallR( method,
self, ctxt );
351 Py_INCREF( gNullPtrObject );
352 return gNullPtrObject;
354 return BufFac_t::Instance()->PyBuffer_FromMemory( result,
sizeof(
void*) );
359 #define PYROOT_IMPLEMENT_ARRAY_EXECUTOR( name, type ) \
360 PyObject* PyROOT::T##name##ArrayExecutor::Execute( \
361 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t self, TCallContext* ctxt )\
363 return BufFac_t::Instance()->PyBuffer_FromMemory( (type*)GILCallR( method, self, ctxt ) );\
366 PYROOT_IMPLEMENT_ARRAY_EXECUTOR( Bool, Bool_t )
367 PYROOT_IMPLEMENT_ARRAY_EXECUTOR( Short, Short_t )
368 PYROOT_IMPLEMENT_ARRAY_EXECUTOR( UShort, UShort_t )
369 PYROOT_IMPLEMENT_ARRAY_EXECUTOR( Char, Char_t )
370 PYROOT_IMPLEMENT_ARRAY_EXECUTOR( UChar, UChar_t )
371 PYROOT_IMPLEMENT_ARRAY_EXECUTOR( Int, Int_t )
372 PYROOT_IMPLEMENT_ARRAY_EXECUTOR( UInt, UInt_t )
373 PYROOT_IMPLEMENT_ARRAY_EXECUTOR( Long, Long_t )
374 PYROOT_IMPLEMENT_ARRAY_EXECUTOR( ULong, ULong_t )
375 PYROOT_IMPLEMENT_ARRAY_EXECUTOR( Float, Float_t )
376 PYROOT_IMPLEMENT_ARRAY_EXECUTOR( Double, Double_t )
380 PyObject* PyROOT::TSTLStringExecutor::Execute(
381 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t self, TCallContext* ctxt )
385 static Cppyy::TCppScope_t sSTLStringScope = Cppyy::GetScope(
"std::string" );
386 std::string* result = (std::string*)GILCallO( method,
self, ctxt, sSTLStringScope );
388 Py_INCREF( PyStrings::gEmptyString );
389 return PyStrings::gEmptyString;
393 PyROOT_PyUnicode_FromStringAndSize( result->c_str(), result->size() );
402 PyObject* PyROOT::TTGlobalExecutor::Execute(
403 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
405 return BindCppGlobal( (TGlobal*)GILCallR( method,
self, ctxt ) );
411 PyObject* PyROOT::TCppObjectExecutor::Execute(
412 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
414 return BindCppObject( (
void*)GILCallR( method,
self, ctxt ), fClass );
420 PyObject* PyROOT::TCppObjectByValueExecutor::Execute(
421 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
423 Cppyy::TCppObject_t value = GILCallO( method,
self, ctxt, fClass );
426 if ( ! PyErr_Occurred() )
427 PyErr_SetString( PyExc_ValueError,
"NULL result where temporary expected" );
432 ObjectProxy* pyobj = (ObjectProxy*)BindCppObjectNoCast( value, fClass, kFALSE, kTRUE );
438 return (PyObject*)pyobj;
445 PyObject* PyROOT::TCppObjectRefExecutor::Execute(
446 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
448 PyObject* result = BindCppObject( (
void*)GILCallR( method,
self, ctxt ), fClass );
449 if ( ! result || ! fAssignable )
453 PyObject* assign = PyObject_GetAttrString( result, const_cast< char* >(
"__assign__" ) );
456 PyObject* descr = PyObject_Str( result );
457 if ( descr && PyBytes_CheckExact( descr ) ) {
458 PyErr_Format( PyExc_TypeError,
"can not assign to return object (%s)",
459 PyBytes_AS_STRING( descr ) );
461 PyErr_SetString( PyExc_TypeError,
"can not assign to result" );
465 Py_DECREF( fAssignable ); fAssignable = 0;
469 PyObject* res2 = PyObject_CallFunction( assign, const_cast< char* >(
"O" ), fAssignable );
473 Py_DECREF( fAssignable ); fAssignable = 0;
477 Py_INCREF( Py_None );
488 PyObject* PyROOT::TCppObjectPtrPtrExecutor::Execute(
489 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
491 return BindCppObject( (
void*)GILCallR( method,
self, ctxt ), fClass, kTRUE );
497 PyObject* PyROOT::TCppObjectPtrRefExecutor::Execute(
498 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
500 return BindCppObject( *(
void**)GILCallR( method,
self, ctxt ), fClass, kFALSE );
507 PyObject* PyROOT::TCppObjectBySmartPtrExecutor::Execute(
508 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
510 Cppyy::TCppObject_t value = GILCallO( method,
self, ctxt, fClass );
513 if ( ! PyErr_Occurred() )
514 PyErr_SetString( PyExc_ValueError,
"NULL result where temporary expected" );
519 ObjectProxy* pyobj = (ObjectProxy*) BindCppObject(
520 (
void*)GILCallR( (Cppyy::TCppMethod_t)fDereferencer, value, ctxt ), fRawPtrType );
523 pyobj->SetSmartPtr( (
void*)value, fClass );
527 return (PyObject*)pyobj;
530 PyObject* PyROOT::TCppObjectBySmartPtrPtrExecutor::Execute(
531 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
533 Cppyy::TCppObject_t value = GILCallR( method,
self, ctxt );
538 ObjectProxy* pyobj = (ObjectProxy*) BindCppObject(
539 (
void*)GILCallR( (Cppyy::TCppMethod_t)fDereferencer, value, ctxt ), fRawPtrType );
542 pyobj->SetSmartPtr( (
void*)value, fClass );
544 return (PyObject*)pyobj;
547 PyObject* PyROOT::TCppObjectBySmartPtrRefExecutor::Execute(
548 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
550 Cppyy::TCppObject_t value = GILCallR( method,
self, ctxt );
557 ObjectProxy* pyobj = (ObjectProxy*) BindCppObject(
558 (
void*)GILCallR( (Cppyy::TCppMethod_t)fDereferencer, value, ctxt ), fRawPtrType );
561 pyobj->SetSmartPtr( (
void*)value, fClass );
563 return (PyObject*)pyobj;
610 PyObject* PyROOT::TCppObjectArrayExecutor::Execute(
611 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
613 return BindCppObjectArray( (
void*)GILCallR( method,
self, ctxt ), fClass, fArraySize );
620 PyObject* PyROOT::TConstructorExecutor::Execute(
621 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t klass, TCallContext* ctxt )
623 return (PyObject*)GILCallConstructor( method, (Cppyy::TCppType_t)klass, ctxt );
629 PyObject* PyROOT::TPyObjectExecutor::Execute(
630 Cppyy::TCppMethod_t method, Cppyy::TCppObject_t
self, TCallContext* ctxt )
632 return (PyObject*)GILCallR( method,
self, ctxt );
637 PyROOT::TExecutor* PyROOT::CreateExecutor(
const std::string& fullType,
638 Bool_t manage_smart_ptr )
649 ExecFactories_t::iterator h = gExecFactories.find( fullType );
650 if ( h != gExecFactories.end() )
651 return (h->second)();
654 std::string resolvedType = Cppyy::ResolveName( fullType );
657 h = gExecFactories.find( resolvedType );
658 if ( h != gExecFactories.end() )
659 return (h->second)();
662 const std::string& cpd = Utility::Compound( resolvedType );
663 std::string realType = TClassEdit::ShortType( resolvedType.c_str(), 1 );
666 h = gExecFactories.find( realType + cpd );
667 if ( h != gExecFactories.end() )
668 return (h->second)();
675 realType = TClassEdit::CleanType( realType.substr( 0, realType.rfind(
"(") ).c_str(), 1 );
677 h = gExecFactories.find( realType +
"*" );
678 if ( h != gExecFactories.end() )
679 return (h->second)();
683 TExecutor* result = 0;
684 if ( Cppyy::TCppType_t klass = Cppyy::GetScope( realType ) ) {
685 if ( manage_smart_ptr && Cppyy::IsSmartPtr( realType ) ) {
686 const std::vector< Cppyy::TCppMethod_t > methods = Cppyy::GetMethodsFromName( klass,
"operator->",
true);
687 if ( ! methods.empty() ) {
688 Cppyy::TCppType_t rawPtrType = Cppyy::GetScope(
689 TClassEdit::ShortType( Cppyy::GetMethodResultType( methods[0] ).c_str(), 1 ) );
692 result =
new TCppObjectBySmartPtrExecutor( klass, rawPtrType, methods[0] );
693 }
else if ( cpd ==
"*" ) {
694 result =
new TCppObjectBySmartPtrPtrExecutor( klass, rawPtrType, methods[0] );
695 }
else if ( cpd ==
"&" ) {
696 result =
new TCppObjectBySmartPtrRefExecutor( klass, rawPtrType, methods[0] );
708 result =
new TCppObjectByValueExecutor( klass );
709 else if ( cpd ==
"&" )
710 result =
new TCppObjectRefExecutor( klass );
711 else if ( cpd ==
"**" )
712 result =
new TCppObjectPtrPtrExecutor( klass );
713 else if ( cpd ==
"*&" || cpd ==
"&*" )
714 result =
new TCppObjectPtrRefExecutor( klass );
715 else if ( cpd ==
"[]" ) {
716 Py_ssize_t asize = Utility::ArraySize( resolvedType );
718 result =
new TCppObjectArrayExecutor( klass, asize );
720 result =
new TCppObjectPtrRefExecutor( klass );
722 result =
new TCppObjectExecutor( klass );
724 }
else if ( Cppyy::IsEnum( realType ) ) {
726 std::string et(TClassEdit::ResolveTypedef(Cppyy::ResolveEnum(realType).c_str()));
727 h = gExecFactories.find( et + cpd );
731 s <<
"creating executor for unknown type \"" << fullType <<
"\"" << std::ends;
732 PyErr_Warn( PyExc_RuntimeWarning, (
char*)s.str().c_str() );
734 h = (cpd ==
"") ? gExecFactories.find(
"void" ) : gExecFactories.find(
"void*" );
737 if ( ! result && h != gExecFactories.end() )
739 result = (h->second)();
746 #define PYROOT_EXECUTOR_FACTORY( name ) \
747 TExecutor* Create##name##Executor() \
749 return new T##name##Executor; \
754 using namespace PyROOT;
757 PYROOT_EXECUTOR_FACTORY( Bool )
758 PYROOT_EXECUTOR_FACTORY( BoolRef )
759 PYROOT_EXECUTOR_FACTORY( BoolConstRef )
760 PYROOT_EXECUTOR_FACTORY( Char )
761 PYROOT_EXECUTOR_FACTORY( CharRef )
762 PYROOT_EXECUTOR_FACTORY( CharConstRef )
763 PYROOT_EXECUTOR_FACTORY( UChar )
764 PYROOT_EXECUTOR_FACTORY( UCharRef )
765 PYROOT_EXECUTOR_FACTORY( UCharConstRef )
766 PYROOT_EXECUTOR_FACTORY( Short )
767 PYROOT_EXECUTOR_FACTORY( ShortRef )
768 PYROOT_EXECUTOR_FACTORY( UShortRef )
769 PYROOT_EXECUTOR_FACTORY( Int )
770 PYROOT_EXECUTOR_FACTORY( IntRef )
771 PYROOT_EXECUTOR_FACTORY( UIntRef )
772 PYROOT_EXECUTOR_FACTORY( ULong )
773 PYROOT_EXECUTOR_FACTORY( ULongRef )
774 PYROOT_EXECUTOR_FACTORY( Long )
775 PYROOT_EXECUTOR_FACTORY( LongRef )
776 PYROOT_EXECUTOR_FACTORY( Float )
777 PYROOT_EXECUTOR_FACTORY( FloatRef )
778 PYROOT_EXECUTOR_FACTORY( Double )
779 PYROOT_EXECUTOR_FACTORY( DoubleRef )
780 PYROOT_EXECUTOR_FACTORY( LongDouble )
781 PYROOT_EXECUTOR_FACTORY( LongDoubleRef )
782 PYROOT_EXECUTOR_FACTORY( Void )
783 PYROOT_EXECUTOR_FACTORY( LongLong )
784 PYROOT_EXECUTOR_FACTORY( LongLongRef )
785 PYROOT_EXECUTOR_FACTORY( ULongLong )
786 PYROOT_EXECUTOR_FACTORY( ULongLongRef )
787 PYROOT_EXECUTOR_FACTORY( CString )
788 PYROOT_EXECUTOR_FACTORY( VoidArray )
789 PYROOT_EXECUTOR_FACTORY( BoolArray )
790 PYROOT_EXECUTOR_FACTORY( ShortArray )
791 PYROOT_EXECUTOR_FACTORY( UShortArray )
792 PYROOT_EXECUTOR_FACTORY( CharArray )
793 PYROOT_EXECUTOR_FACTORY( UCharArray )
794 PYROOT_EXECUTOR_FACTORY( IntArray )
795 PYROOT_EXECUTOR_FACTORY( UIntArray )
796 PYROOT_EXECUTOR_FACTORY( LongArray )
797 PYROOT_EXECUTOR_FACTORY( ULongArray )
798 PYROOT_EXECUTOR_FACTORY( FloatArray )
799 PYROOT_EXECUTOR_FACTORY( DoubleArray )
800 PYROOT_EXECUTOR_FACTORY( STLString )
801 PYROOT_EXECUTOR_FACTORY( STLStringRef )
802 PYROOT_EXECUTOR_FACTORY( TGlobal )
803 PYROOT_EXECUTOR_FACTORY( Constructor )
804 PYROOT_EXECUTOR_FACTORY( PyObject )
807 typedef std::pair< const
char*, ExecutorFactory_t > NFp_t;
809 NFp_t factories_[] = {
811 NFp_t(
"bool", &CreateBoolExecutor ),
812 NFp_t(
"bool&", &CreateBoolRefExecutor ),
813 NFp_t(
"const bool&", &CreateBoolConstRefExecutor ),
814 NFp_t(
"char", &CreateCharExecutor ),
815 NFp_t(
"signed char", &CreateCharExecutor ),
816 NFp_t(
"unsigned char", &CreateUCharExecutor ),
817 NFp_t(
"char&", &CreateCharRefExecutor ),
818 NFp_t(
"signed char&", &CreateCharRefExecutor ),
819 NFp_t(
"unsigned char&", &CreateUCharRefExecutor ),
820 NFp_t(
"const char&", &CreateCharConstRefExecutor ),
821 NFp_t(
"const signed char&", &CreateCharConstRefExecutor ),
822 NFp_t(
"const unsigned char&", &CreateUCharConstRefExecutor ),
823 NFp_t(
"short", &CreateShortExecutor ),
824 NFp_t(
"short&", &CreateShortRefExecutor ),
825 NFp_t(
"unsigned short", &CreateIntExecutor ),
826 NFp_t(
"unsigned short&", &CreateUShortRefExecutor ),
827 NFp_t(
"int", &CreateIntExecutor ),
828 NFp_t(
"int&", &CreateIntRefExecutor ),
829 NFp_t(
"unsigned int", &CreateULongExecutor ),
830 NFp_t(
"unsigned int&", &CreateUIntRefExecutor ),
831 NFp_t(
"UInt_t", &CreateULongExecutor ),
832 NFp_t(
"UInt_t&", &CreateUIntRefExecutor ),
833 NFp_t(
"long", &CreateLongExecutor ),
834 NFp_t(
"long&", &CreateLongRefExecutor ),
835 NFp_t(
"unsigned long", &CreateULongExecutor ),
836 NFp_t(
"unsigned long&", &CreateULongRefExecutor ),
837 NFp_t(
"long long", &CreateLongLongExecutor ),
838 NFp_t(
"Long64_t", &CreateLongLongExecutor ),
839 NFp_t(
"long long&", &CreateLongLongRefExecutor ),
840 NFp_t(
"Long64_t&", &CreateLongLongRefExecutor ),
841 NFp_t(
"unsigned long long", &CreateULongLongExecutor ),
842 NFp_t(
"ULong64_t", &CreateULongLongExecutor ),
843 NFp_t(
"unsigned long long&", &CreateULongLongRefExecutor ),
844 NFp_t(
"ULong64_t&", &CreateULongLongRefExecutor ),
846 NFp_t(
"float", &CreateFloatExecutor ),
847 NFp_t(
"float&", &CreateFloatRefExecutor ),
848 NFp_t(
"Float16_t", &CreateFloatExecutor ),
849 NFp_t(
"Float16_t&", &CreateFloatRefExecutor ),
850 NFp_t(
"double", &CreateDoubleExecutor ),
851 NFp_t(
"double&", &CreateDoubleRefExecutor ),
852 NFp_t(
"Double32_t", &CreateDoubleExecutor ),
853 NFp_t(
"Double32_t&", &CreateDoubleRefExecutor ),
854 NFp_t(
"long double", &CreateLongDoubleExecutor ),
855 NFp_t(
"long double&", &CreateLongDoubleRefExecutor ),
856 NFp_t(
"void", &CreateVoidExecutor ),
859 NFp_t(
"void*", &CreateVoidArrayExecutor ),
860 NFp_t(
"bool*", &CreateBoolArrayExecutor ),
861 NFp_t(
"signed char*", &CreateCharArrayExecutor ),
862 NFp_t(
"unsigned char*", &CreateUCharArrayExecutor ),
863 NFp_t(
"short*", &CreateShortArrayExecutor ),
864 NFp_t(
"unsigned short*", &CreateUShortArrayExecutor ),
865 NFp_t(
"int*", &CreateIntArrayExecutor ),
866 NFp_t(
"unsigned int*", &CreateUIntArrayExecutor ),
867 NFp_t(
"UInt_t*", &CreateUIntArrayExecutor ),
868 NFp_t(
"long*", &CreateLongArrayExecutor ),
869 NFp_t(
"unsigned long*", &CreateULongArrayExecutor ),
870 NFp_t(
"Long64_t*", &CreateLongArrayExecutor ),
871 NFp_t(
"ULong64_t*", &CreateULongArrayExecutor ),
872 NFp_t(
"float*", &CreateFloatArrayExecutor ),
873 NFp_t(
"double*", &CreateDoubleArrayExecutor ),
876 NFp_t(
"const char*", &CreateCStringExecutor ),
877 NFp_t(
"char*", &CreateCStringExecutor ),
878 NFp_t(
"std::string", &CreateSTLStringExecutor ),
879 NFp_t(
"string", &CreateSTLStringExecutor ),
880 NFp_t(
"std::string&", &CreateSTLStringRefExecutor ),
881 NFp_t(
"string&", &CreateSTLStringRefExecutor ),
882 NFp_t(
"TGlobal*", &CreateTGlobalExecutor ),
883 NFp_t(
"__init__", &CreateConstructorExecutor ),
884 NFp_t(
"PyObject*", &CreatePyObjectExecutor ),
885 NFp_t(
"_object*", &CreatePyObjectExecutor ),
886 NFp_t(
"FILE*", &CreateVoidArrayExecutor )
889 struct InitExecFactories_t {
891 InitExecFactories_t()
894 int nf =
sizeof( factories_ ) /
sizeof( factories_[ 0 ] );
895 for (
int i = 0; i < nf; ++i ) {
896 gExecFactories[ factories_[ i ].first ] = factories_[ i ].second;
899 } initExecvFactories_;