From: Neil Schemenauer Date: Fri, 9 Aug 2002 15:46:50 +0000 (+0000) Subject: Only call sq_repeat if the object does not have a nb_multiply slot. One X-Git-Tag: v2.2.2b1~228 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=10c18d59e14f00217c4bdd07ec140947468aad20;p=thirdparty%2FPython%2Fcpython.git Only call sq_repeat if the object does not have a nb_multiply slot. One example of where this changes behavior is when a new-style instance defines '__mul__' and '__rmul__' and is multiplied by an int. Before the change the '__rmul__' method is never called, even if the int is the left operand. --- diff --git a/Objects/intobject.c b/Objects/intobject.c index 8d4aa2cbb023..2be563180fd6 100644 --- a/Objects/intobject.c +++ b/Objects/intobject.c @@ -344,6 +344,12 @@ one that can lose catastrophic amounts of information, it's the native long product that must have overflowed. */ +/* Return true if the sq_repeat method should be used */ +#define USE_SQ_REPEAT(o) (!PyInt_Check(o) && \ + o->ob_type->tp_as_sequence && \ + o->ob_type->tp_as_sequence->sq_repeat && \ + (!o->ob_type->tp_as_number || \ + !o->ob_type->tp_as_number->nb_multiply)) static PyObject * int_mul(PyObject *v, PyObject *w) { @@ -352,16 +358,12 @@ int_mul(PyObject *v, PyObject *w) double doubled_longprod; /* (double)longprod */ double doubleprod; /* (double)a * (double)b */ - if (!PyInt_Check(v) && - v->ob_type->tp_as_sequence && - v->ob_type->tp_as_sequence->sq_repeat) { + if (USE_SQ_REPEAT(v)) { /* sequence * int */ a = PyInt_AsLong(w); return (*v->ob_type->tp_as_sequence->sq_repeat)(v, a); } - if (!PyInt_Check(w) && - w->ob_type->tp_as_sequence && - w->ob_type->tp_as_sequence->sq_repeat) { + if (USE_SQ_REPEAT(w)) { /* int * sequence */ a = PyInt_AsLong(v); return (*w->ob_type->tp_as_sequence->sq_repeat)(w, a);