40 #if PY_VERSION_HEX >= 0x02050000 42 struct PyROOT_tagCDataObject {
47 static inline PyTypeObject* GetCTypesType(
const char*
name ) {
48 PyObject* ct = PyImport_ImportModule(
"ctypes" );
49 if ( ! ct )
return nullptr;
50 PyTypeObject* ct_t = (PyTypeObject*)PyObject_GetAttrString( ct, name );
63 Long_t l = PyLong_AsLong( pyobject );
65 if ( ! ( l == 0 || l == 1 ) || PyFloat_Check( pyobject ) ) {
66 PyErr_SetString( PyExc_ValueError,
"boolean value should be bool, or integer 1 or 0" );
83 if ( ! (PyLong_Check( pyobject ) || PyInt_Check( pyobject )) ) {
84 PyErr_SetString( PyExc_TypeError,
"unsigned short converion expects an integer object" );
87 Long_t l = PyLong_AsLong( pyobject );
88 if ( l < 0 || USHRT_MAX < l ) {
89 PyErr_Format( PyExc_ValueError,
"integer %ld out of range for unsigned short", l );
101 if ( ! (PyLong_Check( pyobject ) || PyInt_Check( pyobject )) ) {
102 PyErr_SetString( PyExc_TypeError,
"short int converion expects an integer object" );
105 Long_t l = PyLong_AsLong( pyobject );
106 if ( l < SHRT_MIN || SHRT_MAX < l ) {
107 PyErr_Format( PyExc_ValueError,
"integer %ld out of range for short int", l );
122 if ( ! (PyLong_Check( pyobject ) || PyInt_Check( pyobject )) ) {
123 PyErr_SetString( PyExc_TypeError,
"int/long converion expects an integer object" );
126 return (
Long_t)PyLong_AsLong( pyobject );
134 PyErr_SetString( PyExc_TypeError,
"C++ type can not be converted from memory" );
143 PyErr_SetString( PyExc_TypeError,
"C++ type can not be converted to memory" );
149 #define PYROOT_IMPLEMENT_BASIC_CONVERTER( name, type, stype, F1, F2, tc ) \ 150 Bool_t PyROOT::T##name##Converter::SetArg( \ 151 PyObject* pyobject, TParameter& para, TCallContext* ) \ 154 type val = (type)F2( pyobject ); \ 155 if ( val == (type)-1 && PyErr_Occurred() ) \ 157 para.fValue.f##name = val; \ 158 para.fTypeCode = tc; \ 162 PyObject* PyROOT::T##name##Converter::FromMemory( void* address ) \ 164 return F1( (stype)*((type*)address) ); \ 167 Bool_t PyROOT::T##name##Converter::ToMemory( PyObject* value, void* address ) \ 169 type s = (type)F2( value ); \ 170 if ( s == (type)-1 && PyErr_Occurred() ) \ 172 *((type*)address) = (type)s; \ 184 PyErr_Format( PyExc_TypeError,
"%s expected, got string of size " PY_SSIZE_T_FORMAT,
186 }
else if ( ! PyFloat_Check( pyobject ) ) {
187 lchar = PyLong_AsLong( pyobject );
188 if ( lchar == -1 && PyErr_Occurred() )
190 else if ( ! ( low <= lchar && lchar <= high ) ) {
191 PyErr_Format( PyExc_ValueError,
192 "integer to character: value %d not in range [%d,%d]", lchar, low, high );
196 PyErr_SetString( PyExc_TypeError,
"char or small int type expected" );
202 #define PYROOT_IMPLEMENT_BASIC_CONST_REF_CONVERTER( name, type, F1 )\ 203 Bool_t PyROOT::TConst##name##RefConverter::SetArg( \ 204 PyObject* pyobject, TParameter& para, TCallContext* ) \ 206 type val = (type)F1( pyobject ); \ 207 if ( val == (type)-1 && PyErr_Occurred() ) \ 209 para.fValue.f##name = val; \ 210 para.fRef = ¶.fValue.f##name; \ 211 para.fTypeCode = 'r'; \ 215 #define PYROOT_IMPLEMENT_BASIC_CONST_CHAR_REF_CONVERTER( name, type, low, high )\ 216 Bool_t PyROOT::TConst##name##RefConverter::SetArg( \ 217 PyObject* pyobject, TParameter& para, TCallContext* ) \ 220 type val = (type)ExtractChar( pyobject, #type, low, high ); \ 221 if ( val == (type)-1 && PyErr_Occurred() ) \ 223 para.fValue.fLong = val; \ 224 para.fTypeCode = 'l'; \ 231 #define PYROOT_IMPLEMENT_BASIC_CHAR_CONVERTER( name, type, low, high ) \ 232 Bool_t PyROOT::T##name##Converter::SetArg( \ 233 PyObject* pyobject, TParameter& para, TCallContext* ) \ 236 Long_t val = ExtractChar( pyobject, #type, low, high ); \ 237 if ( val == -1 && PyErr_Occurred() ) \ 239 para.fValue.fLong = val; \ 240 para.fTypeCode = 'l'; \ 244 PyObject* PyROOT::T##name##Converter::FromMemory( void* address ) \ 246 return PyROOT_PyUnicode_FromFormat( "%c", *((type*)address) ); \ 249 Bool_t PyROOT::T##name##Converter::ToMemory( PyObject* value, void* address ) \ 251 if ( PyROOT_PyUnicode_Check( value ) ) { \ 252 const char* buf = PyROOT_PyUnicode_AsString( value ); \ 253 if ( PyErr_Occurred() ) \ 255 int len = PyROOT_PyUnicode_GET_SIZE( value ); \ 257 PyErr_Format( PyExc_TypeError, #type" expected, got string of size %d", len );\ 260 *((type*)address) = (type)buf[0]; \ 262 Long_t l = PyLong_AsLong( value ); \ 263 if ( l == -1 && PyErr_Occurred() ) \ 265 if ( ! ( low <= l && l <= high ) ) { \ 266 PyErr_Format( PyExc_ValueError, \ 267 "integer to character: value %ld not in range [%d,%d]", l, low, high );\ 270 *((type*)address) = (type)l; \ 285 #if PY_VERSION_HEX < 0x03000000 287 para.fValue.fVoidp = (
void*)&((PyIntObject*)pyobject)->ob_ival;
288 para.fTypeCode =
'V';
293 #if PY_VERSION_HEX < 0x02050000 294 PyErr_SetString( PyExc_TypeError,
"use ROOT.Long for pass-by-ref of longs" );
299 static PyTypeObject* c_long_type = GetCTypesType(
"c_long" );
300 if (
Py_TYPE( pyobject ) == c_long_type ) {
301 para.fValue.fVoidp = (
void*)((PyROOT_tagCDataObject*)pyobject)->b_ptr;
302 para.fTypeCode =
'V';
306 PyErr_SetString( PyExc_TypeError,
"use ctypes.c_long for pass-by-ref of longs" );
328 Bool_t PyROOT::TIntRefConverter::SetArg(
331 #if PY_VERSION_HEX < 0x03000000 333 para.
fValue.
fVoidp = (
void*)&((PyIntObject*)pyobject)->ob_ival;
339 #if PY_VERSION_HEX >= 0x02050000 341 static PyTypeObject* c_int_type = GetCTypesType(
"c_int" );
342 if (
Py_TYPE( pyobject ) == c_int_type ) {
343 para.
fValue.
fVoidp = (
void*)((PyROOT_tagCDataObject*)pyobject)->b_ptr;
356 #if PY_VERSION_HEX < 0x02050000 357 PyErr_SetString( PyExc_TypeError,
"use ROOT.Long for pass-by-ref of ints" );
359 PyErr_SetString( PyExc_TypeError,
"use ctypes.c_int for pass-by-ref of ints" );
383 Bool_t PyROOT::TULongConverter::SetArg(
387 if ( PyErr_Occurred() )
393 PyObject* PyROOT::TULongConverter::FromMemory(
void* address )
396 return PyLong_FromUnsignedLong( *((
ULong_t*)address) );
399 Bool_t PyROOT::TULongConverter::ToMemory(
PyObject* value,
void* address )
403 if ( PyErr_Occurred() )
412 PyObject* PyROOT::TUIntConverter::FromMemory(
void* address )
414 return PyLong_FromUnsignedLong( *((
UInt_t*)address) );
417 Bool_t PyROOT::TUIntConverter::ToMemory(
PyObject* value,
void* address )
421 if ( PyErr_Occurred() )
425 PyErr_SetString( PyExc_OverflowError,
"value too large for unsigned int" );
444 Bool_t PyROOT::TDoubleRefConverter::SetArg(
448 para.
fValue.
fVoidp = (
void*)&((PyFloatObject*)pyobject)->ob_fval;
460 PyErr_SetString( PyExc_TypeError,
"use ROOT.Double for pass-by-ref of doubles" );
475 PyErr_SetString( PyExc_SystemError,
"void/unknown arguments can\'t be set" );
482 Bool_t PyROOT::TLongLongConverter::SetArg(
485 if ( PyFloat_Check( pyobject ) ) {
488 PyErr_SetString( PyExc_ValueError,
"can not convert float to long long" );
493 if ( PyErr_Occurred() )
499 PyObject* PyROOT::TLongLongConverter::FromMemory(
void* address )
502 return PyLong_FromLongLong( *(
Long64_t*)address );
505 Bool_t PyROOT::TLongLongConverter::ToMemory(
PyObject* value,
void* address )
508 Long64_t ll = PyLong_AsLongLong( value );
509 if ( ll == -1 && PyErr_Occurred() )
518 Bool_t PyROOT::TULongLongConverter::SetArg(
522 if ( PyErr_Occurred() )
528 PyObject* PyROOT::TULongLongConverter::FromMemory(
void* address )
534 Bool_t PyROOT::TULongLongConverter::ToMemory(
PyObject* value,
void* address )
538 if ( PyErr_Occurred() )
551 if ( PyErr_Occurred() )
557 if ( fMaxSize < (
UInt_t)fBuffer.size() )
558 PyErr_Warn( PyExc_RuntimeWarning, (
char*)
"string too long for char array (truncated)" );
559 else if ( fMaxSize != UINT_MAX )
560 fBuffer.resize( fMaxSize,
'\0' );
571 if ( address && *(
char**)address ) {
572 if ( fMaxSize != UINT_MAX ) {
573 std::string buf( *(
char**)address, fMaxSize );
589 if ( PyErr_Occurred() )
594 PyErr_Warn( PyExc_RuntimeWarning, (
char*)
"string too long for char array (truncated)" );
596 if ( fMaxSize != UINT_MAX )
597 strncpy( *(
char**)address, s, fMaxSize );
600 strcpy( *(
char**)address, s );
611 inline Bool_t CArraySetArg(
640 return CArraySetArg( pyobject, para,
'c',
sizeof(
char) );
648 if ( fMaxSize != UINT_MAX )
664 return CArraySetArg( pyobject, para,
'B',
sizeof(
unsigned char) );
678 if ( PyInt_CheckExact( pyobject ) || PyLong_CheckExact( pyobject ) ) {
681 address = (
void*)val;
715 if ( GetAddressSpecialCase( pyobject, para.
fValue.
fVoidp ) ) {
738 if ( ! address || *(ptrdiff_t*)address == 0 ) {
756 *(
void**)address = ((
ObjectProxy*)value)->GetObject();
762 if ( GetAddressSpecialCase( value, ptr ) ) {
763 *(
void**)address = ptr;
770 if ( ! buf || buflen == 0 )
773 *(
void**)address = buf;
779 #define PYROOT_IMPLEMENT_ARRAY_CONVERTER( name, type, code ) \ 780 Bool_t PyROOT::T##name##ArrayConverter::SetArg( \ 781 PyObject* pyobject, TParameter& para, TCallContext* ) \ 783 return CArraySetArg( pyobject, para, code, sizeof(type) ); \ 786 Bool_t PyROOT::T##name##ArrayRefConverter::SetArg( \ 787 PyObject* pyobject, TParameter& para, TCallContext* ctxt ) \ 789 Bool_t result = T##name##ArrayConverter::SetArg( pyobject, para, ctxt ); \ 790 para.fTypeCode = 'V'; \ 794 PyObject* PyROOT::T##name##ArrayConverter::FromMemory( void* address ) \ 796 return BufFac_t::Instance()->PyBuffer_FromMemory( *(type**)address, fSize * sizeof(type) );\ 799 Bool_t PyROOT::T##name##ArrayConverter::ToMemory( PyObject* value, void* address )\ 802 int buflen = Utility::GetBuffer( value, code, sizeof(type), buf ); \ 803 if ( ! buf || buflen == 0 ) \ 805 if ( 0 <= fSize ) { \ 806 if ( fSize < buflen/(int)sizeof(type) ) { \ 807 PyErr_SetString( PyExc_ValueError, "buffer too large for value" ); \ 810 memcpy( *(type**)address, buf, 0 < buflen ? ((size_t) buflen) : sizeof(type) );\ 812 *(type**)address = (type*)buf; \ 845 #define PYROOT_IMPLEMENT_STRING_AS_PRIMITIVE_CONVERTER( name, type, F1, F2 ) \ 846 PyROOT::T##name##Converter::T##name##Converter( Bool_t keepControl ) : \ 847 TCppObjectConverter( Cppyy::GetScope( #type ), keepControl ) {} \ 849 Bool_t PyROOT::T##name##Converter::SetArg( \ 850 PyObject* pyobject, TParameter& para, TCallContext* ctxt ) \ 852 if ( PyROOT_PyUnicode_Check( pyobject ) ) { \ 853 fBuffer = type( PyROOT_PyUnicode_AsString( pyobject ), \ 854 PyROOT_PyUnicode_GET_SIZE( pyobject ) ); \ 855 para.fValue.fVoidp = &fBuffer; \ 856 para.fTypeCode = 'V'; \ 860 if ( ! ( PyInt_Check( pyobject ) || PyLong_Check( pyobject ) ) ) { \ 861 Bool_t result = TCppObjectConverter::SetArg( pyobject, para, ctxt ); \ 862 para.fTypeCode = 'V'; \ 868 PyObject* PyROOT::T##name##Converter::FromMemory( void* address ) \ 871 return PyROOT_PyUnicode_FromStringAndSize( ((type*)address)->F1(), ((type*)address)->F2() );\ 872 Py_INCREF( PyStrings::gEmptyString ); \ 873 return PyStrings::gEmptyString; \ 876 Bool_t PyROOT::T##name##Converter::ToMemory( PyObject* value, void* address ) \ 878 if ( PyROOT_PyUnicode_Check( value ) ) { \ 879 *((type*)address) = PyROOT_PyUnicode_AsString( value ); \ 883 return TCppObjectConverter::ToMemory( value, address ); \ 896 if ( GetAddressSpecialCase( pyobject, para.fValue.fVoidp ) ) {
897 para.fTypeCode =
'p';
915 pyobj->
ObjectIsA(), fClass, para.fValue.fVoidp, 1 );
919 para.fTypeCode =
'p';
925 para.fTypeCode =
'p';
947 if ( GetAddressSpecialCase( value, ptr ) ) {
948 *(
void**)address = ptr;
964 PyObject*
result = PyObject_CallMethod( pyobj, (
char*)
"__assign__", (
char*)
"O", value );
1038 template <
bool ISREFERENCE>
1056 para.
fTypeCode = ISREFERENCE ?
'V' :
'p';
1066 template <
bool ISREFERENCE>
1075 template <
bool ISREFERENCE>
1087 *(
void**)address = ((
ObjectProxy*)value)->GetObject();
1114 if ( PyTuple_Size( pyobject ) < 1 )
1148 PyErr_SetString( PyExc_NotImplementedError,
1149 "access to C-arrays of objects not yet implemented!" );
1215 if ( ! address || *(ptrdiff_t*)address == 0 ) {
1225 Bool_t PyROOT::TPyObjectConverter::SetArg(
1233 PyObject* PyROOT::TPyObjectConverter::FromMemory(
void* address )
1239 Py_INCREF( Py_None );
1243 Py_INCREF( pyobject );
1247 Bool_t PyROOT::TPyObjectConverter::ToMemory(
PyObject* value,
void* address )
1262 char typeCode = fHandlePtr ?
'p' :
'V';
1265 if ( fHandlePtr && GetAddressSpecialCase( pyobject, para.
fValue.
fVoidp ) ) {
1312 if ( !address || !fClass )
1316 std::vector<TParameter> args;
1331 PyErr_SetString( PyExc_NotImplementedError,
"this method can not (yet) be called" );
1351 return (h->second)( size );
1359 return (h->second)( size );
1368 return (h->second)( size );
1378 if ( cpd ==
"[]" ) {
1381 return (h->second)( size );
1385 Bool_t isConst = resolvedType.substr(0, 5) ==
"const";
1386 Bool_t control = cpd ==
"&" || isConst;
1393 if ( ! methods.empty() ) {
1399 }
else if ( cpd ==
"&" ) {
1401 }
else if ( cpd ==
"*" && size <= 0 ) {
1413 if ( realType.find(
"__gnu_cxx::__normal_iterator", 0 ) == 0 )
1417 if ( cpd ==
"**" || cpd ==
"&*" )
1419 else if ( cpd ==
"*&" )
1421 else if ( cpd ==
"*" && size <= 0 )
1423 else if ( cpd ==
"&" )
1425 else if ( cpd ==
"[]" || size > 0 )
1427 else if ( cpd ==
"" )
1436 }
else if ( realType.find(
"(*)" ) != std::string::npos ||
1437 ( realType.find(
"::*)" ) != std::string::npos ) ) {
1444 if ( ! result && cpd ==
"&&" )
1449 result = (h->second)( size );
1450 else if ( ! result ) {
1452 std::stringstream s;
1453 s <<
"creating converter for unknown type \"" << fullType <<
"\"" << std::ends;
1454 PyErr_Warn( PyExc_RuntimeWarning, (
char*)s.str().c_str() );
1465 #define PYROOT_BASIC_CONVERTER_FACTORY( name ) \ 1466 TConverter* Create##name##Converter( Long_t ) \ 1468 return new T##name##Converter(); \ 1471 #define PYROOT_ARRAY_CONVERTER_FACTORY( name ) \ 1472 TConverter* Create##name##Converter( Long_t size ) \ 1474 return new T##name##Converter( size ); \ 1542 typedef std::pair< const char*, ConverterFactory_t > NFp_t;
1545 NFp_t factories_[] = {
1547 NFp_t(
"bool", &CreateBoolConverter ),
1548 NFp_t(
"const bool&", &CreateConstBoolRefConverter ),
1549 NFp_t(
"char", &CreateCharConverter ),
1550 NFp_t(
"const char&", &CreateConstCharRefConverter ),
1551 NFp_t(
"signed char", &CreateCharConverter ),
1552 NFp_t(
"const signed char&", &CreateConstCharRefConverter ),
1553 NFp_t(
"unsigned char", &CreateUCharConverter ),
1554 NFp_t(
"const unsigned char&", &CreateConstUCharRefConverter ),
1555 NFp_t(
"short", &CreateShortConverter ),
1556 NFp_t(
"const short&", &CreateConstShortRefConverter ),
1557 NFp_t(
"unsigned short", &CreateUShortConverter ),
1558 NFp_t(
"const unsigned short&", &CreateConstUShortRefConverter ),
1559 NFp_t(
"int", &CreateIntConverter ),
1560 NFp_t(
"int&", &CreateIntRefConverter ),
1561 NFp_t(
"const int&", &CreateConstIntRefConverter ),
1562 NFp_t(
"unsigned int", &CreateUIntConverter ),
1563 NFp_t(
"const unsigned int&", &CreateConstUIntRefConverter ),
1564 NFp_t(
"UInt_t", &CreateIntConverter ),
1565 NFp_t(
"long", &CreateLongConverter ),
1566 NFp_t(
"long&", &CreateLongRefConverter ),
1567 NFp_t(
"const long&", &CreateConstLongRefConverter ),
1568 NFp_t(
"unsigned long", &CreateULongConverter ),
1569 NFp_t(
"const unsigned long&", &CreateConstULongRefConverter ),
1570 NFp_t(
"long long", &CreateLongLongConverter ),
1571 NFp_t(
"const long long&", &CreateConstLongLongRefConverter ),
1572 NFp_t(
"Long64_t", &CreateLongLongConverter ),
1573 NFp_t(
"const Long64_t&", &CreateConstLongLongRefConverter ),
1574 NFp_t(
"unsigned long long", &CreateULongLongConverter ),
1575 NFp_t(
"const unsigned long long&", &CreateConstULongLongRefConverter ),
1576 NFp_t(
"ULong64_t", &CreateULongLongConverter ),
1577 NFp_t(
"const ULong64_t&", &CreateConstULongLongRefConverter ),
1579 NFp_t(
"float", &CreateFloatConverter ),
1580 NFp_t(
"const float&", &CreateConstFloatRefConverter ),
1581 NFp_t(
"double", &CreateDoubleConverter ),
1582 NFp_t(
"double&", &CreateDoubleRefConverter ),
1583 NFp_t(
"const double&", &CreateConstDoubleRefConverter ),
1584 NFp_t(
"long double", &CreateLongDoubleConverter ),
1585 NFp_t(
"const long double&", &CreateConstLongDoubleRefConverter ),
1586 NFp_t(
"void", &CreateVoidConverter ),
1589 NFp_t(
"bool*", &CreateBoolArrayConverter ),
1590 NFp_t(
"bool&", &CreateBoolArrayRefConverter ),
1591 NFp_t(
"const unsigned char*", &CreateCStringConverter ),
1592 NFp_t(
"unsigned char*", &CreateNonConstUCStringConverter ),
1593 NFp_t(
"short*", &CreateShortArrayConverter ),
1594 NFp_t(
"short&", &CreateShortArrayRefConverter ),
1595 NFp_t(
"unsigned short*", &CreateUShortArrayConverter ),
1596 NFp_t(
"unsigned short&", &CreateUShortArrayRefConverter ),
1597 NFp_t(
"int*", &CreateIntArrayConverter ),
1598 NFp_t(
"unsigned int*", &CreateUIntArrayConverter ),
1599 NFp_t(
"unsigned int&", &CreateUIntArrayRefConverter ),
1600 NFp_t(
"long*", &CreateLongArrayConverter ),
1601 NFp_t(
"unsigned long*", &CreateULongArrayConverter ),
1602 NFp_t(
"unsigned long&", &CreateULongArrayRefConverter ),
1603 NFp_t(
"float*", &CreateFloatArrayConverter ),
1604 NFp_t(
"float&", &CreateFloatArrayRefConverter ),
1605 NFp_t(
"double*", &CreateDoubleArrayConverter ),
1606 NFp_t(
"long long*", &CreateLongLongArrayConverter ),
1607 NFp_t(
"Long64_t*", &CreateLongLongArrayConverter ),
1608 NFp_t(
"unsigned long long*", &CreateLongLongArrayConverter ),
1609 NFp_t(
"ULong64_t*", &CreateLongLongArrayConverter ),
1610 NFp_t(
"void*", &CreateVoidArrayConverter ),
1613 NFp_t(
"const char*", &CreateCStringConverter ),
1614 NFp_t(
"char*", &CreateNonConstCStringConverter ),
1615 NFp_t(
"TString", &CreateTStringConverter ),
1616 NFp_t(
"const TString&", &CreateTStringConverter ),
1617 NFp_t(
"std::string", &CreateSTLStringConverter ),
1618 NFp_t(
"string", &CreateSTLStringConverter ),
1619 NFp_t(
"const std::string&", &CreateSTLStringConverter ),
1620 NFp_t(
"const string&", &CreateSTLStringConverter ),
1621 NFp_t(
"void*&", &CreateVoidPtrRefConverter ),
1622 NFp_t(
"void**", &CreateVoidPtrPtrConverter ),
1623 NFp_t(
"PyObject*", &CreatePyObjectConverter ),
1624 NFp_t(
"_object*", &CreatePyObjectConverter ),
1625 NFp_t(
"FILE*", &CreateVoidArrayConverter ),
1626 NFp_t(
"Float16_t", &CreateFloatConverter ),
1627 NFp_t(
"const Float16_t&", &CreateConstFloatRefConverter ),
1628 NFp_t(
"Double32_t", &CreateDoubleConverter ),
1629 NFp_t(
"Double32_t&", &CreateDoubleRefConverter ),
1630 NFp_t(
"const Double32_t&", &CreateConstDoubleRefConverter )
1634 struct InitConvFactories_t {
1636 InitConvFactories_t()
1639 int nf =
sizeof( factories_ ) /
sizeof( factories_[ 0 ] );
1640 for (
int i = 0; i < nf; ++i ) {
1641 gConvFactories[ factories_[ i ].first ] = factories_[ i ].second;
1644 } initConvFactories_;
virtual Bool_t ToMemory(PyObject *value, void *address)
could happen if no derived class override
#define PyROOT_PyUnicode_FromString
virtual Bool_t SetArg(PyObject *, TParameter &, TCallContext *ctxt=0)
construct a new string and copy it in new memory
virtual Bool_t SetArg(PyObject *, TParameter &, TCallContext *ctxt=0)
#define PyROOT_PyUnicode_GET_SIZE
Cppyy::TCppType_t fSmartPtrType
RooArgList L(const RooAbsArg &v1)
virtual Bool_t SetArg(PyObject *, TParameter &, TCallContext *ctxt=0)
convert <pyobject> to C++ instance**, set arg for call
virtual Bool_t ToMemory(PyObject *value, void *address)
just convert pointer if it is a ROOT object
virtual PyObject * FromMemory(void *address)
nothing sensible can be done, just return <address> as pylong
ptrdiff_t GetBaseOffset(TCppType_t derived, TCppType_t base, TCppObject_t address, int direction, bool rerror=false)
static Long_t PyROOT_PyLong_AsStrictLong(PyObject *pyobject)
strict python integer to C++ integer conversion
std::vector< TCppMethod_t > GetMethodsFromName(TCppScope_t scope, const std::string &name)
#define PyROOT_PyCapsule_CheckExact
std::string GetFinalName(TCppType_t type)
std::string CleanType(const char *typeDesc, int mode=0, const char **tail=0)
Cleanup type description, redundant blanks removed and redundant tail ignored return *tail = pointer ...
#define PYROOT_BASIC_CONVERTER_FACTORY(name)
PyObject * BindCppObjectArray(Cppyy::TCppObject_t address, Cppyy::TCppType_t klass, Int_t size)
TODO: this function exists for symmetry; need to figure out if it's useful.
virtual Bool_t ToMemory(PyObject *value, void *address)
could happen if no derived class override
virtual Bool_t SetArg(PyObject *, TParameter &, TCallContext *ctxt=0)
smart pointer converter
Bool_t UseStrictOwnership(TCallContext *ctxt)
#define PY_SSIZE_T_FORMAT
virtual PyObject * FromMemory(void *address)
#define PYROOT_IMPLEMENT_BASIC_CHAR_CONVERTER(name, type, low, high)
#define PYROOT_IMPLEMENT_BASIC_CONST_CHAR_REF_CONVERTER(name, type, low, high)
std::string ResolveName(const std::string &cppitem_name)
PyLong_FromUnsignedLongLong
union PyROOT::TParameter::Value fValue
static UShort_t PyROOT_PyLong_AsUShort(PyObject *pyobject)
range-checking python integer to C++ unsigend short int conversion
virtual PyObject * FromMemory(void *address)
std::vector< std::vector< double > > Data
void SetSmartPtr(void *address, Cppyy::TCppType_t ptrType)
ClassInfo_t * GetClassInfo() const
#define PyROOT_PyUnicode_AsStringChecked
virtual Bool_t ToMemory(PyObject *value, void *address)
convert to C++ array of instances, write it at <address>
#define PyROOT_PyUnicode_AsString
virtual Bool_t SetArg(PyObject *, TParameter &, TCallContext *=0)
raise a NotImplemented exception to take a method out of overload resolution
virtual PyObject * FromMemory(void *address)
R__EXTERN PyObject * gNullPtrObject
ULong_t PyLongOrInt_AsULong(PyObject *pyobject)
#define PYROOT_ARRAY_CONVERTER_FACTORY(name)
TConverter * CreateConverter(const std::string &fullType, Long_t size=-1)
virtual Bool_t ToMemory(PyObject *value, void *address)
convert to C++ instance*, write it at <address>
virtual Bool_t SetArg(PyObject *, TParameter &, TCallContext *ctxt=0)
convert <pyobject> to C++ instance**, set arg for call
Bool_t ObjectProxy_Check(T *object)
virtual Bool_t GetAddressSpecialCase(PyObject *pyobject, void *&address)
(1): "null pointer" or C++11 style nullptr
virtual Bool_t SetArg(PyObject *, TParameter &, TCallContext *ctxt=0)
attempt base class first (i.e. passing a string), but if that fails, try a buffer ...
virtual Bool_t ToMemory(PyObject *value, void *address)
convert to C++ instance, write it at <address>
Bool_t TTupleOfInstances_CheckExact(T *object)
#define PyROOT_PyUnicode_FromStringAndSize
virtual PyObject * FromMemory(void *address)
assume this is a buffer access if the size is known; otherwise assume string
#define PYROOT_IMPLEMENT_ARRAY_CONVERTER(name, type, code)
ULong64_t PyLongOrInt_AsULong64(PyObject *pyobject)
Convert <pyobject> to C++ unsigned long long, with bounds checking.
PyObject * BindCppObjectNoCast(Cppyy::TCppObject_t object, Cppyy::TCppType_t klass, Bool_t isRef=kFALSE, Bool_t isValue=kFALSE)
only known or knowable objects will be bound (null object is ok)
virtual Bool_t SetArg(PyObject *, TParameter &, TCallContext *ctxt=0)
convert <pyobject> to C++ void*&, set arg for call
virtual PyObject * FromMemory(void *address)
construct python object from C++ instance* read at <address>
PyObject * PyBuffer_FromMemory(Bool_t *buf, Py_ssize_t size=-1)
virtual PyObject * FromMemory(void *address)
construct python tuple of instances from C++ array read at <address>
Bool_t TCustomFloat_CheckExact(T *object)
void * CallR(TCppMethod_t method, TCppObject_t self, void *args)
Bool_t IsSubtype(TCppType_t derived, TCppType_t base)
static Bool_t PyROOT_PyLong_AsBool(PyObject *pyobject)
range-checking python integer to C++ bool conversion
TCppScope_t GetScope(const std::string &scope_name)
virtual Bool_t SetArg(PyObject *, TParameter &, TCallContext *ctxt=0)
attempt base class first (i.e. passing a string), but if that fails, try a buffer ...
std::string GetMethodResultType(TCppMethod_t)
virtual Bool_t SetArg(PyObject *, TParameter &, TCallContext *ctxt=0)
just convert pointer if it is a ROOT object
virtual PyObject * FromMemory(void *address)
construct python object from C++ instance read at <address>
R__EXTERN PyObject * gTypeCode
unsigned long long ULong64_t
#define PYROOT_IMPLEMENT_BASIC_CONST_REF_CONVERTER(name, type, F1)
#define PyROOT_PyUnicode_Check
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
virtual PyObject * FromMemory(void *address)
read a void** from address; since this is unknown, long is used (user can cast)
static Int_t ExtractChar(PyObject *pyobject, const char *tname, Int_t low, Int_t high)
static void * PyROOT_PyCapsule_GetPointer(PyObject *capsule, const char *)
virtual Bool_t SetArg(PyObject *, TParameter &, TCallContext *ctxt=0)
convert <pyobject> to C++ instance, set arg for call
static Short_t PyROOT_PyLong_AsShort(PyObject *pyobject)
range-checking python integer to C++ short int conversion
Bool_t IsSmartPtr(const std::string &)
static TPyBufferFactory * Instance()
static Char_t PyROOT_PyUnicode_AsChar(PyObject *pyobject)
python string to C++ char conversion
int GetBuffer(PyObject *pyobject, char tc, int size, void *&buf, Bool_t check=kTRUE)
Retrieve a linear buffer pointer from the given pyobject.
std::map< std::string, ConverterFactory_t > ConvFactories_t
std::string ShortType(const char *typeDesc, int mode)
Return the absolute type of typeDesc.
PyObject * BindCppObject(Cppyy::TCppObject_t object, Cppyy::TCppType_t klass, Bool_t isRef=kFALSE)
if the object is a null pointer, return a typed one (as needed for overloading)
Bool_t IsEnum(const std::string &type_name)
Bool_t TCustomInt_CheckExact(T *object)
static ECallFlags sMemoryPolicy
ConvFactories_t gConvFactories
virtual Bool_t SetArg(PyObject *, TParameter &, TCallContext *ctxt=0)
convert <pyobject> to C++ void**, set arg for call
#define PYROOT_IMPLEMENT_STRING_AS_PRIMITIVE_CONVERTER(name, type, F1, F2)
virtual Bool_t SetArg(PyObject *, TParameter &, TCallContext *ctxt=0)
convert <pyobject> to C++ instance&, set arg for call
R__EXTERN PyObject * gEmptyString
Cppyy::TCppType_t ObjectIsA() const
#define PYROOT_IMPLEMENT_BASIC_CONVERTER(name, type, stype, F1, F2, tc)
const std::string Compound(const std::string &name)
Break down the compound of a fully qualified type name.