summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_dictviews.py4
-rw-r--r--Misc/NEWS3
-rw-r--r--Objects/dictobject.c9
3 files changed, 11 insertions, 5 deletions
diff --git a/Lib/test/test_dictviews.py b/Lib/test/test_dictviews.py
index 245f8c8..4c290ff 100644
--- a/Lib/test/test_dictviews.py
+++ b/Lib/test/test_dictviews.py
@@ -97,6 +97,7 @@ class DictSetTest(unittest.TestCase):
self.assertEqual(d1.keys() & set(d1.keys()), {'a', 'b'})
self.assertEqual(d1.keys() & set(d2.keys()), {'b'})
self.assertEqual(d1.keys() & set(d3.keys()), set())
+ self.assertEqual(d1.keys() & tuple(d1.keys()), {'a', 'b'})
self.assertEqual(d1.keys() | d1.keys(), {'a', 'b'})
self.assertEqual(d1.keys() | d2.keys(), {'a', 'b', 'c'})
@@ -105,6 +106,7 @@ class DictSetTest(unittest.TestCase):
self.assertEqual(d1.keys() | set(d2.keys()), {'a', 'b', 'c'})
self.assertEqual(d1.keys() | set(d3.keys()),
{'a', 'b', 'd', 'e'})
+ self.assertEqual(d1.keys() | (1, 2), {'a', 'b', 1, 2})
self.assertEqual(d1.keys() ^ d1.keys(), set())
self.assertEqual(d1.keys() ^ d2.keys(), {'a', 'c'})
@@ -113,6 +115,7 @@ class DictSetTest(unittest.TestCase):
self.assertEqual(d1.keys() ^ set(d2.keys()), {'a', 'c'})
self.assertEqual(d1.keys() ^ set(d3.keys()),
{'a', 'b', 'd', 'e'})
+ self.assertEqual(d1.keys() ^ tuple(d2.keys()), {'a', 'c'})
self.assertEqual(d1.keys() - d1.keys(), set())
self.assertEqual(d1.keys() - d2.keys(), {'a'})
@@ -120,6 +123,7 @@ class DictSetTest(unittest.TestCase):
self.assertEqual(d1.keys() - set(d1.keys()), set())
self.assertEqual(d1.keys() - set(d2.keys()), {'a'})
self.assertEqual(d1.keys() - set(d3.keys()), {'a', 'b'})
+ self.assertEqual(d1.keys() - (0, 1), {'a', 'b'})
self.assertFalse(d1.keys().isdisjoint(d1.keys()))
self.assertFalse(d1.keys().isdisjoint(d2.keys()))
diff --git a/Misc/NEWS b/Misc/NEWS
index eea0b33..3eee944 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -181,6 +181,9 @@ Core and Builtins
converted to normal strings at run time. Given x=3, then
f'value={x}' == 'value=3'. Patch by Eric V. Smith.
+- Issue #26478: Fix semantic bugs when using binary operators with dictionary
+ views and tuples.
+
- Issue #26171: Fix possible integer overflow and heap corruption in
zipimporter.get_data().
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 31a6322..0fa8241 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -3451,7 +3451,7 @@ dictviews_sub(PyObject* self, PyObject *other)
if (result == NULL)
return NULL;
- tmp = _PyObject_CallMethodId(result, &PyId_difference_update, "O", other);
+ tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_difference_update, other, NULL);
if (tmp == NULL) {
Py_DECREF(result);
return NULL;
@@ -3471,7 +3471,7 @@ _PyDictView_Intersect(PyObject* self, PyObject *other)
if (result == NULL)
return NULL;
- tmp = _PyObject_CallMethodId(result, &PyId_intersection_update, "O", other);
+ tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_intersection_update, other, NULL);
if (tmp == NULL) {
Py_DECREF(result);
return NULL;
@@ -3491,7 +3491,7 @@ dictviews_or(PyObject* self, PyObject *other)
if (result == NULL)
return NULL;
- tmp = _PyObject_CallMethodId(result, &PyId_update, "O", other);
+ tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_update, other, NULL);
if (tmp == NULL) {
Py_DECREF(result);
return NULL;
@@ -3511,8 +3511,7 @@ dictviews_xor(PyObject* self, PyObject *other)
if (result == NULL)
return NULL;
- tmp = _PyObject_CallMethodId(result, &PyId_symmetric_difference_update, "O",
- other);
+ tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_symmetric_difference_update, other, NULL);
if (tmp == NULL) {
Py_DECREF(result);
return NULL;