10 Bool_t PyROOT::TSetItemHolder::InitExecutor_( TExecutor*& executor, TCallContext* )
13 if ( ! TMethodHolder::InitExecutor_( executor ) )
17 if ( ! dynamic_cast< TRefExecutor* >( executor ) ) {
18 PyErr_Format( PyExc_NotImplementedError,
19 "no __setitem__ handler for return type (%s)",
20 this->GetReturnTypeName().c_str() );
31 PyObject* PyROOT::TSetItemHolder::PreProcessArgs(
32 ObjectProxy*&
self, PyObject* args, PyObject* kwds )
34 int nArgs = PyTuple_GET_SIZE( args );
36 PyErr_SetString( PyExc_TypeError,
"insufficient arguments to __setitem__" );
41 ((TRefExecutor*)this->GetExecutor())->SetAssignable( PyTuple_GET_ITEM( args, nArgs - 1 ) );
42 PyObject* subset = PyTuple_GetSlice( args, 0, nArgs - 1 );
45 Py_ssize_t realsize = 0;
46 for (
int i = 0; i < nArgs - 1; ++i ) {
47 PyObject* item = PyTuple_GetItem( subset, i );
48 realsize += PyTuple_Check( item ) ? PyTuple_GET_SIZE( item ) : 1;
52 PyObject* unrolled = 0;
53 if ( realsize != nArgs - 1 ) {
54 unrolled = PyTuple_New( realsize );
57 for (
int i = 0; i < nArgs - 1; ++i, ++current ) {
58 PyObject* item = PyTuple_GetItem( subset, i );
59 if ( PyTuple_Check( item ) ) {
60 for (
int j = 0; j < PyTuple_GET_SIZE( item ); ++j, ++current ) {
61 PyObject* subitem = PyTuple_GetItem( item, j );
63 PyTuple_SetItem( unrolled, current, subitem );
67 PyTuple_SetItem( unrolled, current, item );
73 PyObject* result = TMethodHolder::PreProcessArgs(
self, unrolled ? unrolled : subset, kwds );
74 Py_XDECREF( unrolled );