diff options
author | Guido van Rossum <guido@python.org> | 2001-10-09 11:07:24 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2001-10-09 11:07:24 (GMT) |
commit | 0eb2a6e974d6862ce5d691f30ec9cc9dae5c9074 (patch) | |
tree | 846f06f528c49f5ddeb8135aa9182e404c4de97e /Objects | |
parent | 1dbce44b91426712f5a904c8c52fbde21c7bd79c (diff) | |
download | cpython-0eb2a6e974d6862ce5d691f30ec9cc9dae5c9074.zip cpython-0eb2a6e974d6862ce5d691f30ec9cc9dae5c9074.tar.gz cpython-0eb2a6e974d6862ce5d691f30ec9cc9dae5c9074.tar.bz2 |
It turned out not so difficult to support old-style numbers (those
without the Py_TPFLAGS_CHECKTYPES flag) in the wrappers. This
required a few changes in test_descr.py to cope with the fact that the
complex type has __int__, __long__ and __float__ methods that always
raise an exception.
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/typeobject.c | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 34a20e1..65267d3 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1979,6 +1979,22 @@ wrap_binaryfunc(PyObject *self, PyObject *args, void *wrapped) } static PyObject * +wrap_binaryfunc_l(PyObject *self, PyObject *args, void *wrapped) +{ + binaryfunc func = (binaryfunc)wrapped; + PyObject *other; + + if (!PyArg_ParseTuple(args, "O", &other)) + return NULL; + if (!(self->ob_type->tp_flags & Py_TPFLAGS_CHECKTYPES) && + self->ob_type != other->ob_type) { + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; + } + return (*func)(self, other); +} + +static PyObject * wrap_binaryfunc_r(PyObject *self, PyObject *args, void *wrapped) { binaryfunc func = (binaryfunc)wrapped; @@ -1986,6 +2002,11 @@ wrap_binaryfunc_r(PyObject *self, PyObject *args, void *wrapped) if (!PyArg_ParseTuple(args, "O", &other)) return NULL; + if (!(self->ob_type->tp_flags & Py_TPFLAGS_CHECKTYPES) && + self->ob_type != other->ob_type) { + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; + } return (*func)(other, self); } @@ -1993,7 +2014,7 @@ wrap_binaryfunc_r(PyObject *self, PyObject *args, void *wrapped) #define BINARY(NAME, OP) \ static struct wrapperbase tab_##NAME[] = { \ {"__" #NAME "__", \ - (wrapperfunc)wrap_binaryfunc, \ + (wrapperfunc)wrap_binaryfunc_l, \ "x.__" #NAME "__(y) <==> " #OP}, \ {"__r" #NAME "__", \ (wrapperfunc)wrap_binaryfunc_r, \ @@ -2778,11 +2799,7 @@ add_operators(PyTypeObject *type) ADD(mp->mp_ass_subscript, tab_setitem); } - /* We don't support "old-style numbers" because their binary - operators require that both arguments have the same type; - the wrappers here only work for new-style numbers. */ - if ((type->tp_flags & Py_TPFLAGS_CHECKTYPES) && - (nb = type->tp_as_number) != NULL) { + if ((nb = type->tp_as_number) != NULL) { ADD(nb->nb_add, tab_add); ADD(nb->nb_subtract, tab_sub); ADD(nb->nb_multiply, tab_mul); @@ -2817,7 +2834,7 @@ add_operators(PyTypeObject *type) ADD(nb->nb_inplace_and, tab_iand); ADD(nb->nb_inplace_xor, tab_ixor); ADD(nb->nb_inplace_or, tab_ior); - if (type->tp_flags & Py_TPFLAGS_CHECKTYPES) { + if (type->tp_flags & Py_TPFLAGS_HAVE_CLASS) { ADD(nb->nb_floor_divide, tab_floordiv); ADD(nb->nb_true_divide, tab_truediv); ADD(nb->nb_inplace_floor_divide, tab_ifloordiv); |