]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-139393: fix `_CALL_LEN` JIT tests for tuples (#139394)
authorBénédikt Tran <10796600+picnixz@users.noreply.github.com>
Sun, 28 Sep 2025 17:30:44 +0000 (19:30 +0200)
committerGitHub <noreply@github.com>
Sun, 28 Sep 2025 17:30:44 +0000 (19:30 +0200)
Fix a regression introduced in 7ce25edb8f41e527ed479bf61ef36dc9841b4ac5
where `_PY_NSMALLPOSINTS` was changed from 257 to 1025.

Lib/test/test_capi/test_opt.py
Modules/_testinternalcapi.c

index c3fed50cee97366fc71ec1a1a41170f92fc86d69..f121f27174875e97c6d226d419791951be78f283 100644 (file)
@@ -15,7 +15,7 @@ from test.support import (script_helper, requires_specialization,
 
 _testinternalcapi = import_helper.import_module("_testinternalcapi")
 
-from _testinternalcapi import TIER2_THRESHOLD
+from _testinternalcapi import _PY_NSMALLPOSINTS, TIER2_THRESHOLD
 
 #For test of issue 136154
 GLOBAL_136154 = 42
@@ -2093,6 +2093,10 @@ class TestUopsOptimization(unittest.TestCase):
         self.assertNotIn("_GUARD_TOS_INT", uops)
 
     def test_call_len_known_length_small_int(self):
+        # Make sure that len(t) is optimized for a tuple of length 5.
+        # See https://github.com/python/cpython/issues/139393.
+        self.assertGreater(_PY_NSMALLPOSINTS, 5)
+
         def testfunc(n):
             x = 0
             for _ in range(n):
@@ -2113,13 +2117,17 @@ class TestUopsOptimization(unittest.TestCase):
         self.assertNotIn("_POP_TOP_LOAD_CONST_INLINE_BORROW", uops)
 
     def test_call_len_known_length(self):
+        # Make sure that len(t) is not optimized for a tuple of length 2048.
+        # See https://github.com/python/cpython/issues/139393.
+        self.assertLess(_PY_NSMALLPOSINTS, 2048)
+
         def testfunc(n):
             class C:
-                t = tuple(range(300))
+                t = tuple(range(2048))
 
             x = 0
             for _ in range(n):
-                if len(C.t) == 300:  # comparison + guard removed
+                if len(C.t) == 2048:  # comparison + guard removed
                     x += 1
             return x
 
index d680711e5d828a04ae82357fbcf774d4f58b92d6..a4348e7e1497cd0f73540fd85b8ef1e8c0dd0b97 100644 (file)
@@ -34,6 +34,7 @@
 #include "pycore_pyerrors.h"      // _PyErr_ChainExceptions1()
 #include "pycore_pylifecycle.h"   // _PyInterpreterConfig_InitFromDict()
 #include "pycore_pystate.h"       // _PyThreadState_GET()
+#include "pycore_runtime_structs.h" // _PY_NSMALLPOSINTS
 #include "pycore_unicodeobject.h" // _PyUnicode_TransformDecimalAndSpaceToASCII()
 
 #include "clinic/_testinternalcapi.c.h"
@@ -2576,6 +2577,10 @@ module_exec(PyObject *module)
         return 1;
     }
 
+    if (PyModule_AddIntMacro(module, _PY_NSMALLPOSINTS) < 0) {
+        return 1;
+    }
+
     return 0;
 }