Skip to content

Commit f11b25b

Browse files
committed
properly use the ObjArgs variant of CallMethod in dictview binary operations (closes #26478)
1 parent 25c0ef5 commit f11b25b

File tree

3 files changed

+11
-5
lines changed

3 files changed

+11
-5
lines changed

Lib/test/test_dictviews.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ def test_keys_set_operations(self):
9797
self.assertEqual(d1.keys() & set(d1.keys()), {'a', 'b'})
9898
self.assertEqual(d1.keys() & set(d2.keys()), {'b'})
9999
self.assertEqual(d1.keys() & set(d3.keys()), set())
100+
self.assertEqual(d1.keys() & tuple(d1.keys()), {'a', 'b'})
100101

101102
self.assertEqual(d1.keys() | d1.keys(), {'a', 'b'})
102103
self.assertEqual(d1.keys() | d2.keys(), {'a', 'b', 'c'})
@@ -105,6 +106,7 @@ def test_keys_set_operations(self):
105106
self.assertEqual(d1.keys() | set(d2.keys()), {'a', 'b', 'c'})
106107
self.assertEqual(d1.keys() | set(d3.keys()),
107108
{'a', 'b', 'd', 'e'})
109+
self.assertEqual(d1.keys() | (1, 2), {'a', 'b', 1, 2})
108110

109111
self.assertEqual(d1.keys() ^ d1.keys(), set())
110112
self.assertEqual(d1.keys() ^ d2.keys(), {'a', 'c'})
@@ -113,13 +115,15 @@ def test_keys_set_operations(self):
113115
self.assertEqual(d1.keys() ^ set(d2.keys()), {'a', 'c'})
114116
self.assertEqual(d1.keys() ^ set(d3.keys()),
115117
{'a', 'b', 'd', 'e'})
118+
self.assertEqual(d1.keys() ^ tuple(d2.keys()), {'a', 'c'})
116119

117120
self.assertEqual(d1.keys() - d1.keys(), set())
118121
self.assertEqual(d1.keys() - d2.keys(), {'a'})
119122
self.assertEqual(d1.keys() - d3.keys(), {'a', 'b'})
120123
self.assertEqual(d1.keys() - set(d1.keys()), set())
121124
self.assertEqual(d1.keys() - set(d2.keys()), {'a'})
122125
self.assertEqual(d1.keys() - set(d3.keys()), {'a', 'b'})
126+
self.assertEqual(d1.keys() - (0, 1), {'a', 'b'})
123127

124128
self.assertFalse(d1.keys().isdisjoint(d1.keys()))
125129
self.assertFalse(d1.keys().isdisjoint(d2.keys()))

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ Release date: tba
1010
Core and Builtins
1111
-----------------
1212

13+
- Issue #26478: Fix semantic bugs when using binary operators with dictionary
14+
views and tuples.
15+
1316
- Issue #26171: Fix possible integer overflow and heap corruption in
1417
zipimporter.get_data().
1518

Objects/dictobject.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3394,7 +3394,7 @@ dictviews_sub(PyObject* self, PyObject *other)
33943394
if (result == NULL)
33953395
return NULL;
33963396

3397-
tmp = _PyObject_CallMethodId(result, &PyId_difference_update, "O", other);
3397+
tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_difference_update, other, NULL);
33983398
if (tmp == NULL) {
33993399
Py_DECREF(result);
34003400
return NULL;
@@ -3414,7 +3414,7 @@ dictviews_and(PyObject* self, PyObject *other)
34143414
if (result == NULL)
34153415
return NULL;
34163416

3417-
tmp = _PyObject_CallMethodId(result, &PyId_intersection_update, "O", other);
3417+
tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_intersection_update, other, NULL);
34183418
if (tmp == NULL) {
34193419
Py_DECREF(result);
34203420
return NULL;
@@ -3434,7 +3434,7 @@ dictviews_or(PyObject* self, PyObject *other)
34343434
if (result == NULL)
34353435
return NULL;
34363436

3437-
tmp = _PyObject_CallMethodId(result, &PyId_update, "O", other);
3437+
tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_update, other, NULL);
34383438
if (tmp == NULL) {
34393439
Py_DECREF(result);
34403440
return NULL;
@@ -3454,8 +3454,7 @@ dictviews_xor(PyObject* self, PyObject *other)
34543454
if (result == NULL)
34553455
return NULL;
34563456

3457-
tmp = _PyObject_CallMethodId(result, &PyId_symmetric_difference_update, "O",
3458-
other);
3457+
tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_symmetric_difference_update, other, NULL);
34593458
if (tmp == NULL) {
34603459
Py_DECREF(result);
34613460
return NULL;

0 commit comments

Comments
 (0)