Deoptimize if the dict is a dict subclass.
Co-authored-by: Peter Bierma <zintensitydev@gmail.com>
{'a':1, 'b':2}
)
+ def test_store_attr_with_hint(self):
+ # gh-133441: Regression test for STORE_ATTR_WITH_HINT bytecode
+ class Node:
+ def __init__(self):
+ self.parents = {}
+
+ def __setstate__(self, data_dict):
+ self.__dict__ = data_dict
+ self.parents = {}
+
+ class Dict(dict):
+ pass
+
+ obj = Node()
+ obj.__setstate__({'parents': {}})
+ obj.__setstate__({'parents': {}})
+ obj.__setstate__(Dict({'parents': {}}))
+
if __name__ == "__main__":
unittest.main()
--- /dev/null
+Fix crash upon setting an attribute with a :class:`dict` subclass.
+Patch by Victor Stinner.
assert(tp->tp_flags & Py_TPFLAGS_MANAGED_DICT);
PyDictObject *dict = _PyObject_GetManagedDict(owner);
DEOPT_IF(dict == NULL);
- assert(PyDict_CheckExact((PyObject *)dict));
+ DEOPT_IF(!PyDict_CheckExact((PyObject *)dict));
+
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
DEOPT_IF(hint >= (size_t)dict->ma_keys->dk_nentries);
PyObject *old_value;
assert(tp->tp_flags & Py_TPFLAGS_MANAGED_DICT);
PyDictObject *dict = _PyObject_GetManagedDict(owner);
DEOPT_IF(dict == NULL, STORE_ATTR);
- assert(PyDict_CheckExact((PyObject *)dict));
+ DEOPT_IF(!PyDict_CheckExact((PyObject *)dict), STORE_ATTR);
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
DEOPT_IF(hint >= (size_t)dict->ma_keys->dk_nentries, STORE_ATTR);
PyObject *old_value;