From ca70b69393921bc9abfc8eba8f23a305766bd276 Mon Sep 17 00:00:00 2001 From: Neko Asakura Date: Sat, 11 Apr 2026 14:59:09 -0400 Subject: [PATCH 1/3] gh-148398: add type watcher in `_CHECK_ATTR_CLASS` --- Python/optimizer_bytecodes.c | 2 ++ Python/optimizer_cases.c.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index c7fe34bf785c0b..77e33977c25b9a 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -224,6 +224,8 @@ dummy_func(void) { } else { sym_set_const(owner, type); + PyType_Watch(TYPE_WATCHER_ID, type); + _Py_BloomFilter_Add(dependencies, type); } } } diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index 98287e7f841761..b4dc833526f10f 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -2569,6 +2569,8 @@ } else { sym_set_const(owner, type); + PyType_Watch(TYPE_WATCHER_ID, type); + _Py_BloomFilter_Add(dependencies, type); } } break; From 6ee2de783432cade0b70e097fdc4352b00009a89 Mon Sep 17 00:00:00 2001 From: Neko Asakura Date: Sat, 11 Apr 2026 15:18:05 -0400 Subject: [PATCH 2/3] gh-148398: add NEWS --- .../2026-04-11-15-12-53.gh-issue-148398.g62jCA.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-04-11-15-12-53.gh-issue-148398.g62jCA.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-04-11-15-12-53.gh-issue-148398.g62jCA.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-04-11-15-12-53.gh-issue-148398.g62jCA.rst new file mode 100644 index 00000000000000..0a7ba0b27d9708 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-04-11-15-12-53.gh-issue-148398.g62jCA.rst @@ -0,0 +1 @@ +Fix a bug in the JIT optimizer where class attribute loads were not invalidated after type mutation. From c1eeb135ddf15d3646fb6df16636f7f88581dec6 Mon Sep 17 00:00:00 2001 From: Neko Asakura Date: Sun, 12 Apr 2026 05:50:19 -0400 Subject: [PATCH 3/3] gh-148398: add type watcher in `_CHECK_ATTR_CLASS` --- Python/optimizer_bytecodes.c | 6 ++++-- Python/optimizer_cases.c.h | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index 85ca4731313413..39dc4877af8884 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -226,8 +226,10 @@ dummy_func(void) { } else { sym_set_const(owner, type); - PyType_Watch(TYPE_WATCHER_ID, type); - _Py_BloomFilter_Add(dependencies, type); + if ((((PyTypeObject *)type)->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) == 0) { + PyType_Watch(TYPE_WATCHER_ID, type); + _Py_BloomFilter_Add(dependencies, type); + } } } } diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index a02bd86f862946..746653906874b5 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -2571,8 +2571,10 @@ } else { sym_set_const(owner, type); - PyType_Watch(TYPE_WATCHER_ID, type); - _Py_BloomFilter_Add(dependencies, type); + if ((((PyTypeObject *)type)->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) == 0) { + PyType_Watch(TYPE_WATCHER_ID, type); + _Py_BloomFilter_Add(dependencies, type); + } } } break;