Skip to content

Commit ba1e1c1

Browse files
gh-131798: do not watch immutable types in JIT (#148383)
1 parent 9c9df8a commit ba1e1c1

File tree

3 files changed

+19
-10
lines changed

3 files changed

+19
-10
lines changed

Python/optimizer_analysis.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -397,8 +397,10 @@ lookup_attr(JitOptContext *ctx, _PyBloomFilter *dependencies, _PyUOpInstruction
397397
if (suffix != _NOP) {
398398
ADD_OP(suffix, 2, 0);
399399
}
400-
PyType_Watch(TYPE_WATCHER_ID, (PyObject *)type);
401-
_Py_BloomFilter_Add(dependencies, type);
400+
if ((type->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) == 0) {
401+
PyType_Watch(TYPE_WATCHER_ID, (PyObject *)type);
402+
_Py_BloomFilter_Add(dependencies, type);
403+
}
402404
return sym_new_const(ctx, lookup);
403405
}
404406
}
@@ -466,10 +468,13 @@ lookup_super_attr(JitOptContext *ctx, _PyBloomFilter *dependencies,
466468
if (suffix != _NOP) {
467469
ADD_OP(suffix, 2, 0);
468470
}
469-
PyType_Watch(TYPE_WATCHER_ID, (PyObject *)su_type);
470-
_Py_BloomFilter_Add(dependencies, su_type);
471-
PyType_Watch(TYPE_WATCHER_ID, (PyObject *)obj_type);
472-
_Py_BloomFilter_Add(dependencies, obj_type);
471+
// if obj_type is immutable, then all its superclasses are immutable
472+
if ((obj_type->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) == 0) {
473+
PyType_Watch(TYPE_WATCHER_ID, (PyObject *)su_type);
474+
_Py_BloomFilter_Add(dependencies, su_type);
475+
PyType_Watch(TYPE_WATCHER_ID, (PyObject *)obj_type);
476+
_Py_BloomFilter_Add(dependencies, obj_type);
477+
}
473478
return sym_new_const_steal(ctx, lookup);
474479
}
475480

Python/optimizer_bytecodes.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,10 @@ dummy_func(void) {
142142
PyTypeObject *probable_type = sym_get_probable_type(owner);
143143
if (probable_type->tp_version_tag == type_version && sym_set_type_version(owner, type_version)) {
144144
// Promote the probable type version to a known one.
145-
PyType_Watch(TYPE_WATCHER_ID, (PyObject *)probable_type);
146-
_Py_BloomFilter_Add(dependencies, probable_type);
145+
if ((probable_type->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) == 0) {
146+
PyType_Watch(TYPE_WATCHER_ID, (PyObject *)probable_type);
147+
_Py_BloomFilter_Add(dependencies, probable_type);
148+
}
147149
}
148150
}
149151
}

Python/optimizer_cases.c.h

Lines changed: 4 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)