Commit 0718de97 authored by Benjamin Peterson's avatar Benjamin Peterson

repair my irrational excuberance

parent 99e96f2b
...@@ -2411,73 +2411,76 @@ mutablemapping_update(PyObject *self, PyObject *args, PyObject *kwargs) ...@@ -2411,73 +2411,76 @@ mutablemapping_update(PyObject *self, PyObject *args, PyObject *kwargs)
return NULL; return NULL;
} }
if (len == 1) {
PyObject *other = PyTuple_GET_ITEM(args, 0); /* borrowed reference */ PyObject *other = PyTuple_GET_ITEM(args, 0); /* borrowed reference */
if (other == NULL) 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)
return NULL; return NULL;
} Py_INCREF(other);
else if (PyObject_HasAttrString(other, "keys")) { /* never fails */ if (PyObject_HasAttrString(other, "items")) { /* never fails */
PyObject *keys, *iterator, *key; PyObject *items = PyMapping_Items(other);
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_DECREF(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))) { else if (PyObject_HasAttrString(other, "keys")) { /* never fails */
PyObject *value = PyObject_GetItem(other, key); PyObject *keys, *iterator, *key;
if (value != NULL) { keys = PyObject_CallMethod(other, "keys", NULL);
res = PyObject_SetItem(self, key, value); if (keys == NULL) {
Py_DECREF(value); Py_DECREF(other);
return NULL;
} }
else { iterator = PyObject_GetIter(keys);
res = -1; 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 */ /* now handle kwargs */
len = (kwargs != NULL) ? PyObject_Size(kwargs) : 0; len = (kwargs != NULL) ? PyObject_Size(kwargs) : 0;
if (len < 0) /* PyObject_Size raised an exception. */ if (len < 0) /* PyObject_Size raised an exception. */
return NULL; return NULL;
PyObject *items; if (len > 0) {
if (!PyMapping_Check(kwargs)) { PyObject *items;
PyErr_SetString(PyExc_TypeError, "expected mapping for kwargs"); if (!PyMapping_Check(kwargs)) {
return NULL; 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; Py_RETURN_NONE;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment