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.
This commit is contained in:
parent
58e123d75e
commit
abe1d48d20
|
@ -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)) {
|
||||
|
|
Loading…
Reference in New Issue