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