rewrite this function, which was still accounting for classic classes
diff --git a/Objects/abstract.c b/Objects/abstract.c
index 924ccd1..345b96a 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -1271,34 +1271,22 @@
PyObject *
_PyNumber_ConvertIntegralToInt(PyObject *integral, const char* error_format)
{
- static PyObject *int_name = NULL;
- if (int_name == NULL) {
- int_name = PyUnicode_InternFromString("__int__");
- if (int_name == NULL)
- return NULL;
- }
-
- if (integral && !PyLong_Check(integral)) {
- /* Don't go through tp_as_number->nb_int to avoid
- hitting the classic class fallback to __trunc__. */
- PyObject *int_func = PyObject_GetAttr(integral, int_name);
- if (int_func == NULL) {
- PyErr_Clear(); /* Raise a different error. */
- goto non_integral_error;
- }
+ PyNumberMethods *nb;
+ if (PyLong_Check(integral))
+ return integral;
+ nb = Py_TYPE(integral)->tp_as_number;
+ if (nb->nb_int) {
+ PyObject *as_int = nb->nb_int(integral);
Py_DECREF(integral);
- integral = PyEval_CallObject(int_func, NULL);
- Py_DECREF(int_func);
- if (integral && !PyLong_Check(integral)) {
- goto non_integral_error;
- }
+ if (!as_int)
+ return NULL;
+ if (PyLong_Check(as_int))
+ return as_int;
+ Py_DECREF(as_int);
}
- return integral;
-
-non_integral_error:
PyErr_Format(PyExc_TypeError, error_format, Py_TYPE(integral)->tp_name);
Py_DECREF(integral);
- return NULL;
+ return NULL;
}