]> granicus.if.org Git - python/commitdiff
Issue #25949: __dict__ for an OrderedDict instance is now created only when
authorSerhiy Storchaka <storchaka@gmail.com>
Mon, 8 Feb 2016 14:39:05 +0000 (16:39 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Mon, 8 Feb 2016 14:39:05 +0000 (16:39 +0200)
needed.

Lib/test/test_ordered_dict.py
Misc/NEWS
Objects/odictobject.c

index 633e90919b8190010a1af945aeb18a8b1e0c9be8..e1564ba1c79f34460513f16e85bf526f5677beb7 100644 (file)
@@ -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
index bb7c57d4ad17bd460d531bce1a19f53abfe7bc82..e6590b5a46ceff8b335f3ccf845e7cbf87aeb04f 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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
index 1abdd02cdfa540fa3bc049bb9a8db884ad33e70a..dccbb3ec4ccf1421da645b4a683b29b9d80605e1 100644 (file)
@@ -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 */