| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
4 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -41,8 +41,20 @@ PyAPI_FUNC(int) _PySlice_GetLongIndices(PySliceObject *self, PyObject *length, | |||
| 41 | 41 | PyAPI_FUNC(int) PySlice_GetIndices(PyObject *r, Py_ssize_t length, | |
| 42 | 42 | Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step); | |
| 43 | 43 | PyAPI_FUNC(int) PySlice_GetIndicesEx(PyObject *r, Py_ssize_t length, | |
| 44 | - Py_ssize_t *start, Py_ssize_t *stop, | ||
| 45 | - Py_ssize_t *step, Py_ssize_t *slicelength); | ||
| 44 | + Py_ssize_t *start, Py_ssize_t *stop, | ||
| 45 | + Py_ssize_t *step, Py_ssize_t *slicelength); | ||
| 46 | + | ||
| 47 | + #if !defined(Py_LIMITED_API) || (Py_LIMITED_API+0 >= 0x03050400 && Py_LIMITED_API+0 < 0x03060000) || Py_LIMITED_API+0 >= 0x03060100 | ||
| 48 | + #define PySlice_GetIndicesEx(slice, length, start, stop, step, slicelen) ( \ | ||
| 49 | + PySlice_Unpack((slice), (start), (stop), (step)) < 0 ? -1 : \ | ||
| 50 | + ((*slicelen = PySlice_AdjustIndices((length), (start), (stop), *(step))), \ | ||
| 51 | + 0)) | ||
| 52 | + PyAPI_FUNC(int) PySlice_Unpack(PyObject *slice, | ||
| 53 | + Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step); | ||
| 54 | + PyAPI_FUNC(Py_ssize_t) PySlice_AdjustIndices(Py_ssize_t length, | ||
| 55 | + Py_ssize_t *start, Py_ssize_t *stop, | ||
| 56 | + Py_ssize_t step); | ||
| 57 | + #endif | ||
| 46 | 58 | ||
| 47 | 59 | #ifdef __cplusplus | |
| 48 | 60 | } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -143,6 +143,10 @@ Windows | |||
| 143 | 143 | C API | |
| 144 | 144 | ----- | |
| 145 | 145 | ||
| 146 | + - Issue #27867: Function PySlice_GetIndicesEx() is replaced with a macro if | ||
| 147 | + Py_LIMITED_API is not set or set to the value between 0x03050400 | ||
| 148 | + and 0x03060000 (not including) or 0x03060100 or higher. | ||
| 149 | + | ||
| 146 | 150 | - Issue #29083: Fixed the declaration of some public API functions. | |
| 147 | 151 | PyArg_VaParse() and PyArg_VaParseTupleAndKeywords() were not available in | |
| 148 | 152 | limited API. PyArg_ValidateKeywordArguments(), PyArg_UnpackTuple() and | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -191,15 +191,12 @@ PySlice_GetIndices(PyObject *_r, Py_ssize_t length, | |||
| 191 | 191 | } | |
| 192 | 192 | ||
| 193 | 193 | int | |
| 194 | - PySlice_GetIndicesEx(PyObject *_r, Py_ssize_t length, | ||
| 195 | - Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step, | ||
| 196 | - Py_ssize_t *slicelength) | ||
| 194 | + PySlice_Unpack(PyObject *_r, | ||
| 195 | + Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step) | ||
| 197 | 196 | { | |
| 198 | 197 | PySliceObject *r = (PySliceObject*)_r; | |
| 199 | 198 | /* this is harder to get right than you might think */ | |
| 200 | 199 | ||
| 201 | - Py_ssize_t defstart, defstop; | ||
| 202 | - | ||
| 203 | 200 | if (r->step == Py_None) { | |
| 204 | 201 | *step = 1; | |
| 205 | 202 | } | |
@@ -219,42 +216,75 @@ PySlice_GetIndicesEx(PyObject *_r, Py_ssize_t length, | |||
| 219 | 216 | *step = -PY_SSIZE_T_MAX; | |
| 220 | 217 | } | |
| 221 | 218 | ||
| 222 | - defstart = *step < 0 ? length-1 : 0; | ||
| 223 | - defstop = *step < 0 ? -1 : length; | ||
| 224 | - | ||
| 225 | 219 | if (r->start == Py_None) { | |
| 226 | - *start = defstart; | ||
| 220 | + *start = *step < 0 ? PY_SSIZE_T_MAX-1 : 0;; | ||
| 227 | 221 | } | |
| 228 | 222 | else { | |
| 229 | 223 | if (!_PyEval_SliceIndex(r->start, start)) return -1; | |
| 230 | - if (*start < 0) *start += length; | ||
| 231 | - if (*start < 0) *start = (*step < 0) ? -1 : 0; | ||
| 232 | - if (*start >= length) | ||
| 233 | - *start = (*step < 0) ? length - 1 : length; | ||
| 234 | 224 | } | |
| 235 | 225 | ||
| 236 | 226 | if (r->stop == Py_None) { | |
| 237 | - *stop = defstop; | ||
| 227 | + *stop = *step < 0 ? -PY_SSIZE_T_MAX : PY_SSIZE_T_MAX; | ||
| 238 | 228 | } | |
| 239 | 229 | else { | |
| 240 | 230 | if (!_PyEval_SliceIndex(r->stop, stop)) return -1; | |
| 241 | - if (*stop < 0) *stop += length; | ||
| 242 | - if (*stop < 0) *stop = (*step < 0) ? -1 : 0; | ||
| 243 | - if (*stop >= length) | ||
| 244 | - *stop = (*step < 0) ? length - 1 : length; | ||
| 245 | 231 | } | |
| 246 | 232 | ||
| 247 | - if ((*step < 0 && *stop >= *start) | ||
| 248 | - || (*step > 0 && *start >= *stop)) { | ||
| 249 | - *slicelength = 0; | ||
| 233 | + return 0; | ||
| 234 | + } | ||
| 235 | + | ||
| 236 | + Py_ssize_t | ||
| 237 | + PySlice_AdjustIndices(Py_ssize_t length, | ||
| 238 | + Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t step) | ||
| 239 | + { | ||
| 240 | + /* this is harder to get right than you might think */ | ||
| 241 | + | ||
| 242 | + assert(step != 0); | ||
| 243 | + assert(step >= -PY_SSIZE_T_MAX); | ||
| 244 | + | ||
| 245 | + if (*start < 0) { | ||
| 246 | + *start += length; | ||
| 247 | + if (*start < 0) { | ||
| 248 | + *start = (step < 0) ? -1 : 0; | ||
| 249 | + } | ||
| 250 | 250 | } | |
| 251 | - else if (*step < 0) { | ||
| 252 | - *slicelength = (*stop-*start+1)/(*step)+1; | ||
| 251 | + else if (*start >= length) { | ||
| 252 | + *start = (step < 0) ? length - 1 : length; | ||
| 253 | + } | ||
| 254 | + | ||
| 255 | + if (*stop < 0) { | ||
| 256 | + *stop += length; | ||
| 257 | + if (*stop < 0) { | ||
| 258 | + *stop = (step < 0) ? -1 : 0; | ||
| 259 | + } | ||
| 260 | + } | ||
| 261 | + else if (*stop >= length) { | ||
| 262 | + *stop = (step < 0) ? length - 1 : length; | ||
| 263 | + } | ||
| 264 | + | ||
| 265 | + if (step < 0) { | ||
| 266 | + if (*stop < *start) { | ||
| 267 | + return (*start - *stop - 1) / (-step) + 1; | ||
| 268 | + } | ||
| 253 | 269 | } | |
| 254 | 270 | else { | |
| 255 | - *slicelength = (*stop-*start-1)/(*step)+1; | ||
| 271 | + if (*start < *stop) { | ||
| 272 | + return (*stop - *start - 1) / step + 1; | ||
| 273 | + } | ||
| 256 | 274 | } | |
| 275 | + return 0; | ||
| 276 | + } | ||
| 277 | + | ||
| 278 | + #undef PySlice_GetIndicesEx | ||
| 257 | 279 | ||
| 280 | + int | ||
| 281 | + PySlice_GetIndicesEx(PyObject *_r, Py_ssize_t length, | ||
| 282 | + Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step, | ||
| 283 | + Py_ssize_t *slicelength) | ||
| 284 | + { | ||
| 285 | + if (PySlice_Unpack(_r, start, stop, step) < 0) | ||
| 286 | + return -1; | ||
| 287 | + *slicelength = PySlice_AdjustIndices(length, start, stop, *step); | ||
| 258 | 288 | return 0; | |
| 259 | 289 | } | |
| 260 | 290 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -531,10 +531,12 @@ EXPORTS | |||
| 531 | 531 | PySet_Pop=python36.PySet_Pop | |
| 532 | 532 | PySet_Size=python36.PySet_Size | |
| 533 | 533 | PySet_Type=python36.PySet_Type DATA | |
| 534 | + PySlice_AdjustIndices=python36.PySlice_AdjustIndices | ||
| 534 | 535 | PySlice_GetIndices=python36.PySlice_GetIndices | |
| 535 | 536 | PySlice_GetIndicesEx=python36.PySlice_GetIndicesEx | |
| 536 | 537 | PySlice_New=python36.PySlice_New | |
| 537 | 538 | PySlice_Type=python36.PySlice_Type DATA | |
| 539 | + PySlice_Unpack=python36.PySlice_Unpack | ||
| 538 | 540 | PySortWrapper_Type=python36.PySortWrapper_Type DATA | |
| 539 | 541 | PyState_AddModule=python36.PyState_AddModule | |
| 540 | 542 | PyState_FindModule=python36.PyState_FindModule | |
| Back | FazBrowse Home | New Git URL |
0 commit comments