Issue #25949: __dict__ for an OrderedDict instance is now created only when

needed.
This commit is contained in:
Serhiy Storchaka 2016-02-08 16:39:05 +02:00
parent 79ad897052
commit d2962f145a
3 changed files with 13 additions and 17 deletions

View File

@ -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

View File

@ -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

View File

@ -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 */