diff -r a3f076d4f54f Modules/_elementtree.c --- a/Modules/_elementtree.c Fri Dec 18 10:23:29 2015 +0200 +++ b/Modules/_elementtree.c Fri Dec 18 11:13:18 2015 +0200 @@ -3582,9 +3582,10 @@ static PyObject * /*[clinic end generated code: output=1440092922b13ed1 input=abf90830a1c3b0fc]*/ { /* activate element event reporting */ - Py_ssize_t i, seqlen; + Py_ssize_t i; TreeBuilderObject *target; PyObject *events_append, *events_seq; + PyObject *tmp; if (!TreeBuilder_CheckExact(self->target)) { PyErr_SetString( @@ -3600,8 +3601,9 @@ static PyObject * events_append = PyObject_GetAttrString(events_queue, "append"); if (events_append == NULL) return NULL; - Py_XDECREF(target->events_append); + tmp = target->events_append; target->events_append = events_append; + Py_XDECREF(tmp); /* clear out existing events */ Py_CLEAR(target->start_event_obj); @@ -3620,8 +3622,7 @@ static PyObject * return NULL; } - seqlen = PySequence_Size(events_seq); - for (i = 0; i < seqlen; ++i) { + for (i = 0; i < PySequence_Size(events_seq); ++i) { PyObject *event_name_obj = PySequence_Fast_GET_ITEM(events_seq, i); char *event_name = NULL; if (PyUnicode_Check(event_name_obj)) { @@ -3629,37 +3630,41 @@ static PyObject * } else if (PyBytes_Check(event_name_obj)) { event_name = PyBytes_AS_STRING(event_name_obj); } + Py_INCREF(event_name_obj); if (event_name == NULL) { + Py_DECREF(event_name_obj); Py_DECREF(events_seq); PyErr_Format(PyExc_ValueError, "invalid events sequence"); return NULL; } else if (strcmp(event_name, "start") == 0) { - Py_INCREF(event_name_obj); + tmp = target->start_event_obj; target->start_event_obj = event_name_obj; + Py_XDECREF(tmp); } else if (strcmp(event_name, "end") == 0) { - Py_INCREF(event_name_obj); - Py_XDECREF(target->end_event_obj); + tmp = target->end_event_obj; target->end_event_obj = event_name_obj; + Py_XDECREF(tmp); } else if (strcmp(event_name, "start-ns") == 0) { - Py_INCREF(event_name_obj); - Py_XDECREF(target->start_ns_event_obj); + tmp = target->start_ns_event_obj; target->start_ns_event_obj = event_name_obj; + Py_XDECREF(tmp); EXPAT(SetNamespaceDeclHandler)( self->parser, (XML_StartNamespaceDeclHandler) expat_start_ns_handler, (XML_EndNamespaceDeclHandler) expat_end_ns_handler ); } else if (strcmp(event_name, "end-ns") == 0) { - Py_INCREF(event_name_obj); - Py_XDECREF(target->end_ns_event_obj); + tmp = target->end_ns_event_obj; target->end_ns_event_obj = event_name_obj; + Py_XDECREF(tmp); EXPAT(SetNamespaceDeclHandler)( self->parser, (XML_StartNamespaceDeclHandler) expat_start_ns_handler, (XML_EndNamespaceDeclHandler) expat_end_ns_handler ); } else { + Py_DECREF(event_name_obj); Py_DECREF(events_seq); PyErr_Format(PyExc_ValueError, "unknown event '%s'", event_name); return NULL;