@@ -882,10 +882,8 @@ static PyObject *
882882ternary_op (PyObject * v ,
883883 PyObject * w ,
884884 PyObject * z ,
885- const int op_slot
886- #ifndef NDEBUG
887- , const char * op_name
888- #endif
885+ const int op_slot ,
886+ const char * op_name
889887 )
890888{
891889 PyNumberMethods * mv = Py_TYPE (v )-> tp_as_number ;
@@ -955,30 +953,25 @@ ternary_op(PyObject *v,
955953 if (z == Py_None ) {
956954 PyErr_Format (
957955 PyExc_TypeError ,
958- "unsupported operand type(s) for ** or pow() : "
956+ "unsupported operand type(s) for %.100s : "
959957 "'%.100s' and '%.100s'" ,
958+ op_name ,
960959 Py_TYPE (v )-> tp_name ,
961960 Py_TYPE (w )-> tp_name );
962961 }
963962 else {
964963 PyErr_Format (
965964 PyExc_TypeError ,
966- "unsupported operand type(s) for pow() : "
965+ "unsupported operand type(s) for %.100s : "
967966 "'%.100s', '%.100s', '%.100s'" ,
967+ op_name ,
968968 Py_TYPE (v )-> tp_name ,
969969 Py_TYPE (w )-> tp_name ,
970970 Py_TYPE (z )-> tp_name );
971971 }
972972 return NULL ;
973973}
974974
975- #ifdef NDEBUG
976- # define TERNARY_OP (v , w , z , op_slot , op_name ) ternary_op(v, w, z, op_slot)
977- #else
978- # define TERNARY_OP (v , w , z , op_slot , op_name ) ternary_op(v, w, z, op_slot, op_name)
979- #endif
980-
981-
982975#define BINARY_FUNC (func , op , op_name ) \
983976 PyObject * \
984977 func(PyObject *v, PyObject *w) { \
@@ -1077,7 +1070,7 @@ PyNumber_Remainder(PyObject *v, PyObject *w)
10771070PyObject *
10781071PyNumber_Power (PyObject * v , PyObject * w , PyObject * z )
10791072{
1080- return TERNARY_OP (v , w , z , NB_SLOT (nb_power ), "** or pow()" );
1073+ return ternary_op (v , w , z , NB_SLOT (nb_power ), "** or pow()" );
10811074}
10821075
10831076/* Binary in-place operators */
@@ -1140,6 +1133,24 @@ binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
11401133 return result ;
11411134}
11421135
1136+ static PyObject *
1137+ ternary_iop (PyObject * v , PyObject * w , PyObject * z , const int iop_slot , const int op_slot ,
1138+ const char * op_name )
1139+ {
1140+ PyNumberMethods * mv = Py_TYPE (v )-> tp_as_number ;
1141+ if (mv != NULL ) {
1142+ ternaryfunc slot = NB_TERNOP (mv , iop_slot );
1143+ if (slot ) {
1144+ PyObject * x = (slot )(v , w , z );
1145+ if (x != Py_NotImplemented ) {
1146+ return x ;
1147+ }
1148+ Py_DECREF (x );
1149+ }
1150+ }
1151+ return ternary_op (v , w , z , op_slot , op_name );
1152+ }
1153+
11431154#define INPLACE_BINOP (func , iop , op , op_name ) \
11441155 PyObject * \
11451156 func(PyObject *v, PyObject *w) { \
@@ -1237,13 +1248,8 @@ PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
12371248PyObject *
12381249PyNumber_InPlacePower (PyObject * v , PyObject * w , PyObject * z )
12391250{
1240- if (Py_TYPE (v )-> tp_as_number &&
1241- Py_TYPE (v )-> tp_as_number -> nb_inplace_power != NULL ) {
1242- return TERNARY_OP (v , w , z , NB_SLOT (nb_inplace_power ), "**=" );
1243- }
1244- else {
1245- return TERNARY_OP (v , w , z , NB_SLOT (nb_power ), "**=" );
1246- }
1251+ return ternary_iop (v , w , z , NB_SLOT (nb_inplace_power ),
1252+ NB_SLOT (nb_power ), "**=" );
12471253}
12481254
12491255
0 commit comments