From 3bc3f28dbec7ec3f221d9293e05e0cf1ba5f20aa Mon Sep 17 00:00:00 2001 From: Neil Schemenauer Date: Fri, 9 Aug 2002 15:20:48 +0000 Subject: [PATCH] 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. --- Objects/intobject.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Objects/intobject.c b/Objects/intobject.c index 0202980c96..4f43b111e5 100644 --- a/Objects/intobject.c +++ b/Objects/intobject.c @@ -341,6 +341,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) { @@ -349,16 +355,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); -- 2.50.0