summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2015-06-07 05:00:42 (GMT)
committerBenjamin Peterson <benjamin@python.org>2015-06-07 05:00:42 (GMT)
commit0718de977076fe01026b862453797ea0ee8a3fe2 (patch)
tree90e6c35d44794ab71e567bdf43095518676c1c2b /Objects
parent99e96f2bb0c4653b3bb90f21f42d81e0b17d8ed1 (diff)
downloadcpython-0718de977076fe01026b862453797ea0ee8a3fe2.zip
cpython-0718de977076fe01026b862453797ea0ee8a3fe2.tar.gz
cpython-0718de977076fe01026b862453797ea0ee8a3fe2.tar.bz2
repair my irrational excuberance
Diffstat (limited to 'Objects')
-rw-r--r--Objects/odictobject.c111
1 files 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;
}