return 0;
}
+static void
+watch_type(PyTypeObject *type, _PyBloomFilter *filter)
+{
+ if (_Py_IsImmortal(type) && (type->tp_flags & Py_TPFLAGS_IMMUTABLETYPE)) {
+ return;
+ }
+ PyType_Watch(TYPE_WATCHER_ID, (PyObject *)type);
+ _Py_BloomFilter_Add(filter, type);
+}
+
static PyObject *
convert_global_to_const(_PyUOpInstruction *inst, PyObject *obj)
{
// for user-defined objects which don't override tp_hash
Py_hash_t hash = PyObject_Hash(sub);
ADD_OP(opcode, 0, hash);
- PyType_Watch(TYPE_WATCHER_ID, (PyObject *)Py_TYPE(sub));
- _Py_BloomFilter_Add(dependencies, Py_TYPE(sub));
+ watch_type(Py_TYPE(sub), dependencies);
}
}
ADD_OP(suffix, 2, 0);
}
if ((type->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) == 0) {
- PyType_Watch(TYPE_WATCHER_ID, (PyObject *)type);
- _Py_BloomFilter_Add(dependencies, type);
+ watch_type(type, dependencies);
}
return sym_new_const(ctx, lookup);
}
}
// 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);
+ watch_type(su_type, dependencies);
+ watch_type(obj_type, dependencies);
}
return sym_new_const_steal(ctx, lookup);
}
// Promote the probable type version to a known one.
sym_set_type(owner, probable_type);
sym_set_type_version(owner, type_version);
- if ((probable_type->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) == 0) {
- PyType_Watch(TYPE_WATCHER_ID, (PyObject *)probable_type);
- _Py_BloomFilter_Add(dependencies, probable_type);
- }
+ watch_type(probable_type, dependencies);
}
else {
ctx->contradiction = true;
}
else {
sym_set_const(owner, type);
- if ((((PyTypeObject *)type)->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) == 0) {
- PyType_Watch(TYPE_WATCHER_ID, type);
- _Py_BloomFilter_Add(dependencies, type);
- }
+ watch_type((PyTypeObject *)type, dependencies);
}
}
}
probable_type->tp_version_tag == type_version) {
sym_set_type(owner, probable_type);
sym_set_type_version(owner, type_version);
- PyType_Watch(TYPE_WATCHER_ID, (PyObject *)probable_type);
- _Py_BloomFilter_Add(dependencies, probable_type);
+ watch_type(probable_type, dependencies);
}
else {
ctx->contradiction = true;
assert(init != NULL);
assert(PyFunction_Check(init));
callable = sym_new_const(ctx, init);
- PyType_Watch(TYPE_WATCHER_ID, callable_o);
- _Py_BloomFilter_Add(dependencies, callable_o);;
+ watch_type((PyTypeObject *)callable_o, dependencies);
}
else {
callable = sym_new_not_null(ctx);
0, (uintptr_t)descr);
ADD_OP(_SWAP, 3, 0);
optimize_pop_top(ctx, this_instr, method_and_self[0]);
- if ((type->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) == 0) {
- PyType_Watch(TYPE_WATCHER_ID, (PyObject *)type);
- _Py_BloomFilter_Add(dependencies, type);
- }
+ watch_type(type, dependencies);
method_and_self[0] = sym_new_const(ctx, descr);
optimized = true;
}
probable_type->tp_version_tag == type_version) {
sym_set_type(owner, probable_type);
sym_set_type_version(owner, type_version);
- PyType_Watch(TYPE_WATCHER_ID, (PyObject *)probable_type);
- _Py_BloomFilter_Add(dependencies, probable_type);
+ watch_type(probable_type, dependencies);
}
else {
ctx->contradiction = true;
probable_type->tp_version_tag == type_version) {
sym_set_type(owner, probable_type);
sym_set_type_version(owner, type_version);
- if ((probable_type->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) == 0) {
- PyType_Watch(TYPE_WATCHER_ID, (PyObject *)probable_type);
- _Py_BloomFilter_Add(dependencies, probable_type);
- }
+ watch_type(probable_type, dependencies);
}
else {
ctx->contradiction = true;
}
else {
sym_set_const(owner, type);
- if ((((PyTypeObject *)type)->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) == 0) {
- PyType_Watch(TYPE_WATCHER_ID, type);
- _Py_BloomFilter_Add(dependencies, type);
- }
+ watch_type((PyTypeObject *)type, dependencies);
}
}
break;
0, (uintptr_t)descr);
ADD_OP(_SWAP, 3, 0);
optimize_pop_top(ctx, this_instr, method_and_self[0]);
- if ((type->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) == 0) {
- PyType_Watch(TYPE_WATCHER_ID, (PyObject *)type);
- _Py_BloomFilter_Add(dependencies, type);
- }
+ watch_type(type, dependencies);
method_and_self[0] = sym_new_const(ctx, descr);
optimized = true;
}
assert(PyFunction_Check(init));
callable = sym_new_const(ctx, init);
stack_pointer[-2 - oparg] = callable;
- PyType_Watch(TYPE_WATCHER_ID, callable_o);
- _Py_BloomFilter_Add(dependencies, callable_o);;
+ watch_type((PyTypeObject *)callable_o, dependencies);
}
else {
callable = sym_new_not_null(ctx);