Skip to content

Commit cad2adc

Browse files
authored
Merge pull request RustPython#4326 from yt2b/fix_list_remove
Fix `PyList.remove`
2 parents 9d711c8 + 5fa0abd commit cad2adc

File tree

3 files changed

+16
-3
lines changed

3 files changed

+16
-3
lines changed

Lib/test/test_list.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,6 @@ def test_preallocation(self):
198198
self.assertEqual(iter_size, sys.getsizeof(list([0] * 10)))
199199
self.assertEqual(iter_size, sys.getsizeof(list(range(10))))
200200

201-
@unittest.skip("TODO: RUSTPYTHON; hang")
202201
def test_count_index_remove_crashes(self):
203202
# bpo-38610: The count(), index(), and remove() methods were not
204203
# holding strong references to list elements while calling

extra_tests/snippets/builtin_list.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -655,4 +655,17 @@ def __eq__(self, other):
655655
l = [1, 2, 3, m, 4]
656656
m.list = l
657657
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 == []

vm/src/builtins/list.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,8 @@ impl PyList {
300300

301301
if let Some(index) = index.into() {
302302
// 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)))
304305
} else {
305306
Err(vm.new_value_error(format!("'{}' is not in list", needle.str(vm)?)))
306307
}

0 commit comments

Comments
 (0)