summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2001-09-15 03:14:32 (GMT)
committerGuido van Rossum <guido@python.org>2001-09-15 03:14:32 (GMT)
commit7e35d57c0cd94b136d613129cb22a2b4252aa008 (patch)
tree04cbba26e20c258dff63ab627b21906641d5c58a /Objects
parent0891ac017dd02f9c592c40940dff6b050523be00 (diff)
downloadcpython-7e35d57c0cd94b136d613129cb22a2b4252aa008.zip
cpython-7e35d57c0cd94b136d613129cb22a2b4252aa008.tar.gz
cpython-7e35d57c0cd94b136d613129cb22a2b4252aa008.tar.bz2
A fix for SF bug #461546 (bug in long_mul).
Both int and long multiplication are changed to be more careful in their assumptions about when one of the arguments is a sequence: the assumption that at least one of the arguments must be an int (or long, respectively) is still held, but the assumption that these don't smell like sequences is no longer true: a subtype of int or long may well have a sequence-repeat thingie!
Diffstat (limited to 'Objects')
-rw-r--r--Objects/intobject.c10
-rw-r--r--Objects/longobject.c24
2 files changed, 20 insertions, 14 deletions
diff --git a/Objects/intobject.c b/Objects/intobject.c
index c93b384..16e4336 100644
--- a/Objects/intobject.c
+++ b/Objects/intobject.c
@@ -344,14 +344,16 @@ int_mul(PyObject *v, PyObject *w)
long a, b, ah, bh, x, y;
int s = 1;
- if (v->ob_type->tp_as_sequence &&
- v->ob_type->tp_as_sequence->sq_repeat) {
+ if (!PyInt_Check(v) &&
+ v->ob_type->tp_as_sequence &&
+ v->ob_type->tp_as_sequence->sq_repeat) {
/* sequence * int */
a = PyInt_AsLong(w);
return (*v->ob_type->tp_as_sequence->sq_repeat)(v, a);
}
- else if (w->ob_type->tp_as_sequence &&
- w->ob_type->tp_as_sequence->sq_repeat) {
+ if (!PyInt_Check(w) &&
+ w->ob_type->tp_as_sequence &&
+ w->ob_type->tp_as_sequence->sq_repeat) {
/* int * sequence */
a = PyInt_AsLong(v);
return (*w->ob_type->tp_as_sequence->sq_repeat)(w, a);
diff --git a/Objects/longobject.c b/Objects/longobject.c
index 7c4f75d..1e01bf0 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -183,6 +183,8 @@ PyLong_AsLong(PyObject *vv)
int i, sign;
if (vv == NULL || !PyLong_Check(vv)) {
+ if (vv != NULL && PyInt_Check(vv))
+ return PyInt_AsLong(vv);
PyErr_BadInternalCall();
return -1;
}
@@ -1448,17 +1450,19 @@ long_mul(PyLongObject *v, PyLongObject *w)
int size_a;
int size_b;
int i;
-
- if (v->ob_type->tp_as_sequence &&
- v->ob_type->tp_as_sequence->sq_repeat) {
- return long_repeat((PyObject *)v, w);
- }
- else if (w->ob_type->tp_as_sequence &&
- w->ob_type->tp_as_sequence->sq_repeat) {
- return long_repeat((PyObject *)w, v);
- }
- CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
+ if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
+ if (!PyLong_Check(v) &&
+ v->ob_type->tp_as_sequence &&
+ v->ob_type->tp_as_sequence->sq_repeat)
+ return long_repeat((PyObject *)v, w);
+ if (!PyLong_Check(w) &&
+ w->ob_type->tp_as_sequence &&
+ w->ob_type->tp_as_sequence->sq_repeat)
+ return long_repeat((PyObject *)w, v);
+ Py_INCREF(Py_NotImplemented);
+ return Py_NotImplemented;
+ }
size_a = ABS(a->ob_size);
size_b = ABS(b->ob_size);