]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-145192: improve performance of `PySequence_GetSlice` (#145193)
authorPieter Eendebak <pieter.eendebak@gmail.com>
Sat, 23 May 2026 10:15:50 +0000 (12:15 +0200)
committerGitHub <noreply@github.com>
Sat, 23 May 2026 10:15:50 +0000 (15:45 +0530)
Include/internal/pycore_sliceobject.h
Modules/_testinternalcapi/test_cases.c.h
Objects/sliceobject.c
Python/bytecodes.c
Python/executor_cases.c.h
Python/generated_cases.c.h

index ba8b1f1cb27dee3219436416586b2bb3e3b8d4e3..b6c821764886c3606fb58028e8bb9086c13170c3 100644 (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
 }
index a2506524f0bb6dc34a7fe1d195c7857227fcca3c..b463bb18b160564245031128a7f8bc95c8cac885 100644 (file)
                 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) {
index 95f10815687757e03cd8deee065dac49de4cab64..96ff3118dc4405dbb28e7069dc5b98d555fe114e 100644 (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;
 }
 
index f7487c7136962f15acbdf2e99aa6c433923e692d..300b7da753c2baf9e119b6af6dfd206febf77255 100644 (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;
index efa61d7de74e88c13068bf5f6672d6f4a2d8259c..952860f01b8a6826eb0d3d2cce965a0e6d72e913 100644 (file)
             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) {
index 53e09a8f4523c7c92f97f97d67228404a281cdd5..83051cf41cc043b780fa6df389fd2947c4bb505b 100644 (file)
                 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) {