bpo-40792: Make the result of PyNumber_Index() always having exact type int. (GH-20443)
Previously, the result could have been an instance of a subclass of int.
Also revert bpo-26202 and make attributes start, stop and step of the range
object having exact type int.
Add private function _PyNumber_Index() which preserves the old behavior
of PyNumber_Index() for performance to use it in the conversion functions
like PyLong_AsLong().
diff --git a/Objects/longobject.c b/Objects/longobject.c
index e040d6c..4ae17c9 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -394,7 +394,7 @@
v = (PyLongObject *)vv;
}
else {
- v = (PyLongObject *)PyNumber_Index(vv);
+ v = (PyLongObject *)_PyNumber_Index(vv);
if (v == NULL)
return -1;
do_decref = 1;
@@ -674,7 +674,7 @@
return _PyLong_AsUnsignedLongMask(op);
}
- lo = (PyLongObject *)PyNumber_Index(op);
+ lo = (PyLongObject *)_PyNumber_Index(op);
if (lo == NULL)
return (unsigned long)-1;
@@ -1132,7 +1132,7 @@
v = (PyLongObject *)vv;
}
else {
- v = (PyLongObject *)PyNumber_Index(vv);
+ v = (PyLongObject *)_PyNumber_Index(vv);
if (v == NULL)
return -1;
do_decref = 1;
@@ -1247,7 +1247,7 @@
return _PyLong_AsUnsignedLongLongMask(op);
}
- lo = (PyLongObject *)PyNumber_Index(op);
+ lo = (PyLongObject *)_PyNumber_Index(op);
if (lo == NULL)
return (unsigned long long)-1;
@@ -1287,7 +1287,7 @@
v = (PyLongObject *)vv;
}
else {
- v = (PyLongObject *)PyNumber_Index(vv);
+ v = (PyLongObject *)_PyNumber_Index(vv);
if (v == NULL)
return -1;
do_decref = 1;
@@ -5180,7 +5180,7 @@
if (o_ndigits == NULL)
return long_long(self);
- ndigits = PyNumber_Index(o_ndigits);
+ ndigits = _PyNumber_Index(o_ndigits);
if (ndigits == NULL)
return NULL;