Commit 3bc3f28d authored by Neil Schemenauer's avatar Neil Schemenauer

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.
parent a3502703
......@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment