From 0718de977076fe01026b862453797ea0ee8a3fe2 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Sun, 7 Jun 2015 00:00:42 -0500 Subject: repair my irrational excuberance --- Objects/odictobject.c | 111 ++++++++++++++++++++++++++------------------------ 1 file changed, 57 insertions(+), 54 deletions(-) diff --git a/Objects/odictobject.c b/Objects/odictobject.c index a490e78..de09430 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -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; } -- cgit v0.12