]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Bug #1648179: set.update() not recognizing __iter__ overrides in dict subclasses.
authorRaymond Hettinger <python@rcn.com>
Thu, 1 Feb 2007 21:01:21 +0000 (21:01 +0000)
committerRaymond Hettinger <python@rcn.com>
Thu, 1 Feb 2007 21:01:21 +0000 (21:01 +0000)
Misc/NEWS
Objects/setobject.c

index ff8a0825cd15ad3c09d6bafad04123aaafa5c643..303f4cf3c5416bf304eaf477a7dcfa78297b5f0c 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -16,6 +16,9 @@ Core and builtins
   a weakref on itself during a __del__ call for new-style classes (classic
   classes still have the bug).
 
+- Bug #1648179:  set.update() did not recognize an overridden __iter__ 
+  method in subclasses of dict.
+
 - Bug #1579370: Make PyTraceBack_Here use the current thread, not the
   frame's thread state.
 
index f038ee3fdeb7dd6d07f58bf32422f503a206bcab..5b5fb3df012ae00d1c05733e6094302988340ce8 100644 (file)
@@ -915,7 +915,7 @@ set_update_internal(PySetObject *so, PyObject *other)
        if (PyAnySet_Check(other))
                return set_merge(so, other);
 
-       if (PyDict_Check(other)) {
+       if (PyDict_CheckExact(other)) {
                PyObject *value;
                Py_ssize_t pos = 0;
                while (PyDict_Next(other, &pos, &key, &value)) {
@@ -1363,7 +1363,7 @@ set_difference(PySetObject *so, PyObject *other)
        setentry *entry;
        Py_ssize_t pos = 0;
 
-       if (!PyAnySet_Check(other)  && !PyDict_Check(other)) {
+       if (!PyAnySet_Check(other)  && !PyDict_CheckExact(other)) {
                result = set_copy(so);
                if (result == NULL)
                        return NULL;
@@ -1377,7 +1377,7 @@ set_difference(PySetObject *so, PyObject *other)
        if (result == NULL)
                return NULL;
 
-       if (PyDict_Check(other)) {
+       if (PyDict_CheckExact(other)) {
                while (set_next(so, &pos, &entry)) {
                        setentry entrycopy;
                        entrycopy.hash = entry->hash;
@@ -1450,7 +1450,7 @@ set_symmetric_difference_update(PySetObject *so, PyObject *other)
        if ((PyObject *)so == other)
                return set_clear(so);
 
-       if (PyDict_Check(other)) {
+       if (PyDict_CheckExact(other)) {
                PyObject *value;
                int rv;
                while (PyDict_Next(other, &pos, &key, &value)) {