@@ -8678,6 +8678,27 @@ check_num_args(PyObject *ob, int n)
86788678    return  0 ;
86798679}
86808680
8681+ static  Py_ssize_t 
8682+ check_pow_args (PyObject  * ob )
8683+ {
8684+     // Returns the argument count on success or `-1` on error. 
8685+     int  min  =  1 ;
8686+     int  max  =  2 ;
8687+     if  (!PyTuple_CheckExact (ob )) {
8688+         PyErr_SetString (PyExc_SystemError ,
8689+             "PyArg_UnpackTuple() argument list is not a tuple" );
8690+         return  -1 ;
8691+     }
8692+     Py_ssize_t  size  =  PyTuple_GET_SIZE (ob );
8693+     if  (size  >= min  &&  size  <= max ) {
8694+         return  size ;
8695+     }
8696+     PyErr_Format (
8697+         PyExc_TypeError ,
8698+         "expected %d or %d arguments, got %zd" , min , max , PyTuple_GET_SIZE (ob ));
8699+     return  -1 ;
8700+ }
8701+ 
86818702/* Generic wrappers for overloadable 'operators' such as __getitem__ */ 
86828703
86838704/* There's a wrapper *function* for each distinct function typedef used 
@@ -8759,8 +8780,15 @@ wrap_ternaryfunc(PyObject *self, PyObject *args, void *wrapped)
87598780
87608781    /* Note: This wrapper only works for __pow__() */ 
87618782
8762-     if  (!PyArg_UnpackTuple (args , "" , 1 , 2 , & other , & third ))
8783+     Py_ssize_t  size  =  check_pow_args (args );
8784+     if  (size  ==  -1 ) {
87638785        return  NULL ;
8786+     }
8787+     other  =  PyTuple_GET_ITEM (args , 0 );
8788+     if  (size  ==  2 ) {
8789+        third  =  PyTuple_GET_ITEM (args , 1 );
8790+     }
8791+ 
87648792    return  (* func )(self , other , third );
87658793}
87668794
@@ -8771,10 +8799,17 @@ wrap_ternaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
87718799    PyObject  * other ;
87728800    PyObject  * third  =  Py_None ;
87738801
8774-     /* Note: This wrapper only works for __pow__ () */ 
8802+     /* Note: This wrapper only works for __rpow__ () */ 
87758803
8776-     if  (!PyArg_UnpackTuple (args , "" , 1 , 2 , & other , & third ))
8804+     Py_ssize_t  size  =  check_pow_args (args );
8805+     if  (size  ==  -1 ) {
87778806        return  NULL ;
8807+     }
8808+     other  =  PyTuple_GET_ITEM (args , 0 );
8809+     if  (size  ==  2 ) {
8810+        third  =  PyTuple_GET_ITEM (args , 1 );
8811+     }
8812+ 
87788813    return  (* func )(other , self , third );
87798814}
87808815
@@ -8795,8 +8830,9 @@ wrap_indexargfunc(PyObject *self, PyObject *args, void *wrapped)
87958830    PyObject *  o ;
87968831    Py_ssize_t  i ;
87978832
8798-     if  (!PyArg_UnpackTuple (args , "" ,  1 ,  1 ,  & o ))
8833+     if  (!check_num_args (args , 1 ))
87998834        return  NULL ;
8835+     o  =  PyTuple_GET_ITEM (args , 0 );
88008836    i  =  PyNumber_AsSsize_t (o , PyExc_OverflowError );
88018837    if  (i  ==  -1  &&  PyErr_Occurred ())
88028838        return  NULL ;
@@ -8852,7 +8888,7 @@ wrap_sq_setitem(PyObject *self, PyObject *args, void *wrapped)
88528888    int  res ;
88538889    PyObject  * arg , * value ;
88548890
8855-     if  (!PyArg_UnpackTuple (args , "" , 2 , 2 , & arg , & value ))
8891+     if  (!PyArg_UnpackTuple (args , "__setitem__ " , 2 , 2 , & arg , & value ))
88568892        return  NULL ;
88578893    i  =  getindex (self , arg );
88588894    if  (i  ==  -1  &&  PyErr_Occurred ())
@@ -8908,7 +8944,7 @@ wrap_objobjargproc(PyObject *self, PyObject *args, void *wrapped)
89088944    int  res ;
89098945    PyObject  * key , * value ;
89108946
8911-     if  (!PyArg_UnpackTuple (args , "" , 2 , 2 , & key , & value ))
8947+     if  (!PyArg_UnpackTuple (args , "__setitem__ " , 2 , 2 , & key , & value ))
89128948        return  NULL ;
89138949    res  =  (* func )(self , key , value );
89148950    if  (res  ==  -1  &&  PyErr_Occurred ())
@@ -9005,7 +9041,7 @@ wrap_setattr(PyObject *self, PyObject *args, void *wrapped)
90059041    int  res ;
90069042    PyObject  * name , * value ;
90079043
9008-     if  (!PyArg_UnpackTuple (args , "" , 2 , 2 , & name , & value ))
9044+     if  (!PyArg_UnpackTuple (args , "__setattr__ " , 2 , 2 , & name , & value ))
90099045        return  NULL ;
90109046    if  (!hackcheck (self , func , "__setattr__" ))
90119047        return  NULL ;
@@ -9115,7 +9151,7 @@ wrap_descr_get(PyObject *self, PyObject *args, void *wrapped)
91159151    PyObject  * obj ;
91169152    PyObject  * type  =  NULL ;
91179153
9118-     if  (!PyArg_UnpackTuple (args , "" , 1 , 2 , & obj , & type ))
9154+     if  (!PyArg_UnpackTuple (args , "__get__ " , 1 , 2 , & obj , & type ))
91199155        return  NULL ;
91209156    if  (obj  ==  Py_None )
91219157        obj  =  NULL ;
@@ -9136,7 +9172,7 @@ wrap_descr_set(PyObject *self, PyObject *args, void *wrapped)
91369172    PyObject  * obj , * value ;
91379173    int  ret ;
91389174
9139-     if  (!PyArg_UnpackTuple (args , "" , 2 , 2 , & obj , & value ))
9175+     if  (!PyArg_UnpackTuple (args , "__set__ " , 2 , 2 , & obj , & value ))
91409176        return  NULL ;
91419177    ret  =  (* func )(self , obj , value );
91429178    if  (ret  <  0 )
@@ -9165,7 +9201,7 @@ wrap_buffer(PyObject *self, PyObject *args, void *wrapped)
91659201{
91669202    PyObject  * arg  =  NULL ;
91679203
9168-     if  (!PyArg_UnpackTuple (args , "" , 1 , 1 , & arg )) {
9204+     if  (!PyArg_UnpackTuple (args , "__buffer__ " , 1 , 1 , & arg )) {
91699205        return  NULL ;
91709206    }
91719207    Py_ssize_t  flags  =  PyNumber_AsSsize_t (arg , PyExc_OverflowError );
@@ -9186,7 +9222,7 @@ static PyObject *
91869222wrap_releasebuffer (PyObject  * self , PyObject  * args , void  * wrapped )
91879223{
91889224    PyObject  * arg  =  NULL ;
9189-     if  (!PyArg_UnpackTuple (args , "" , 1 , 1 , & arg )) {
9225+     if  (!PyArg_UnpackTuple (args , "__release_buffer__ " , 1 , 1 , & arg )) {
91909226        return  NULL ;
91919227    }
91929228    if  (!PyMemoryView_Check (arg )) {
0 commit comments