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); \
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__")
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)) {