]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-131798: do not watch immutable types in JIT (#148383)
authorKumar Aditya <kumaraditya@python.org>
Sat, 11 Apr 2026 15:43:53 +0000 (21:13 +0530)
committerGitHub <noreply@github.com>
Sat, 11 Apr 2026 15:43:53 +0000 (15:43 +0000)
Python/optimizer_analysis.c
Python/optimizer_bytecodes.c
Python/optimizer_cases.c.h

index 069f4aeffa64fc859bec4a36f0a559085feffde1..ca9bcc8a40c35e4b8b4bf8b20564cc4ed5e5dc8c 100644 (file)
@@ -397,8 +397,10 @@ lookup_attr(JitOptContext *ctx, _PyBloomFilter *dependencies, _PyUOpInstruction
             if (suffix != _NOP) {
                 ADD_OP(suffix, 2, 0);
             }
-            PyType_Watch(TYPE_WATCHER_ID, (PyObject *)type);
-            _Py_BloomFilter_Add(dependencies, type);
+            if ((type->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) == 0) {
+                PyType_Watch(TYPE_WATCHER_ID, (PyObject *)type);
+                _Py_BloomFilter_Add(dependencies, type);
+            }
             return sym_new_const(ctx, lookup);
         }
     }
@@ -466,10 +468,13 @@ lookup_super_attr(JitOptContext *ctx, _PyBloomFilter *dependencies,
     if (suffix != _NOP) {
         ADD_OP(suffix, 2, 0);
     }
-    PyType_Watch(TYPE_WATCHER_ID, (PyObject *)su_type);
-    _Py_BloomFilter_Add(dependencies, su_type);
-    PyType_Watch(TYPE_WATCHER_ID, (PyObject *)obj_type);
-    _Py_BloomFilter_Add(dependencies, obj_type);
+    // if obj_type is immutable, then all its superclasses are immutable
+    if ((obj_type->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) == 0) {
+        PyType_Watch(TYPE_WATCHER_ID, (PyObject *)su_type);
+        _Py_BloomFilter_Add(dependencies, su_type);
+        PyType_Watch(TYPE_WATCHER_ID, (PyObject *)obj_type);
+        _Py_BloomFilter_Add(dependencies, obj_type);
+    }
     return sym_new_const_steal(ctx, lookup);
 }
 
index c7fe34bf785c0b8b8564bbc5fb33ede6f12e24cb..c12a4f4131bc7efaf7408ced3cff60054792deb5 100644 (file)
@@ -142,8 +142,10 @@ dummy_func(void) {
             PyTypeObject *probable_type = sym_get_probable_type(owner);
             if (probable_type->tp_version_tag == type_version && sym_set_type_version(owner, type_version)) {
                 // Promote the probable type version to a known one.
-                PyType_Watch(TYPE_WATCHER_ID, (PyObject *)probable_type);
-                _Py_BloomFilter_Add(dependencies, probable_type);
+                if ((probable_type->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) == 0) {
+                    PyType_Watch(TYPE_WATCHER_ID, (PyObject *)probable_type);
+                    _Py_BloomFilter_Add(dependencies, probable_type);
+                }
             }
         }
     }
index 98287e7f84176133d3ecf23b9ebaff1169440b1c..2db2c87cb3610bfb3c79fc274cca41a12f3513eb 100644 (file)
             } else {
                 PyTypeObject *probable_type = sym_get_probable_type(owner);
                 if (probable_type->tp_version_tag == type_version && sym_set_type_version(owner, type_version)) {
-                    PyType_Watch(TYPE_WATCHER_ID, (PyObject *)probable_type);
-                    _Py_BloomFilter_Add(dependencies, probable_type);
+                    if ((probable_type->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) == 0) {
+                        PyType_Watch(TYPE_WATCHER_ID, (PyObject *)probable_type);
+                        _Py_BloomFilter_Add(dependencies, probable_type);
+                    }
                 }
             }
             break;