lst = [X(), X()]
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__":
unittest.main()
--- /dev/null
+Tier 2 execution now ensures that list iterators remain exhausted, once they
+become exhausted.
assert(Py_TYPE(iter) == &PyListIter_Type);
PyListObject *seq = it->it_seq;
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)) {
JUMP_TO_JUMP_TARGET();
}
if ((size_t)it->it_index >= (size_t)PyList_GET_SIZE(seq)) {
- UOP_STAT_INC(uopcode, miss);
- JUMP_TO_JUMP_TARGET();
+ it->it_index = -1;
+ if (1) {
+ UOP_STAT_INC(uopcode, miss);
+ JUMP_TO_JUMP_TARGET();
+ }
}
break;
}