]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-149481: skip `FOR_ITER` inline specialization for Python `__next__` (#149491)
authorNeko Asakura <neko.asakura@outlook.com>
Thu, 7 May 2026 23:02:04 +0000 (07:02 +0800)
committerGitHub <noreply@github.com>
Thu, 7 May 2026 23:02:04 +0000 (23:02 +0000)
Co-authored-by: Savannah Ostrowski <savannah@python.org>
Co-authored-by: Stan Ulbrych <stan@python.org>
Include/internal/pycore_typeobject.h
Lib/test/test_capi/test_opt.py
Objects/typeobject.c
Python/optimizer_bytecodes.c
Python/optimizer_cases.c.h

index 8d48cf6605ca7e35eb93444bea1bdd0eca72dc03..785b77d3e3be81e88c18f115c164a0dcfc69eed2 100644 (file)
@@ -122,6 +122,8 @@ extern PyObject* _Py_BaseObject_RichCompare(PyObject* self, PyObject* other, int
 extern PyObject* _Py_slot_tp_getattro(PyObject *self, PyObject *name);
 extern PyObject* _Py_slot_tp_getattr_hook(PyObject *self, PyObject *name);
 
+extern int _PyType_HasSlotTpIternext(PyTypeObject *type);
+
 extern PyTypeObject _PyBufferWrapper_Type;
 
 PyAPI_FUNC(PyObject*) _PySuper_Lookup(PyTypeObject *su_type, PyObject *su_obj,
index d80fec9a8a0d2b03c3500d33a5eb16966f3b2db0..aaa5050208ced9a0a6912baa2779651a6a016833 100644 (file)
@@ -598,7 +598,8 @@ class TestUops(unittest.TestCase):
         ex = get_first_executor(testfunc)
         self.assertIsNotNone(ex)
         uops = get_opnames(ex)
-        self.assertIn("_ITER_NEXT_INLINE", uops)
+        self.assertIn("_FOR_ITER_TIER_TWO", uops)
+        self.assertNotIn("_ITER_NEXT_INLINE", uops)
 
 
 @requires_specialization
index 4f43747ba83fd9d36e3c39cd0e4017a18714105e..9a18ca72516da771f4207457df193dd77a0d672e 100644 (file)
@@ -11079,6 +11079,12 @@ slot_tp_iternext(PyObject *self)
     return vectorcall_method(&_Py_ID(__next__), stack, 1);
 }
 
+int
+_PyType_HasSlotTpIternext(PyTypeObject *type)
+{
+    return type->tp_iternext == slot_tp_iternext;
+}
+
 static PyObject *
 slot_tp_descr_get(PyObject *self, PyObject *obj, PyObject *type)
 {
index e10a096baa33188ef731d76758b5cf66a920af65..39cc36ae79fead977269dd71de98f38322d91936 100644 (file)
@@ -2,6 +2,7 @@
 #include "pycore_long.h"
 #include "pycore_opcode_utils.h"
 #include "pycore_optimizer.h"
+#include "pycore_typeobject.h"
 #include "pycore_uops.h"
 #include "pycore_uop_ids.h"
 #include "internal/pycore_moduleobject.h"
@@ -1459,7 +1460,8 @@ dummy_func(void) {
             type = sym_get_probable_type(iter);
             definite = false;
         }
-        if (type != NULL && type != &PyGen_Type && type->tp_iternext != NULL) {
+        if (type != NULL && type != &PyGen_Type && type->tp_iternext != NULL
+            && !_PyType_HasSlotTpIternext(type)) {
             PyType_Watch(TYPE_WATCHER_ID, (PyObject *)type);
             _Py_BloomFilter_Add(dependencies, type);
             if (!definite) {
index 01ecb3790aa2cdb7c40fa7ddb1d2c9178ec61f66..db3dcbb97b2645c62756bafcd74102f727e9e402 100644 (file)
                 type = sym_get_probable_type(iter);
                 definite = false;
             }
-            if (type != NULL && type != &PyGen_Type && type->tp_iternext != NULL) {
+            if (type != NULL && type != &PyGen_Type && type->tp_iternext != NULL
+                && !_PyType_HasSlotTpIternext(type)) {
                 PyType_Watch(TYPE_WATCHER_ID, (PyObject *)type);
                 _Py_BloomFilter_Add(dependencies, type);
                 if (!definite) {