11/* Execute compiled code */
22
33#include "ceval.h"
4+ #include "pycore_long.h"
45
56int
67Py_GetRecursionLimit (void )
@@ -2886,7 +2887,22 @@ _PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
28862887 PyThreadState * tstate = _PyThreadState_GET ();
28872888 if (!Py_IsNone (v )) {
28882889 Py_ssize_t x ;
2889- if (_PyIndex_Check (v )) {
2890+ if (PyLong_CheckExact (v )) {
2891+ // Fast path for compact ints (single digit) -- most slice indices.
2892+ if (_PyLong_IsCompact ((PyLongObject * )v )) {
2893+ x = _PyLong_CompactValue ((PyLongObject * )v );
2894+ }
2895+ else {
2896+ x = PyLong_AsSsize_t (v );
2897+ if (x == -1 && _PyErr_Occurred (tstate )) {
2898+ assert (_PyErr_ExceptionMatches (tstate , PyExc_OverflowError ));
2899+ _PyErr_Clear (tstate );
2900+ x = _PyLong_IsNegative ((PyLongObject * )v )
2901+ ? PY_SSIZE_T_MIN : PY_SSIZE_T_MAX ;
2902+ }
2903+ }
2904+ }
2905+ else if (_PyIndex_Check (v )) {
28902906 x = PyNumber_AsSsize_t (v , NULL );
28912907 if (x == -1 && _PyErr_Occurred (tstate ))
28922908 return 0 ;
@@ -2907,7 +2923,21 @@ _PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi)
29072923{
29082924 PyThreadState * tstate = _PyThreadState_GET ();
29092925 Py_ssize_t x ;
2910- if (_PyIndex_Check (v )) {
2926+ if (PyLong_CheckExact (v )) {
2927+ if (_PyLong_IsCompact ((PyLongObject * )v )) {
2928+ x = _PyLong_CompactValue ((PyLongObject * )v );
2929+ }
2930+ else {
2931+ x = PyLong_AsSsize_t (v );
2932+ if (x == -1 && _PyErr_Occurred (tstate )) {
2933+ assert (_PyErr_ExceptionMatches (tstate , PyExc_OverflowError ));
2934+ _PyErr_Clear (tstate );
2935+ x = _PyLong_IsNegative ((PyLongObject * )v )
2936+ ? PY_SSIZE_T_MIN : PY_SSIZE_T_MAX ;
2937+ }
2938+ }
2939+ }
2940+ else if (_PyIndex_Check (v )) {
29112941 x = PyNumber_AsSsize_t (v , NULL );
29122942 if (x == -1 && _PyErr_Occurred (tstate ))
29132943 return 0 ;
0 commit comments