mirror of https://github.com/python/cpython
Issue #25949: __dict__ for an OrderedDict instance is now created only when
needed.
This commit is contained in:
parent
79ad897052
commit
d2962f145a
|
@ -298,9 +298,11 @@ class OrderedDictTests:
|
|||
# do not save instance dictionary if not needed
|
||||
pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]
|
||||
od = OrderedDict(pairs)
|
||||
self.assertIsInstance(od.__dict__, dict)
|
||||
self.assertIsNone(od.__reduce__()[2])
|
||||
od.x = 10
|
||||
self.assertIsNotNone(od.__reduce__()[2])
|
||||
self.assertEqual(od.__dict__['x'], 10)
|
||||
self.assertEqual(od.__reduce__()[2], {'x': 10})
|
||||
|
||||
def test_pickle_recursive(self):
|
||||
OrderedDict = self.OrderedDict
|
||||
|
|
|
@ -170,6 +170,9 @@ Core and Builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- Issue #25949: __dict__ for an OrderedDict instance is now created only when
|
||||
needed.
|
||||
|
||||
- Issue #25911: Restored support of bytes paths in os.walk() on Windows.
|
||||
|
||||
- Issue #26045: Add UTF-8 suggestion to error message when posting a
|
||||
|
|
|
@ -1424,14 +1424,13 @@ static PyMethodDef odict_methods[] = {
|
|||
* OrderedDict members
|
||||
*/
|
||||
|
||||
/* tp_members */
|
||||
/* tp_getset */
|
||||
|
||||
static PyMemberDef odict_members[] = {
|
||||
{"__dict__", T_OBJECT, offsetof(PyODictObject, od_inst_dict), READONLY},
|
||||
{0}
|
||||
static PyGetSetDef odict_getset[] = {
|
||||
{"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
|
||||
{NULL}
|
||||
};
|
||||
|
||||
|
||||
/* ----------------------------------------------
|
||||
* OrderedDict type slot methods
|
||||
*/
|
||||
|
@ -1653,20 +1652,12 @@ odict_init(PyObject *self, PyObject *args, PyObject *kwds)
|
|||
static PyObject *
|
||||
odict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||
{
|
||||
PyObject *dict;
|
||||
PyODictObject *od;
|
||||
|
||||
dict = PyDict_New();
|
||||
if (dict == NULL)
|
||||
return NULL;
|
||||
|
||||
od = (PyODictObject *)PyDict_Type.tp_new(type, args, kwds);
|
||||
if (od == NULL) {
|
||||
Py_DECREF(dict);
|
||||
if (od == NULL)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
od->od_inst_dict = dict;
|
||||
/* type constructor fills the memory with zeros (see
|
||||
PyType_GenericAlloc()), there is no need to set them to zero again */
|
||||
if (_odict_resize(od) < 0) {
|
||||
|
@ -1708,8 +1699,8 @@ PyTypeObject PyODict_Type = {
|
|||
(getiterfunc)odict_iter, /* tp_iter */
|
||||
0, /* tp_iternext */
|
||||
odict_methods, /* tp_methods */
|
||||
odict_members, /* tp_members */
|
||||
0, /* tp_getset */
|
||||
0, /* tp_members */
|
||||
odict_getset, /* tp_getset */
|
||||
&PyDict_Type, /* tp_base */
|
||||
0, /* tp_dict */
|
||||
0, /* tp_descr_get */
|
||||
|
|
Loading…
Reference in New Issue