[Python-checkins] cpython (2.7): properly use PyObject_CallMethod in dictview binary operations (closes #26478)
benjamin.peterson
python-checkins at python.org
Mon Mar 7 23:55:21 EST 2016
https://hg.python.org/cpython/rev/309f3559a729
changeset: 100446:309f3559a729
branch: 2.7
parent: 100443:c6b0204c23c5
user: Benjamin Peterson <benjamin at python.org>
date: Thu Mar 03 22:05:36 2016 -0800
summary:
properly use PyObject_CallMethod in dictview binary operations (closes #26478)
files:
Lib/test/test_dictviews.py | 4 ++++
Misc/NEWS | 3 +++
Objects/dictobject.c | 10 +++++-----
3 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/Lib/test/test_dictviews.py b/Lib/test/test_dictviews.py
--- a/Lib/test/test_dictviews.py
+++ b/Lib/test/test_dictviews.py
@@ -98,6 +98,7 @@
self.assertEqual(d1.viewkeys() & set(d1.viewkeys()), {'a', 'b'})
self.assertEqual(d1.viewkeys() & set(d2.viewkeys()), {'b'})
self.assertEqual(d1.viewkeys() & set(d3.viewkeys()), set())
+ self.assertEqual(d1.viewkeys() & tuple(d1.viewkeys()), {'a', 'b'})
self.assertEqual(d1.viewkeys() | d1.viewkeys(), {'a', 'b'})
self.assertEqual(d1.viewkeys() | d2.viewkeys(), {'a', 'b', 'c'})
@@ -106,6 +107,7 @@
self.assertEqual(d1.viewkeys() | set(d2.viewkeys()), {'a', 'b', 'c'})
self.assertEqual(d1.viewkeys() | set(d3.viewkeys()),
{'a', 'b', 'd', 'e'})
+ self.assertEqual(d1.viewkeys() | (1, 2), {'a', 'b', 1, 2})
self.assertEqual(d1.viewkeys() ^ d1.viewkeys(), set())
self.assertEqual(d1.viewkeys() ^ d2.viewkeys(), {'a', 'c'})
@@ -114,6 +116,7 @@
self.assertEqual(d1.viewkeys() ^ set(d2.viewkeys()), {'a', 'c'})
self.assertEqual(d1.viewkeys() ^ set(d3.viewkeys()),
{'a', 'b', 'd', 'e'})
+ self.assertEqual(d1.viewkeys() ^ tuple(d2.keys()), {'a', 'c'})
self.assertEqual(d1.viewkeys() - d1.viewkeys(), set())
self.assertEqual(d1.viewkeys() - d2.viewkeys(), {'a'})
@@ -121,6 +124,7 @@
self.assertEqual(d1.viewkeys() - set(d1.viewkeys()), set())
self.assertEqual(d1.viewkeys() - set(d2.viewkeys()), {'a'})
self.assertEqual(d1.viewkeys() - set(d3.viewkeys()), {'a', 'b'})
+ self.assertEqual(d1.viewkeys() - (0, 1), {'a', 'b'})
def test_items_set_operations(self):
d1 = {'a': 1, 'b': 2}
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -49,6 +49,9 @@
__str__, __trunc__, and __float__ returning instances of subclasses of
str, long, and float to subclasses of str, long, and float correspondingly.
+- 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
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -2998,7 +2998,8 @@
if (result == NULL)
return NULL;
- tmp = PyObject_CallMethod(result, "difference_update", "O", other);
+
+ tmp = PyObject_CallMethod(result, "difference_update", "(O)", other);
if (tmp == NULL) {
Py_DECREF(result);
return NULL;
@@ -3016,7 +3017,7 @@
if (result == NULL)
return NULL;
- tmp = PyObject_CallMethod(result, "intersection_update", "O", other);
+ tmp = PyObject_CallMethod(result, "intersection_update", "(O)", other);
if (tmp == NULL) {
Py_DECREF(result);
return NULL;
@@ -3034,7 +3035,7 @@
if (result == NULL)
return NULL;
- tmp = PyObject_CallMethod(result, "update", "O", other);
+ tmp = PyObject_CallMethod(result, "update", "(O)", other);
if (tmp == NULL) {
Py_DECREF(result);
return NULL;
@@ -3052,8 +3053,7 @@
if (result == NULL)
return NULL;
- tmp = PyObject_CallMethod(result, "symmetric_difference_update", "O",
- other);
+ tmp = PyObject_CallMethod(result, "symmetric_difference_update", "(O)", other);
if (tmp == NULL) {
Py_DECREF(result);
return NULL;
--
Repository URL: https://hg.python.org/cpython
More information about the Python-checkins
mailing list