@@ -191,15 +191,12 @@ PySlice_GetIndices(PyObject *_r, Py_ssize_t length,
191191}
192192
193193int
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 )
197196{
198197 PySliceObject * r = (PySliceObject * )_r ;
199198 /* this is harder to get right than you might think */
200199
201- Py_ssize_t defstart , defstop ;
202-
203200 if (r -> step == Py_None ) {
204201 * step = 1 ;
205202 }
@@ -219,42 +216,75 @@ PySlice_GetIndicesEx(PyObject *_r, Py_ssize_t length,
219216 * step = - PY_SSIZE_T_MAX ;
220217 }
221218
222- defstart = * step < 0 ? length - 1 : 0 ;
223- defstop = * step < 0 ? -1 : length ;
224-
225219 if (r -> start == Py_None ) {
226- * start = defstart ;
220+ * start = * step < 0 ? PY_SSIZE_T_MAX - 1 : 0 ; ;
227221 }
228222 else {
229223 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 ;
234224 }
235225
236226 if (r -> stop == Py_None ) {
237- * stop = defstop ;
227+ * stop = * step < 0 ? - PY_SSIZE_T_MAX : PY_SSIZE_T_MAX ;
238228 }
239229 else {
240230 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 ;
245231 }
246232
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+ }
250250 }
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+ }
253269 }
254270 else {
255- * slicelength = (* stop - * start - 1 )/(* step )+ 1 ;
271+ if (* start < * stop ) {
272+ return (* stop - * start - 1 ) / step + 1 ;
273+ }
256274 }
275+ return 0 ;
276+ }
277+
278+ #undef PySlice_GetIndicesEx
257279
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 );
258288 return 0 ;
259289}
260290
0 commit comments