]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #18408: dict_new() now fails on new_keys_object() error
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 16 Jul 2013 20:19:00 +0000 (22:19 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Tue, 16 Jul 2013 20:19:00 +0000 (22:19 +0200)
Pass the MemoryError exception to the caller, instead of using empty keys.

Objects/dictobject.c

index d02ef02b6801d69c7a28f438468c6c2d82b9cb39..3243061b68bd1a5a4a33eb5a66f7b233715fcd6e 100644 (file)
@@ -1395,7 +1395,7 @@ dict_dealloc(PyDictObject *mp)
         }
         DK_DECREF(keys);
     }
-    else {
+    else if (keys != NULL) {
         assert(keys->dk_refcnt == 1);
         DK_DECREF(keys);
     }
@@ -2595,19 +2595,18 @@ dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self = type->tp_alloc(type, 0);
     if (self == NULL)
         return NULL;
-
     d = (PyDictObject *)self;
-    d->ma_keys = new_keys_object(PyDict_MINSIZE_COMBINED);
-    /* XXX - Should we raise a no-memory error? */
-    if (d->ma_keys == NULL) {
-        DK_INCREF(Py_EMPTY_KEYS);
-        d->ma_keys = Py_EMPTY_KEYS;
-        d->ma_values = empty_values;
-    }
-    d->ma_used = 0;
+
     /* The object has been implicitly tracked by tp_alloc */
     if (type == &PyDict_Type)
         _PyObject_GC_UNTRACK(d);
+
+    d->ma_used = 0;
+    d->ma_keys = new_keys_object(PyDict_MINSIZE_COMBINED);
+    if (d->ma_keys == NULL) {
+        Py_DECREF(self);
+        return NULL;
+    }
     return self;
 }