Kaydet (Commit) abe1d48d authored tarafından Kristján Valur Jónsson's avatar Kristján Valur Jónsson

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

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.
üst 58e123d7
...@@ -1539,6 +1539,18 @@ static PyObject *funcname(PyInstanceObject *self) { \ ...@@ -1539,6 +1539,18 @@ static PyObject *funcname(PyInstanceObject *self) { \
return generic_unary_op(self, o); \ 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) \ #define BINARY(f, m, n) \
static PyObject *f(PyObject *v, PyObject *w) { \ static PyObject *f(PyObject *v, PyObject *w) { \
return do_binop(v, w, "__" m "__", "__r" m "__", n); \ return do_binop(v, w, "__" m "__", "__r" m "__", n); \
...@@ -1777,7 +1789,7 @@ instance_index(PyInstanceObject *self) ...@@ -1777,7 +1789,7 @@ instance_index(PyInstanceObject *self)
UNARY(instance_invert, "__invert__") UNARY(instance_invert, "__invert__")
UNARY(instance_int, "__int__") UNARY(instance_int, "__int__")
UNARY(instance_long, "__long__") UNARY_FB(instance_long, "__long__", instance_int)
UNARY(instance_float, "__float__") UNARY(instance_float, "__float__")
UNARY(instance_oct, "__oct__") UNARY(instance_oct, "__oct__")
UNARY(instance_hex, "__hex__") UNARY(instance_hex, "__hex__")
......
...@@ -213,15 +213,10 @@ PyInt_AsSsize_t(register PyObject *op) ...@@ -213,15 +213,10 @@ PyInt_AsSsize_t(register PyObject *op)
return -1; return -1;
} }
if (nb->nb_long != 0) { if (nb->nb_long != 0)
io = (PyIntObject*) (*nb->nb_long) (op); io = (PyIntObject*) (*nb->nb_long) (op);
if (io == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) { else
PyErr_Clear();
io = (PyIntObject*) (*nb->nb_int) (op);
}
} else {
io = (PyIntObject*) (*nb->nb_int) (op); io = (PyIntObject*) (*nb->nb_int) (op);
}
if (io == NULL) if (io == NULL)
return -1; return -1;
if (!PyInt_Check(io)) { 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