0
0
mirror of https://github.com/python/cpython.git synced 2024-11-24 17:47:13 +01:00

GH-121012: Set index to -1 when list iterators become exhausted in tier 2 (GH-121483)

This commit is contained in:
Mark Shannon 2024-07-08 14:20:13 +01:00 committed by GitHub
parent d69529d31c
commit 8ad6067bd4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 20 additions and 3 deletions

View File

@ -299,6 +299,15 @@ class ListTest(list_tests.CommonTest):
lst = [X(), X()] lst = [X(), X()]
X() in lst X() in lst
def test_tier2_invalidates_iterator(self):
# GH-121012
for _ in range(100):
a = [1, 2, 3]
it = iter(a)
for _ in it:
pass
a.append(4)
self.assertEqual(list(it), [])
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -0,0 +1,2 @@
Tier 2 execution now ensures that list iterators remain exhausted, once they
become exhausted.

View File

@ -2967,7 +2967,10 @@ dummy_func(
assert(Py_TYPE(iter_o) == &PyListIter_Type); assert(Py_TYPE(iter_o) == &PyListIter_Type);
PyListObject *seq = it->it_seq; PyListObject *seq = it->it_seq;
EXIT_IF(seq == NULL); EXIT_IF(seq == NULL);
EXIT_IF((size_t)it->it_index >= (size_t)PyList_GET_SIZE(seq)); if ((size_t)it->it_index >= (size_t)PyList_GET_SIZE(seq)) {
it->it_index = -1;
EXIT_IF(1);
}
} }
op(_ITER_NEXT_LIST, (iter -- iter, next)) { op(_ITER_NEXT_LIST, (iter -- iter, next)) {

View File

@ -3055,8 +3055,11 @@
JUMP_TO_JUMP_TARGET(); JUMP_TO_JUMP_TARGET();
} }
if ((size_t)it->it_index >= (size_t)PyList_GET_SIZE(seq)) { if ((size_t)it->it_index >= (size_t)PyList_GET_SIZE(seq)) {
UOP_STAT_INC(uopcode, miss); it->it_index = -1;
JUMP_TO_JUMP_TARGET(); if (1) {
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
}
} }
break; break;
} }