mirror of
https://github.com/python/cpython.git
synced 2024-11-23 18:04:37 +08:00
Issue #27867: Function PySlice_GetIndicesEx() is replaced with a macro if
Py_LIMITED_API is not set or set to the value between 0x03050400 and 0x03060000 (not including) or 0x03060100 or higher.
This commit is contained in:
parent
07a1f65a93
commit
b2a5be0763
@ -41,8 +41,20 @@ PyAPI_FUNC(int) _PySlice_GetLongIndices(PySliceObject *self, PyObject *length,
|
||||
PyAPI_FUNC(int) PySlice_GetIndices(PyObject *r, Py_ssize_t length,
|
||||
Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step);
|
||||
PyAPI_FUNC(int) PySlice_GetIndicesEx(PyObject *r, Py_ssize_t length,
|
||||
Py_ssize_t *start, Py_ssize_t *stop,
|
||||
Py_ssize_t *step, Py_ssize_t *slicelength);
|
||||
Py_ssize_t *start, Py_ssize_t *stop,
|
||||
Py_ssize_t *step, Py_ssize_t *slicelength);
|
||||
|
||||
#if !defined(Py_LIMITED_API) || (Py_LIMITED_API+0 >= 0x03050400 && Py_LIMITED_API+0 < 0x03060000) || Py_LIMITED_API+0 >= 0x03060100
|
||||
#define PySlice_GetIndicesEx(slice, length, start, stop, step, slicelen) ( \
|
||||
PySlice_Unpack((slice), (start), (stop), (step)) < 0 ? -1 : \
|
||||
((*slicelen = PySlice_AdjustIndices((length), (start), (stop), *(step))), \
|
||||
0))
|
||||
PyAPI_FUNC(int) PySlice_Unpack(PyObject *slice,
|
||||
Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step);
|
||||
PyAPI_FUNC(Py_ssize_t) PySlice_AdjustIndices(Py_ssize_t length,
|
||||
Py_ssize_t *start, Py_ssize_t *stop,
|
||||
Py_ssize_t step);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -40,6 +40,10 @@ Library
|
||||
C API
|
||||
-----
|
||||
|
||||
- Issue #27867: Function PySlice_GetIndicesEx() is replaced with a macro if
|
||||
Py_LIMITED_API is not set or set to the value between 0x03050400
|
||||
and 0x03060000 (not including) or 0x03060100 or higher.
|
||||
|
||||
- Issue #29083: Fixed the declaration of some public API functions.
|
||||
PyArg_VaParse() and PyArg_VaParseTupleAndKeywords() were not available in
|
||||
limited API. PyArg_ValidateKeywordArguments(), PyArg_UnpackTuple() and
|
||||
|
@ -191,15 +191,12 @@ PySlice_GetIndices(PyObject *_r, Py_ssize_t length,
|
||||
}
|
||||
|
||||
int
|
||||
PySlice_GetIndicesEx(PyObject *_r, Py_ssize_t length,
|
||||
Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step,
|
||||
Py_ssize_t *slicelength)
|
||||
PySlice_Unpack(PyObject *_r,
|
||||
Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step)
|
||||
{
|
||||
PySliceObject *r = (PySliceObject*)_r;
|
||||
/* this is harder to get right than you might think */
|
||||
|
||||
Py_ssize_t defstart, defstop;
|
||||
|
||||
if (r->step == Py_None) {
|
||||
*step = 1;
|
||||
}
|
||||
@ -219,42 +216,75 @@ PySlice_GetIndicesEx(PyObject *_r, Py_ssize_t length,
|
||||
*step = -PY_SSIZE_T_MAX;
|
||||
}
|
||||
|
||||
defstart = *step < 0 ? length-1 : 0;
|
||||
defstop = *step < 0 ? -1 : length;
|
||||
|
||||
if (r->start == Py_None) {
|
||||
*start = defstart;
|
||||
*start = *step < 0 ? PY_SSIZE_T_MAX-1 : 0;;
|
||||
}
|
||||
else {
|
||||
if (!_PyEval_SliceIndex(r->start, start)) return -1;
|
||||
if (*start < 0) *start += length;
|
||||
if (*start < 0) *start = (*step < 0) ? -1 : 0;
|
||||
if (*start >= length)
|
||||
*start = (*step < 0) ? length - 1 : length;
|
||||
}
|
||||
|
||||
if (r->stop == Py_None) {
|
||||
*stop = defstop;
|
||||
*stop = *step < 0 ? -PY_SSIZE_T_MAX : PY_SSIZE_T_MAX;
|
||||
}
|
||||
else {
|
||||
if (!_PyEval_SliceIndex(r->stop, stop)) return -1;
|
||||
if (*stop < 0) *stop += length;
|
||||
if (*stop < 0) *stop = (*step < 0) ? -1 : 0;
|
||||
if (*stop >= length)
|
||||
*stop = (*step < 0) ? length - 1 : length;
|
||||
}
|
||||
|
||||
if ((*step < 0 && *stop >= *start)
|
||||
|| (*step > 0 && *start >= *stop)) {
|
||||
*slicelength = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
Py_ssize_t
|
||||
PySlice_AdjustIndices(Py_ssize_t length,
|
||||
Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t step)
|
||||
{
|
||||
/* this is harder to get right than you might think */
|
||||
|
||||
assert(step != 0);
|
||||
assert(step >= -PY_SSIZE_T_MAX);
|
||||
|
||||
if (*start < 0) {
|
||||
*start += length;
|
||||
if (*start < 0) {
|
||||
*start = (step < 0) ? -1 : 0;
|
||||
}
|
||||
}
|
||||
else if (*step < 0) {
|
||||
*slicelength = (*stop-*start+1)/(*step)+1;
|
||||
else if (*start >= length) {
|
||||
*start = (step < 0) ? length - 1 : length;
|
||||
}
|
||||
|
||||
if (*stop < 0) {
|
||||
*stop += length;
|
||||
if (*stop < 0) {
|
||||
*stop = (step < 0) ? -1 : 0;
|
||||
}
|
||||
}
|
||||
else if (*stop >= length) {
|
||||
*stop = (step < 0) ? length - 1 : length;
|
||||
}
|
||||
|
||||
if (step < 0) {
|
||||
if (*stop < *start) {
|
||||
return (*start - *stop - 1) / (-step) + 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
*slicelength = (*stop-*start-1)/(*step)+1;
|
||||
if (*start < *stop) {
|
||||
return (*stop - *start - 1) / step + 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#undef PySlice_GetIndicesEx
|
||||
|
||||
int
|
||||
PySlice_GetIndicesEx(PyObject *_r, Py_ssize_t length,
|
||||
Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step,
|
||||
Py_ssize_t *slicelength)
|
||||
{
|
||||
if (PySlice_Unpack(_r, start, stop, step) < 0)
|
||||
return -1;
|
||||
*slicelength = PySlice_AdjustIndices(length, start, stop, *step);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -527,10 +527,12 @@ EXPORTS
|
||||
PySet_Pop=python35.PySet_Pop
|
||||
PySet_Size=python35.PySet_Size
|
||||
PySet_Type=python35.PySet_Type DATA
|
||||
PySlice_AdjustIndices=python35.PySlice_AdjustIndices
|
||||
PySlice_GetIndices=python35.PySlice_GetIndices
|
||||
PySlice_GetIndicesEx=python35.PySlice_GetIndicesEx
|
||||
PySlice_New=python35.PySlice_New
|
||||
PySlice_Type=python35.PySlice_Type DATA
|
||||
PySlice_Unpack=python35.PySlice_Unpack
|
||||
PySortWrapper_Type=python35.PySortWrapper_Type DATA
|
||||
PyState_AddModule=python35.PyState_AddModule
|
||||
PyState_FindModule=python35.PyState_FindModule
|
||||
|
Loading…
Reference in New Issue
Block a user