]> granicus.if.org Git - python/commitdiff
properly use PyObject_CallMethod in dictview binary operations (closes #26478)
authorBenjamin Peterson <benjamin@python.org>
Fri, 4 Mar 2016 06:05:36 +0000 (22:05 -0800)
committerBenjamin Peterson <benjamin@python.org>
Fri, 4 Mar 2016 06:05:36 +0000 (22:05 -0800)
Lib/test/test_dictviews.py
Misc/NEWS
Objects/dictobject.c

index 71f1af733fe32531a71e8080a685043c6832d684..b585bdd90203eac8357ce3a561752aa863395ab1 100644 (file)
@@ -98,6 +98,7 @@ class DictSetTest(unittest.TestCase):
         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 @@ class DictSetTest(unittest.TestCase):
         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 @@ class DictSetTest(unittest.TestCase):
         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 @@ class DictSetTest(unittest.TestCase):
         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}
index a89afa17376ec8b71bc7c1cd291b52e5e7cae2f9..61379836ea47c562a644658938c1bd742e0e6577 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -49,6 +49,9 @@ Core and Builtins
   __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().
 
index 3e1c5830ec8932fb370b3eb8749d45b160cfab09..fe19356de2f7b0ac4aa5a38cd471fdc3e6171a69 100644 (file)
@@ -2998,7 +2998,8 @@ dictviews_sub(PyObject* self, PyObject *other)
     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 @@ dictviews_and(PyObject* self, PyObject *other)
     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 @@ dictviews_or(PyObject* self, PyObject *other)
     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 @@ dictviews_xor(PyObject* self, PyObject *other)
     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;