From: Victor Stinner Date: Thu, 5 Mar 2026 13:14:04 +0000 (+0100) Subject: gh-141510: Fix frozendict.items() ^ frozendict.items() (#145535) X-Git-Tag: v3.15.0a7~53 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2cd0ddfe04afbe38bfbe73de1050ea5d1185f4b6;p=thirdparty%2FPython%2Fcpython.git gh-141510: Fix frozendict.items() ^ frozendict.items() (#145535) Add non-regression tests. --- diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py index 162b0b38f855..45448d1264a5 100644 --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -1848,11 +1848,19 @@ class FrozenDictTests(unittest.TestCase): frozendict({'x': 1, 'y': 2})) self.assertEqual(frozendict(x=1, y=2) | frozendict(y=5), frozendict({'x': 1, 'y': 5})) + self.assertEqual(FrozenDict(x=1, y=2) | FrozenDict(y=5), + frozendict({'x': 1, 'y': 5})) + fd = frozendict(x=1, y=2) self.assertIs(fd | frozendict(), fd) self.assertIs(fd | {}, fd) self.assertIs(frozendict() | fd, fd) + fd = FrozenDict(x=1, y=2) + self.assertEqual(fd | frozendict(), fd) + self.assertEqual(fd | {}, fd) + self.assertEqual(frozendict() | fd, fd) + def test_update(self): # test "a |= b" operator d = frozendict(x=1) @@ -1863,6 +1871,11 @@ class FrozenDictTests(unittest.TestCase): self.assertEqual(d, frozendict({'x': 1, 'y': 2})) self.assertEqual(copy, frozendict({'x': 1})) + def test_items_xor(self): + # test "a ^ b" operator on items views + res = frozendict(a=1, b=2).items() ^ frozendict(b=2, c=3).items() + self.assertEqual(res, {('a', 1), ('c', 3)}) + def test_repr(self): d = frozendict() self.assertEqual(repr(d), "frozendict()") diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 14019e4f1d92..d86ab2634a9b 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -6523,7 +6523,7 @@ dictitems_xor_lock_held(PyObject *d1, PyObject *d2) ASSERT_DICT_LOCKED(d1); ASSERT_DICT_LOCKED(d2); - PyObject *temp_dict = copy_lock_held(d1, PyFrozenDict_Check(d1)); + PyObject *temp_dict = copy_lock_held(d1, 0); if (temp_dict == NULL) { return NULL; }