gh-145192: improve performance of PySequence_GetSlice (#145193)

This commit is contained in:
Pieter Eendebak 2026-05-23 12:15:50 +02:00 committed by GitHub
parent e8545ed3ea
commit dfeeee990b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 17 additions and 21 deletions

View file

@ -12,7 +12,7 @@ extern "C" {
/* runtime lifecycle */
PyAPI_FUNC(PyObject *)
_PyBuildSlice_ConsumeRefs(PyObject *start, PyObject *stop);
_PyBuildSlice_ConsumeRefs(PyObject *start, PyObject *stop, PyObject *step);
#ifdef __cplusplus
}

View file

@ -12007,7 +12007,8 @@
v = stack_pointer[-4];
_PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
PyStackRef_AsPyObjectSteal(stop));
PyStackRef_AsPyObjectSteal(stop),
Py_None);
stack_pointer = _PyFrame_GetStackPointer(frame);
int err;
if (slice == NULL) {

View file

@ -117,8 +117,8 @@ PyObject _Py_EllipsisObject = _PyObject_HEAD_INIT(&PyEllipsis_Type);
index is present.
*/
static PySliceObject *
_PyBuildSlice_Consume2(PyObject *start, PyObject *stop, PyObject *step)
PyObject *
_PyBuildSlice_ConsumeRefs(PyObject *start, PyObject *stop, PyObject *step)
{
assert(start != NULL && stop != NULL && step != NULL);
PySliceObject *obj = _Py_FREELIST_POP(PySliceObject, slices);
@ -131,13 +131,14 @@ _PyBuildSlice_Consume2(PyObject *start, PyObject *stop, PyObject *step)
obj->start = start;
obj->stop = stop;
obj->step = Py_NewRef(step);
obj->step = step;
_PyObject_GC_TRACK(obj);
return obj;
return (PyObject *)obj;
error:
Py_DECREF(start);
Py_DECREF(stop);
Py_DECREF(step);
return NULL;
}
@ -153,15 +154,8 @@ PySlice_New(PyObject *start, PyObject *stop, PyObject *step)
if (stop == NULL) {
stop = Py_None;
}
return (PyObject *)_PyBuildSlice_Consume2(Py_NewRef(start),
Py_NewRef(stop), step);
}
PyObject *
_PyBuildSlice_ConsumeRefs(PyObject *start, PyObject *stop)
{
assert(start != NULL && stop != NULL);
return (PyObject *)_PyBuildSlice_Consume2(start, stop, Py_None);
return _PyBuildSlice_ConsumeRefs(Py_NewRef(start),
Py_NewRef(stop), Py_NewRef(step));
}
PyObject *
@ -177,9 +171,7 @@ _PySlice_FromIndices(Py_ssize_t istart, Py_ssize_t istop)
return NULL;
}
slice = PySlice_New(start, end, NULL);
Py_DECREF(start);
Py_DECREF(end);
slice = _PyBuildSlice_ConsumeRefs(start, end, Py_None);
return slice;
}

View file

@ -1116,7 +1116,8 @@ dummy_func(
op(_STORE_SLICE, (v, container, start, stop -- )) {
PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
PyStackRef_AsPyObjectSteal(stop));
PyStackRef_AsPyObjectSteal(stop),
Py_None);
int err;
if (slice == NULL) {
err = 1;

View file

@ -6811,7 +6811,8 @@
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
_PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
PyStackRef_AsPyObjectSteal(stop));
PyStackRef_AsPyObjectSteal(stop),
Py_None);
stack_pointer = _PyFrame_GetStackPointer(frame);
int err;
if (slice == NULL) {

View file

@ -12004,7 +12004,8 @@
v = stack_pointer[-4];
_PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
PyStackRef_AsPyObjectSteal(stop));
PyStackRef_AsPyObjectSteal(stop),
Py_None);
stack_pointer = _PyFrame_GetStackPointer(frame);
int err;
if (slice == NULL) {