As per Armin Rigo's suggestion, remove special handing from intobject.c to...

As per Armin Rigo's suggestion, remove special handing from intobject.c to deal with the peculiarities of classobject's implementation of the number protocol.  The nb_long method of classobject now falls back to nb_int if there is no __long__ attribute present.
parent e6ac448a
......@@ -1539,6 +1539,18 @@ static PyObject *funcname(PyInstanceObject *self) { \
return generic_unary_op(self, o); \
}
/* unary function with a fallback */
#define UNARY_FB(funcname, methodname, funcname_fb) \
static PyObject *funcname(PyInstanceObject *self) { \
static PyObject *o; \
if (o == NULL) { o = PyString_InternFromString(methodname); \
if (o == NULL) return NULL; } \
if (PyObject_HasAttr((PyObject*)self, o)) \
return generic_unary_op(self, o); \
else \
return funcname_fb(self); \
}
#define BINARY(f, m, n) \
static PyObject *f(PyObject *v, PyObject *w) { \
return do_binop(v, w, "__" m "__", "__r" m "__", n); \
......@@ -1777,7 +1789,7 @@ instance_index(PyInstanceObject *self)
UNARY(instance_invert, "__invert__")
UNARY(instance_int, "__int__")
UNARY(instance_long, "__long__")
UNARY_FB(instance_long, "__long__", instance_int)
UNARY(instance_float, "__float__")
UNARY(instance_oct, "__oct__")
UNARY(instance_hex, "__hex__")
......
......@@ -213,15 +213,10 @@ PyInt_AsSsize_t(register PyObject *op)
return -1;
}
if (nb->nb_long != 0) {
if (nb->nb_long != 0)
io = (PyIntObject*) (*nb->nb_long) (op);
if (io == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
PyErr_Clear();
io = (PyIntObject*) (*nb->nb_int) (op);
}
} else {
else
io = (PyIntObject*) (*nb->nb_int) (op);
}
if (io == NULL)
return -1;
if (!PyInt_Check(io)) {
......
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