(original) (raw)
changeset: 84581:1e0afd558ba3 user: Victor Stinner victor.stinner@gmail.com date: Fri Jul 12 02:05:17 2013 +0200 files: Modules/_elementtree.c description: Issue #18408: Fix constructors of _elementtree.c * Use Py_DECREF() instead of PyObject_GC_Del() to release correctly all resources * Raise MemoryError on memory allocation failure diff -r 60b1d7967ef8 -r 1e0afd558ba3 Modules/_elementtree.c --- a/Modules/_elementtree.c Fri Jul 12 02:03:34 2013 +0200 +++ b/Modules/_elementtree.c Fri Jul 12 02:05:17 2013 +0200 @@ -237,15 +237,16 @@ self->weakreflist = NULL; + ALLOC(sizeof(ElementObject), "create element"); + PyObject_GC_Track(self); + if (attrib != Py_None && !is_empty_dict(attrib)) { if (create_extra(self, attrib) < 0) { - PyObject_GC_Del(self); + Py_DECREF(self); return NULL; } } - ALLOC(sizeof(ElementObject), "create element"); - PyObject_GC_Track(self); return (PyObject*) self; } @@ -2122,14 +2123,6 @@ it = PyObject_GC_New(ElementIterObject, &ElementIter_Type); if (!it) return NULL; - if (!(it->parent_stack = PyObject_Malloc(sizeof(ParentLocator)))) { - PyObject_GC_Del(it); - return NULL; - } - - it->parent_stack->parent = NULL; - it->parent_stack->child_index = 0; - it->parent_stack->next = NULL; if (PyUnicode_Check(tag)) star = PyUnicode_FromString("*"); @@ -2147,8 +2140,18 @@ Py_INCREF(self); it->root_element = self; - PyObject_GC_Track(it); + + it->parent_stack = PyObject_Malloc(sizeof(ParentLocator)); + if (it->parent_stack == NULL) { + Py_DECREF(it); + PyErr_NoMemory(); + return NULL; + } + it->parent_stack->parent = NULL; + it->parent_stack->child_index = 0; + it->parent_stack->next = NULL; + return (PyObject *)it; } /victor.stinner@gmail.com