11 # pragma warning( disable : 2259 ) 16 #include "TBufferFile.h" 18 #include "TClassRef.h" 22 #if ROOT_VERSION_CODE < ROOT_VERSION( 5, 19, 0 ) 23 static PyObject* gExpand = 0;
28 #if ROOT_VERSION_CODE < ROOT_VERSION( 5, 19, 0 ) 34 PyObject* ObjectProxyReduce( PyObject*
self ) {
39 void* vself = TPython::ObjectProxy_AsVoidPtr(
self );
41 PyErr_SetString( PyExc_TypeError,
"__reduce__ requires an object proxy instance as first argument" );
45 PyObject* nattr = PyObject_GetAttrString( (PyObject*)self->ob_type, (
char*)
"__name__" );
46 PyObject* pyname = PyObject_Str( nattr );
49 static TClass* bufferclass = TClass::GetClass(
"TBufferFile" );
50 TClass* klass = TClass::GetClass( PyString_AS_STRING( pyname ) );
55 if ( klass == bufferclass ) {
56 buf = (TBufferFile*)vself;
58 static TBufferFile buffer( TBuffer::kWrite );
60 if ( buffer.WriteObjectAny( vself, klass ) != 1 ) {
61 PyErr_Format( PyExc_IOError,
"could not stream object of type %s", PyString_AS_STRING( pyname ) );
71 PyObject* res2 = PyTuple_New( 2 );
72 PyTuple_SET_ITEM( res2, 0, PyString_FromStringAndSize( buf->Buffer(), buf->Length() ) );
73 PyTuple_SET_ITEM( res2, 1, pyname );
75 PyObject* result = PyTuple_New( 2 );
77 PyTuple_SET_ITEM( result, 0, gExpand );
78 PyTuple_SET_ITEM( result, 1, res2 );
85 enum EFlags { kNone = 0x0, kIsOwner = 0x0001, kIsReference = 0x0002 };
88 void HoldOn() { fFlags |= kIsOwner; }
89 void Release() { fFlags &= ~kIsOwner; }
92 PyObject_HEAD
void* fObject;
104 PyObject* ObjectProxyExpand( PyObject*, PyObject*
args ) {
107 const char* clname = 0;
108 if ( !PyArg_ParseTuple( args, const_cast<char*>(
"O!s:__expand__" ), &PyString_Type, &pybuf, &clname ) )
return 0;
113 if (
strcmp( clname,
"TBufferFile" ) == 0 ) {
114 TBufferFile* buf =
new TBufferFile( TBuffer::kWrite );
115 buf->WriteFastArray( PyString_AS_STRING( pybuf ), PyString_GET_SIZE( pybuf ) );
118 TBufferFile buf( TBuffer::kRead, PyString_GET_SIZE( pybuf ), PyString_AS_STRING( pybuf ), kFALSE );
119 result = buf.ReadObjectAny( 0 );
121 PyObject* pobj = TPython::ObjectProxy_FromVoidPtr( result, clname );
123 ObjectProxy* obj = (ObjectProxy*)pobj;
134 Py_INCREF( libpyroot_pymodule );
135 PyTypeObject* pytype = (PyTypeObject*)objectproxy_pytype;
137 static PyMethodDef s_pdefExp = {(
char*)
"_ObjectProxy__expand__", (PyCFunction)ObjectProxyExpand, METH_VARARGS,
138 (
char*)
"internal function"};
140 PyObject* pymname = PyString_FromString( PyModule_GetName( libpyroot_pymodule ) );
141 gExpand = PyCFunction_NewEx( &s_pdefExp, NULL, pymname );
142 Py_DECREF( pymname );
143 Bool_t isOk = PyObject_SetAttrString( libpyroot_pymodule, s_pdefExp.ml_name, gExpand ) == 0;
144 Py_DECREF( gExpand );
147 Py_DECREF( libpyroot_pymodule );
148 PyErr_SetString( PyExc_TypeError,
"could not add expand function to libPyROOT" );
152 static PyMethodDef s_pdefRed = {(
char*)
"__reduce__", (PyCFunction)ObjectProxyReduce, METH_NOARGS,
153 (
char*)
"internal function"};
155 PyObject* descr = PyDescr_NewMethod( pytype, &s_pdefRed );
156 isOk = PyDict_SetItemString( pytype->tp_dict, s_pdefRed.ml_name, descr ) == 0;
159 Py_DECREF( libpyroot_pymodule );
160 PyErr_SetString( PyExc_TypeError,
"could not add __reduce__ function to ObjectProxy" );
164 Py_DECREF( libpyroot_pymodule );
167 #else // ROOT_VERSION_CODE < ROOT_VERSION(5,19,0) 172 #endif // ROOT_VERSION_CODE < ROOT_VERSION(5,19,0)
A class to serialize/deserialize TES objects to and from a TBufferFile Author: P. ...
static void Initialize(PyObject *libpyroot_pymodule, PyObject *objectproxy_pytype)
Install the pickling of ObjectProxy's functionality.
Port pickling functionality while awaiting newer release.