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;
29 #if ROOT_VERSION_CODE < ROOT_VERSION( 5, 19, 0 ) 35 PyObject* ObjectProxyReduce( PyObject*
self )
41 void* vself = TPython::ObjectProxy_AsVoidPtr(
self );
43 PyErr_SetString( PyExc_TypeError,
"__reduce__ requires an object proxy instance as first argument" );
47 PyObject* nattr = PyObject_GetAttrString( (PyObject*)self->ob_type, (
char*)
"__name__" );
48 PyObject* pyname = PyObject_Str( nattr );
51 static TClass* bufferclass = TClass::GetClass(
"TBufferFile" );
52 TClass* klass = TClass::GetClass( PyString_AS_STRING( pyname ) );
57 if ( klass == bufferclass ) {
58 buf = (TBufferFile*)vself;
60 static TBufferFile buffer( TBuffer::kWrite );
62 if ( buffer.WriteObjectAny( vself, klass ) != 1 ) {
63 PyErr_Format( PyExc_IOError,
"could not stream object of type %s", PyString_AS_STRING( pyname ) );
73 PyObject* res2 = PyTuple_New( 2 );
74 PyTuple_SET_ITEM( res2, 0, PyString_FromStringAndSize( buf->Buffer(), buf->Length() ) );
75 PyTuple_SET_ITEM( res2, 1, pyname );
77 PyObject* result = PyTuple_New( 2 );
79 PyTuple_SET_ITEM( result, 0, gExpand );
80 PyTuple_SET_ITEM( result, 1, res2 );
88 enum EFlags { kNone = 0x0, kIsOwner = 0x0001, kIsReference = 0x0002 };
91 void HoldOn() { fFlags |= kIsOwner; }
92 void Release() { fFlags &= ~kIsOwner; }
95 PyObject_HEAD
void* fObject;
107 PyObject* ObjectProxyExpand( PyObject*, PyObject*
args )
111 const char* clname = 0;
112 if ( !PyArg_ParseTuple( args, const_cast<char*>(
"O!s:__expand__" ), &PyString_Type, &pybuf, &clname ) )
return 0;
117 if (
strcmp( clname,
"TBufferFile" ) == 0 ) {
118 TBufferFile* buf =
new TBufferFile( TBuffer::kWrite );
119 buf->WriteFastArray( PyString_AS_STRING( pybuf ), PyString_GET_SIZE( pybuf ) );
122 TBufferFile buf( TBuffer::kRead, PyString_GET_SIZE( pybuf ), PyString_AS_STRING( pybuf ), kFALSE );
123 result = buf.ReadObjectAny( 0 );
125 PyObject* pobj = TPython::ObjectProxy_FromVoidPtr( result, clname );
127 ObjectProxy* obj = (ObjectProxy*)pobj;
139 Py_INCREF( libpyroot_pymodule );
140 PyTypeObject* pytype = (PyTypeObject*)objectproxy_pytype;
142 static PyMethodDef s_pdefExp = {(
char*)
"_ObjectProxy__expand__", (PyCFunction)ObjectProxyExpand, METH_VARARGS,
143 (
char*)
"internal function"};
145 PyObject* pymname = PyString_FromString( PyModule_GetName( libpyroot_pymodule ) );
146 gExpand = PyCFunction_NewEx( &s_pdefExp, NULL, pymname );
147 Py_DECREF( pymname );
148 Bool_t isOk = PyObject_SetAttrString( libpyroot_pymodule, s_pdefExp.ml_name, gExpand ) == 0;
149 Py_DECREF( gExpand );
152 Py_DECREF( libpyroot_pymodule );
153 PyErr_SetString( PyExc_TypeError,
"could not add expand function to libPyROOT" );
157 static PyMethodDef s_pdefRed = {(
char*)
"__reduce__", (PyCFunction)ObjectProxyReduce, METH_NOARGS,
158 (
char*)
"internal function"};
160 PyObject* descr = PyDescr_NewMethod( pytype, &s_pdefRed );
161 isOk = PyDict_SetItemString( pytype->tp_dict, s_pdefRed.ml_name, descr ) == 0;
164 Py_DECREF( libpyroot_pymodule );
165 PyErr_SetString( PyExc_TypeError,
"could not add __reduce__ function to ObjectProxy" );
169 Py_DECREF( libpyroot_pymodule );
172 #else // ROOT_VERSION_CODE < ROOT_VERSION(5,19,0) 176 #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.