self.assertEqual(fd | {}, fd)
self.assertEqual(frozendict() | fd, fd)
+ # gh-149676: Test hash(frozendict | frozendict)
+ a = frozendict({"a": 1})
+ b = frozendict({"b": 2})
+ self.assertEqual(hash(a | b), hash(frozendict({"a": 1, "b": 2})))
+
def test_update(self):
# test "a |= b" operator
d = frozendict(x=1)
static inline PyObject *
new_dict_impl(PyDictObject *mp, PyDictKeysObject *keys,
PyDictValues *values, Py_ssize_t used,
- int free_values_on_failure)
+ int free_values_on_failure, int frozendict)
{
assert(keys != NULL);
if (mp == NULL) {
mp->ma_values = values;
mp->ma_used = used;
mp->_ma_watcher_tag = 0;
+ if (frozendict) {
+ ((PyFrozenDictObject *)mp)->ma_hash = -1;
+ }
ASSERT_CONSISTENT(mp);
_PyObject_GC_TRACK(mp);
return (PyObject *)mp;
}
assert(mp == NULL || Py_IS_TYPE(mp, &PyDict_Type));
- return new_dict_impl(mp, keys, values, used, free_values_on_failure);
+ return new_dict_impl(mp, keys, values, used, free_values_on_failure, 0);
}
/* Consumes a reference to the keys object */
Py_ssize_t used, int free_values_on_failure)
{
PyDictObject *mp = PyObject_GC_New(PyDictObject, &PyFrozenDict_Type);
- return new_dict_impl(mp, keys, values, used, free_values_on_failure);
+ return new_dict_impl(mp, keys, values, used, free_values_on_failure, 1);
}
static PyObject *