aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/test/test_opcache.py
diff options
context:
space:
mode:
authorT. Wouters <thomas@python.org>2025-03-12 16:21:46 +0100
committerGitHub <noreply@github.com>2025-03-12 16:21:46 +0100
commitde2f7da77d9e8dc6758430249e7179d37b3fee44 (patch)
tree13a20c58828b74a4851373476635382fc4aba797 /Lib/test/test_opcache.py
parentdb27aee2fe253855fc57b118658f4f4718819382 (diff)
downloadcpython-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.py39
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()