File tree Expand file tree Collapse file tree 3 files changed +16
-3
lines changed Expand file tree Collapse file tree 3 files changed +16
-3
lines changed Original file line number Diff line number Diff line change @@ -198,7 +198,6 @@ def test_preallocation(self):
198
198
self .assertEqual (iter_size , sys .getsizeof (list ([0 ] * 10 )))
199
199
self .assertEqual (iter_size , sys .getsizeof (list (range (10 ))))
200
200
201
- @unittest .skip ("TODO: RUSTPYTHON; hang" )
202
201
def test_count_index_remove_crashes (self ):
203
202
# bpo-38610: The count(), index(), and remove() methods were not
204
203
# holding strong references to list elements while calling
Original file line number Diff line number Diff line change @@ -655,4 +655,17 @@ def __eq__(self, other):
655
655
l = [1 , 2 , 3 , m , 4 ]
656
656
m .list = l
657
657
l .remove (4 )
658
- assert_raises (ValueError , lambda : l .index (4 )) # element 4 must not be in the list
658
+ assert_raises (ValueError , lambda : l .index (4 )) # element 4 must not be in the list
659
+
660
+ # Test no panic occured when list elements was deleted in __eq__
661
+ class rewrite_list_eq (list ):
662
+ pass
663
+
664
+ class poc :
665
+ def __eq__ (self , other ):
666
+ list1 .clear ()
667
+ return self
668
+
669
+ list1 = rewrite_list_eq ([poc ()])
670
+ list1 .remove (list1 )
671
+ assert list1 == []
Original file line number Diff line number Diff line change @@ -300,7 +300,8 @@ impl PyList {
300
300
301
301
if let Some ( index) = index. into ( ) {
302
302
// defer delete out of borrow
303
- Ok ( self . borrow_vec_mut ( ) . remove ( index) )
303
+ let is_inside_range = index < self . borrow_vec ( ) . len ( ) ;
304
+ Ok ( is_inside_range. then ( || self . borrow_vec_mut ( ) . remove ( index) ) )
304
305
} else {
305
306
Err ( vm. new_value_error ( format ! ( "'{}' is not in list" , needle. str ( vm) ?) ) )
306
307
}
You can’t perform that action at this time.
0 commit comments