Skip to content

Commit dfeeee9

Browse files
authored
gh-145192: improve performance of PySequence_GetSlice (#145193)
1 parent e8545ed commit dfeeee9

6 files changed

Lines changed: 17 additions & 21 deletions

File tree

Include/internal/pycore_sliceobject.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ extern "C" {
1212
/* runtime lifecycle */
1313

1414
PyAPI_FUNC(PyObject *)
15-
_PyBuildSlice_ConsumeRefs(PyObject *start, PyObject *stop);
15+
_PyBuildSlice_ConsumeRefs(PyObject *start, PyObject *stop, PyObject *step);
1616

1717
#ifdef __cplusplus
1818
}

Modules/_testinternalcapi/test_cases.c.h

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Objects/sliceobject.c

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,8 @@ PyObject _Py_EllipsisObject = _PyObject_HEAD_INIT(&PyEllipsis_Type);
117117
index is present.
118118
*/
119119

120-
static PySliceObject *
121-
_PyBuildSlice_Consume2(PyObject *start, PyObject *stop, PyObject *step)
120+
PyObject *
121+
_PyBuildSlice_ConsumeRefs(PyObject *start, PyObject *stop, PyObject *step)
122122
{
123123
assert(start != NULL && stop != NULL && step != NULL);
124124
PySliceObject *obj = _Py_FREELIST_POP(PySliceObject, slices);
@@ -131,13 +131,14 @@ _PyBuildSlice_Consume2(PyObject *start, PyObject *stop, PyObject *step)
131131

132132
obj->start = start;
133133
obj->stop = stop;
134-
obj->step = Py_NewRef(step);
134+
obj->step = step;
135135

136136
_PyObject_GC_TRACK(obj);
137-
return obj;
137+
return (PyObject *)obj;
138138
error:
139139
Py_DECREF(start);
140140
Py_DECREF(stop);
141+
Py_DECREF(step);
141142
return NULL;
142143
}
143144

@@ -153,15 +154,8 @@ PySlice_New(PyObject *start, PyObject *stop, PyObject *step)
153154
if (stop == NULL) {
154155
stop = Py_None;
155156
}
156-
return (PyObject *)_PyBuildSlice_Consume2(Py_NewRef(start),
157-
Py_NewRef(stop), step);
158-
}
159-
160-
PyObject *
161-
_PyBuildSlice_ConsumeRefs(PyObject *start, PyObject *stop)
162-
{
163-
assert(start != NULL && stop != NULL);
164-
return (PyObject *)_PyBuildSlice_Consume2(start, stop, Py_None);
157+
return _PyBuildSlice_ConsumeRefs(Py_NewRef(start),
158+
Py_NewRef(stop), Py_NewRef(step));
165159
}
166160

167161
PyObject *
@@ -177,9 +171,7 @@ _PySlice_FromIndices(Py_ssize_t istart, Py_ssize_t istop)
177171
return NULL;
178172
}
179173

180-
slice = PySlice_New(start, end, NULL);
181-
Py_DECREF(start);
182-
Py_DECREF(end);
174+
slice = _PyBuildSlice_ConsumeRefs(start, end, Py_None);
183175
return slice;
184176
}
185177

Python/bytecodes.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1116,7 +1116,8 @@ dummy_func(
11161116

11171117
op(_STORE_SLICE, (v, container, start, stop -- )) {
11181118
PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
1119-
PyStackRef_AsPyObjectSteal(stop));
1119+
PyStackRef_AsPyObjectSteal(stop),
1120+
Py_None);
11201121
int err;
11211122
if (slice == NULL) {
11221123
err = 1;

Python/executor_cases.c.h

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Python/generated_cases.c.h

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)