@@ -272,6 +272,15 @@ PyList_GetItemRef(PyObject *op, Py_ssize_t i)
272
272
return Py_NewRef (PyList_GET_ITEM (op , i ));
273
273
}
274
274
275
+ static inline PyObject *
276
+ list_get_item_ref (PyListObject * op , Py_ssize_t i )
277
+ {
278
+ if (!valid_index (i , Py_SIZE (op ))) {
279
+ return NULL ;
280
+ }
281
+ return Py_NewRef (PyList_GET_ITEM (op , i ));
282
+ }
283
+
275
284
int
276
285
PyList_SetItem (PyObject * op , Py_ssize_t i ,
277
286
PyObject * newitem )
@@ -478,18 +487,20 @@ list_length(PyObject *a)
478
487
static int
479
488
list_contains (PyObject * aa , PyObject * el )
480
489
{
481
- PyListObject * a = (PyListObject * )aa ;
482
- PyObject * item ;
483
- Py_ssize_t i ;
484
- int cmp ;
485
490
486
- for (i = 0 , cmp = 0 ; cmp == 0 && i < Py_SIZE (a ); ++ i ) {
487
- item = PyList_GET_ITEM (a , i );
488
- Py_INCREF (item );
489
- cmp = PyObject_RichCompareBool (item , el , Py_EQ );
491
+ for (Py_ssize_t i = 0 ; ; i ++ ) {
492
+ PyObject * item = list_get_item_ref ((PyListObject * )aa , i );
493
+ if (item == NULL ) {
494
+ // out-of-bounds
495
+ return 0 ;
496
+ }
497
+ int cmp = PyObject_RichCompareBool (item , el , Py_EQ );
490
498
Py_DECREF (item );
499
+ if (cmp != 0 ) {
500
+ return cmp ;
501
+ }
491
502
}
492
- return cmp ;
503
+ return 0 ;
493
504
}
494
505
495
506
static PyObject *
@@ -2724,8 +2735,6 @@ list_index_impl(PyListObject *self, PyObject *value, Py_ssize_t start,
2724
2735
Py_ssize_t stop )
2725
2736
/*[clinic end generated code: output=ec51b88787e4e481 input=40ec5826303a0eb1]*/
2726
2737
{
2727
- Py_ssize_t i ;
2728
-
2729
2738
if (start < 0 ) {
2730
2739
start += Py_SIZE (self );
2731
2740
if (start < 0 )
@@ -2736,9 +2745,12 @@ list_index_impl(PyListObject *self, PyObject *value, Py_ssize_t start,
2736
2745
if (stop < 0 )
2737
2746
stop = 0 ;
2738
2747
}
2739
- for (i = start ; i < stop && i < Py_SIZE (self ); i ++ ) {
2740
- PyObject * obj = self -> ob_item [i ];
2741
- Py_INCREF (obj );
2748
+ for (Py_ssize_t i = start ; i < stop ; i ++ ) {
2749
+ PyObject * obj = list_get_item_ref (self , i );
2750
+ if (obj == NULL ) {
2751
+ // out-of-bounds
2752
+ break ;
2753
+ }
2742
2754
int cmp = PyObject_RichCompareBool (obj , value , Py_EQ );
2743
2755
Py_DECREF (obj );
2744
2756
if (cmp > 0 )
@@ -2764,15 +2776,17 @@ list_count(PyListObject *self, PyObject *value)
2764
2776
/*[clinic end generated code: output=b1f5d284205ae714 input=3bdc3a5e6f749565]*/
2765
2777
{
2766
2778
Py_ssize_t count = 0 ;
2767
- Py_ssize_t i ;
2768
-
2769
- for (i = 0 ; i < Py_SIZE (self ); i ++ ) {
2770
- PyObject * obj = self -> ob_item [i ];
2779
+ for (Py_ssize_t i = 0 ; ; i ++ ) {
2780
+ PyObject * obj = list_get_item_ref (self , i );
2781
+ if (obj == NULL ) {
2782
+ // out-of-bounds
2783
+ break ;
2784
+ }
2771
2785
if (obj == value ) {
2772
2786
count ++ ;
2787
+ Py_DECREF (obj );
2773
2788
continue ;
2774
2789
}
2775
- Py_INCREF (obj );
2776
2790
int cmp = PyObject_RichCompareBool (obj , value , Py_EQ );
2777
2791
Py_DECREF (obj );
2778
2792
if (cmp > 0 )
0 commit comments