- if (pre##binop(x, y, &xx, &yy)) RETURN_NOTIMPL; \
- if (mp_tolong_checked(yy, &n, 1)) goto end; \
- if (n < 0) \
- z = pre##_pywrap(mp_##rname(MP_NEW, xx, -n)); \
- else \
- z = pre##_pywrap(mp_##name(MP_NEW, xx, n)); \
- end: \
- MP_DROP(xx); MP_DROP(yy); \
+ if (!PRE##_PYCHECK(x)) RETURN_NOTIMPL; \
+ if (GF_PYCHECK(y) || FE_PYCHECK(y)) RETURN_NOTIMPL; \
+ yix = PyNumber_Index(y); if (!yix) { PyErr_Clear(); RETURN_NOTIMPL; } \
+ n = PyInt_AsLong(yix); Py_DECREF(yix); \
+ if (n == -1 && PyErr_Occurred()) { PyErr_Clear(); RETURN_NOTIMPL; } \
+ if (n < 0) z = pre##_pywrap(mp_##rname(MP_NEW, MP_X(x), -n)); \
+ else z = pre##_pywrap(mp_##name(MP_NEW, MP_X(x), n)); \