]> granicus.if.org Git - python/commitdiff
repair my irrational excuberance
authorBenjamin Peterson <benjamin@python.org>
Sun, 7 Jun 2015 05:00:42 +0000 (00:00 -0500)
committerBenjamin Peterson <benjamin@python.org>
Sun, 7 Jun 2015 05:00:42 +0000 (00:00 -0500)
Objects/odictobject.c

index a490e786c045f67eec4f62088446e97a849f43e0..de09430980cd20ca26f60e5aebab286874dd1e76 100644 (file)
@@ -2411,73 +2411,76 @@ mutablemapping_update(PyObject *self, PyObject *args, PyObject *kwargs)
         return NULL;
     }
 
-    
-    PyObject *other = PyTuple_GET_ITEM(args, 0);  /* borrowed reference */
-    if (other == NULL)
-        return NULL;
-    Py_INCREF(other);
-    if (PyObject_HasAttrString(other, "items")) {  /* never fails */
-        PyObject *items = PyMapping_Items(other);
-        Py_DECREF(other);
-        if (items == NULL)
-            return NULL;
-        res = mutablemapping_add_pairs(self, items);
-        Py_DECREF(items);
-        if (res == -1)
+    if (len == 1) {
+        PyObject *other = PyTuple_GET_ITEM(args, 0);  /* borrowed reference */
+        if (other == NULL)
             return NULL;
-    }
-    else if (PyObject_HasAttrString(other, "keys")) {  /* never fails */
-        PyObject *keys, *iterator, *key;
-        keys = PyObject_CallMethod(other, "keys", NULL);
-        if (keys == NULL) {
-            Py_DECREF(other);
-            return NULL;
-        }
-        iterator = PyObject_GetIter(keys);
-        Py_DECREF(keys);
-        if (iterator == NULL) {
+        Py_INCREF(other);
+        if (PyObject_HasAttrString(other, "items")) {  /* never fails */
+            PyObject *items = PyMapping_Items(other);
             Py_DECREF(other);
-            return NULL;
+            if (items == NULL)
+                return NULL;
+            res = mutablemapping_add_pairs(self, items);
+            Py_DECREF(items);
+            if (res == -1)
+                return NULL;
         }
-        while (res == 0 && (key = PyIter_Next(iterator))) {
-            PyObject *value = PyObject_GetItem(other, key);
-            if (value != NULL) {
-                res = PyObject_SetItem(self, key, value);
-                Py_DECREF(value);
+        else if (PyObject_HasAttrString(other, "keys")) {  /* never fails */
+            PyObject *keys, *iterator, *key;
+            keys = PyObject_CallMethod(other, "keys", NULL);
+            if (keys == NULL) {
+                Py_DECREF(other);
+                return NULL;
             }
-            else {
-                res = -1;
+            iterator = PyObject_GetIter(keys);
+            Py_DECREF(keys);
+            if (iterator == NULL) {
+                Py_DECREF(other);
+                return NULL;
             }
-            Py_DECREF(key);
+            while (res == 0 && (key = PyIter_Next(iterator))) {
+                PyObject *value = PyObject_GetItem(other, key);
+                if (value != NULL) {
+                    res = PyObject_SetItem(self, key, value);
+                    Py_DECREF(value);
+                }
+                else {
+                    res = -1;
+                }
+                Py_DECREF(key);
+            }
+            Py_DECREF(other);
+            Py_DECREF(iterator);
+            if (res != 0 || PyErr_Occurred())
+                return NULL;
+        }
+        else {
+            res = mutablemapping_add_pairs(self, other);
+            Py_DECREF(other);
+            if (res != 0)
+                return NULL;
         }
-        Py_DECREF(other);
-        Py_DECREF(iterator);
-        if (res != 0 || PyErr_Occurred())
-            return NULL;
-    }
-    else {
-        res = mutablemapping_add_pairs(self, other);
-        Py_DECREF(other);
-        if (res != 0)
-            return NULL;
     }
 
     /* now handle kwargs */
     len = (kwargs != NULL) ? PyObject_Size(kwargs) : 0;
     if (len < 0) /* PyObject_Size raised an exception. */
         return NULL;
-    PyObject *items;
-    if (!PyMapping_Check(kwargs)) {
-        PyErr_SetString(PyExc_TypeError, "expected mapping for kwargs");
-        return NULL;
+    if (len > 0) {
+        PyObject *items;
+        if (!PyMapping_Check(kwargs)) {
+            PyErr_SetString(PyExc_TypeError, "expected mapping for kwargs");
+            return NULL;
+        }
+        items = PyMapping_Items(kwargs);
+        if (items == NULL)
+            return NULL;
+        res = mutablemapping_add_pairs(self, items);
+        Py_DECREF(items);
+        if (res == -1)
+            return NULL;
     }
-    items = PyMapping_Items(kwargs);
-    if (items == NULL)
-        return NULL;
-    res = mutablemapping_add_pairs(self, items);
-    Py_DECREF(items);
-    if (res == -1)
-        return NULL;
 
     Py_RETURN_NONE;
 }