diff options
author | T. Wouters <thomas@python.org> | 2025-03-12 16:21:46 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-12 16:21:46 +0100 |
commit | de2f7da77d9e8dc6758430249e7179d37b3fee44 (patch) | |
tree | 13a20c58828b74a4851373476635382fc4aba797 /Lib/test/test_opcache.py | |
parent | db27aee2fe253855fc57b118658f4f4718819382 (diff) | |
download | cpython-de2f7da77d9e8dc6758430249e7179d37b3fee44.tar.gz cpython-de2f7da77d9e8dc6758430249e7179d37b3fee44.zip |
gh-115999: Add free-threaded specialization for FOR_ITER (#128798)
Add free-threaded versions of existing specialization for FOR_ITER (list, tuples, fast range iterators and generators), without significantly affecting their thread-safety. (Iterating over shared lists/tuples/ranges should be fine like before. Reusing iterators between threads is not fine, like before. Sharing generators between threads is a recipe for significant crashes, like before.)
Diffstat (limited to 'Lib/test/test_opcache.py')
-rw-r--r-- | Lib/test/test_opcache.py | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/Lib/test/test_opcache.py b/Lib/test/test_opcache.py index e4224b843b2..946a4827fe7 100644 --- a/Lib/test/test_opcache.py +++ b/Lib/test/test_opcache.py @@ -1802,5 +1802,44 @@ class TestSpecializer(TestBase): self.assert_specialized(load_const, "LOAD_CONST_MORTAL") self.assert_no_opcode(load_const, "LOAD_CONST") + @cpython_only + @requires_specialization_ft + def test_for_iter(self): + L = list(range(10)) + def for_iter_list(): + for i in L: + self.assertIn(i, L) + + for_iter_list() + self.assert_specialized(for_iter_list, "FOR_ITER_LIST") + self.assert_no_opcode(for_iter_list, "FOR_ITER") + + t = tuple(range(10)) + def for_iter_tuple(): + for i in t: + self.assertIn(i, t) + + for_iter_tuple() + self.assert_specialized(for_iter_tuple, "FOR_ITER_TUPLE") + self.assert_no_opcode(for_iter_tuple, "FOR_ITER") + + r = range(10) + def for_iter_range(): + for i in r: + self.assertIn(i, r) + + for_iter_range() + self.assert_specialized(for_iter_range, "FOR_ITER_RANGE") + self.assert_no_opcode(for_iter_range, "FOR_ITER") + + def for_iter_generator(): + for i in (i for i in range(10)): + i + 1 + + for_iter_generator() + self.assert_specialized(for_iter_generator, "FOR_ITER_GEN") + self.assert_no_opcode(for_iter_generator, "FOR_ITER") + + if __name__ == "__main__": unittest.main() |