@@ -131,13 +131,12 @@ PySlice_GetIndices(PySliceObject *r, Py_ssize_t length,
131
131
}
132
132
133
133
int
134
- PySlice_GetIndicesEx ( PySliceObject * r , Py_ssize_t length ,
135
- Py_ssize_t * start , Py_ssize_t * stop , Py_ssize_t * step , Py_ssize_t * slicelength )
134
+ _PySlice_Unpack ( PyObject * _r ,
135
+ Py_ssize_t * start , Py_ssize_t * stop , Py_ssize_t * step )
136
136
{
137
+ PySliceObject * r = (PySliceObject * )_r ;
137
138
/* this is harder to get right than you might think */
138
139
139
- Py_ssize_t defstart , defstop ;
140
-
141
140
if (r -> step == Py_None ) {
142
141
* step = 1 ;
143
142
}
@@ -150,42 +149,75 @@ PySlice_GetIndicesEx(PySliceObject *r, Py_ssize_t length,
150
149
}
151
150
}
152
151
153
- defstart = * step < 0 ? length - 1 : 0 ;
154
- defstop = * step < 0 ? -1 : length ;
155
-
156
152
if (r -> start == Py_None ) {
157
- * start = defstart ;
153
+ * start = * step < 0 ? PY_SSIZE_T_MAX - 1 : 0 ; ;
158
154
}
159
155
else {
160
156
if (!_PyEval_SliceIndex (r -> start , start )) return -1 ;
161
- if (* start < 0 ) * start += length ;
162
- if (* start < 0 ) * start = (* step < 0 ) ? -1 : 0 ;
163
- if (* start >= length )
164
- * start = (* step < 0 ) ? length - 1 : length ;
165
157
}
166
158
167
159
if (r -> stop == Py_None ) {
168
- * stop = defstop ;
160
+ * stop = * step < 0 ? - PY_SSIZE_T_MAX : PY_SSIZE_T_MAX ;
169
161
}
170
162
else {
171
163
if (!_PyEval_SliceIndex (r -> stop , stop )) return -1 ;
172
- if (* stop < 0 ) * stop += length ;
173
- if (* stop < 0 ) * stop = (* step < 0 ) ? -1 : 0 ;
174
- if (* stop >= length )
175
- * stop = (* step < 0 ) ? length - 1 : length ;
176
164
}
177
165
178
- if ((* step < 0 && * stop >= * start )
179
- || (* step > 0 && * start >= * stop )) {
180
- * slicelength = 0 ;
166
+ return 0 ;
167
+ }
168
+
169
+ Py_ssize_t
170
+ _PySlice_AdjustIndices (Py_ssize_t length ,
171
+ Py_ssize_t * start , Py_ssize_t * stop , Py_ssize_t step )
172
+ {
173
+ /* this is harder to get right than you might think */
174
+
175
+ assert (step != 0 );
176
+ assert (step >= - PY_SSIZE_T_MAX );
177
+
178
+ if (* start < 0 ) {
179
+ * start += length ;
180
+ if (* start < 0 ) {
181
+ * start = (step < 0 ) ? -1 : 0 ;
182
+ }
181
183
}
182
- else if (* step < 0 ) {
183
- * slicelength = (* stop - * start + 1 )/(* step )+ 1 ;
184
+ else if (* start >= length ) {
185
+ * start = (step < 0 ) ? length - 1 : length ;
186
+ }
187
+
188
+ if (* stop < 0 ) {
189
+ * stop += length ;
190
+ if (* stop < 0 ) {
191
+ * stop = (step < 0 ) ? -1 : 0 ;
192
+ }
193
+ }
194
+ else if (* stop >= length ) {
195
+ * stop = (step < 0 ) ? length - 1 : length ;
196
+ }
197
+
198
+ if (step < 0 ) {
199
+ if (* stop < * start ) {
200
+ return (* start - * stop - 1 ) / (- step ) + 1 ;
201
+ }
184
202
}
185
203
else {
186
- * slicelength = (* stop - * start - 1 )/(* step )+ 1 ;
204
+ if (* start < * stop ) {
205
+ return (* stop - * start - 1 ) / step + 1 ;
206
+ }
187
207
}
208
+ return 0 ;
209
+ }
210
+
211
+ #undef PySlice_GetIndicesEx
188
212
213
+ int
214
+ PySlice_GetIndicesEx (PySliceObject * r , Py_ssize_t length ,
215
+ Py_ssize_t * start , Py_ssize_t * stop , Py_ssize_t * step ,
216
+ Py_ssize_t * slicelength )
217
+ {
218
+ if (_PySlice_Unpack ((PyObject * )r , start , stop , step ) < 0 )
219
+ return -1 ;
220
+ * slicelength = _PySlice_AdjustIndices (length , start , stop , * step );
189
221
return 0 ;
190
222
}
191
223
0 commit comments