mirror of https://github.com/python/cpython
Issue #27576: Fix call order in OrderedDict.__init__().
This commit is contained in:
parent
7d895ac953
commit
06aed90a1f
|
@ -98,6 +98,19 @@ class OrderedDictTests:
|
||||||
self.assertRaises(TypeError, OrderedDict().update, (), ())
|
self.assertRaises(TypeError, OrderedDict().update, (), ())
|
||||||
self.assertRaises(TypeError, OrderedDict.update)
|
self.assertRaises(TypeError, OrderedDict.update)
|
||||||
|
|
||||||
|
def test_init_calls(self):
|
||||||
|
calls = []
|
||||||
|
class Spam:
|
||||||
|
def keys(self):
|
||||||
|
calls.append('keys')
|
||||||
|
return ()
|
||||||
|
def items(self):
|
||||||
|
calls.append('items')
|
||||||
|
return ()
|
||||||
|
|
||||||
|
self.OrderedDict(Spam())
|
||||||
|
self.assertEqual(calls, ['keys'])
|
||||||
|
|
||||||
def test_fromkeys(self):
|
def test_fromkeys(self):
|
||||||
OrderedDict = self.OrderedDict
|
OrderedDict = self.OrderedDict
|
||||||
od = OrderedDict.fromkeys('abc')
|
od = OrderedDict.fromkeys('abc')
|
||||||
|
|
|
@ -113,6 +113,8 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #27576: Fix call order in OrderedDict.__init__().
|
||||||
|
|
||||||
- email.generator.DecodedGenerator now supports the policy keyword.
|
- email.generator.DecodedGenerator now supports the policy keyword.
|
||||||
|
|
||||||
- Issue #28027: Remove undocumented modules from ``Lib/plat-*``: IN, CDROM,
|
- Issue #28027: Remove undocumented modules from ``Lib/plat-*``: IN, CDROM,
|
||||||
|
|
|
@ -2356,8 +2356,7 @@ mutablemapping_update(PyObject *self, PyObject *args, PyObject *kwargs)
|
||||||
PyObject *other = PyTuple_GET_ITEM(args, 0); /* borrowed reference */
|
PyObject *other = PyTuple_GET_ITEM(args, 0); /* borrowed reference */
|
||||||
assert(other != NULL);
|
assert(other != NULL);
|
||||||
Py_INCREF(other);
|
Py_INCREF(other);
|
||||||
if (PyDict_CheckExact(other) ||
|
if PyDict_CheckExact(other) {
|
||||||
_PyObject_HasAttrId(other, &PyId_items)) { /* never fails */
|
|
||||||
PyObject *items;
|
PyObject *items;
|
||||||
if (PyDict_CheckExact(other))
|
if (PyDict_CheckExact(other))
|
||||||
items = PyDict_Items(other);
|
items = PyDict_Items(other);
|
||||||
|
@ -2400,6 +2399,20 @@ mutablemapping_update(PyObject *self, PyObject *args, PyObject *kwargs)
|
||||||
if (res != 0 || PyErr_Occurred())
|
if (res != 0 || PyErr_Occurred())
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
else if (_PyObject_HasAttrId(other, &PyId_items)) { /* never fails */
|
||||||
|
PyObject *items;
|
||||||
|
if (PyDict_CheckExact(other))
|
||||||
|
items = PyDict_Items(other);
|
||||||
|
else
|
||||||
|
items = _PyObject_CallMethodId(other, &PyId_items, NULL);
|
||||||
|
Py_DECREF(other);
|
||||||
|
if (items == NULL)
|
||||||
|
return NULL;
|
||||||
|
res = mutablemapping_add_pairs(self, items);
|
||||||
|
Py_DECREF(items);
|
||||||
|
if (res == -1)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
res = mutablemapping_add_pairs(self, other);
|
res = mutablemapping_add_pairs(self, other);
|
||||||
Py_DECREF(other);
|
Py_DECREF(other);
|
||||||
|
|
Loading…
Reference in New Issue