mirror of
https://github.com/python/cpython.git
synced 2026-06-04 16:50:51 +00:00
gh-145192: improve performance of PySequence_GetSlice (#145193)
This commit is contained in:
parent
e8545ed3ea
commit
dfeeee990b
6 changed files with 17 additions and 21 deletions
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
3
Modules/_testinternalcapi/test_cases.c.h
generated
3
Modules/_testinternalcapi/test_cases.c.h
generated
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
3
Python/executor_cases.c.h
generated
3
Python/executor_cases.c.h
generated
|
|
@ -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) {
|
||||
|
|
|
|||
3
Python/generated_cases.c.h
generated
3
Python/generated_cases.c.h
generated
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue