diff --git a/ChangeLog b/ChangeLog index ebbf6d69..d6e645ad 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Tue Jan 14 15:39:14 CET 2003 Daniel Veillard + + * python/libxml.c: cleanup patch from Stéphane Bidoul + Tue Jan 14 14:41:18 CET 2003 Daniel Veillard * encoding.c: fixing bug #103100 with a dummy UTF8ToUTF8 copy @@ -6,7 +10,7 @@ Tue Jan 14 12:40:29 CET 2003 Daniel Veillard * python/generator.py python/libxml.c python/libxml.py python/libxml_wrap.h python/types.c: applied and fixed a patch - from Stephane Bibould to provide per parser error handlers at the + from Stéphane Bidoul to provide per parser error handlers at the Python level. * python/tests/Makefile.am python/tests/ctxterror.py: added a regression test for it. diff --git a/python/libxml.c b/python/libxml.c index 15a30b5a..f1b0d6a2 100644 --- a/python/libxml.c +++ b/python/libxml.c @@ -439,6 +439,7 @@ pythonExternalEntityLoader(const char *URL, const char *ID, ret = PyObject_CallFunction(pythonExternalEntityLoaderObjext, (char *) "(ssO)", URL, ID, ctxtobj); + Py_XDECREF(ctxtobj); #ifdef DEBUG_LOADER printf("pythonExternalEntityLoader: result "); PyObject_Print(ret, stdout, 0); @@ -1372,6 +1373,7 @@ libxml_xmlSetParserCtxtErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *a { PyObject *py_retval; xmlParserCtxtPtr ctxt; + xmlParserCtxtPyCtxtPtr pyCtxt; PyObject *pyobj_ctxt; PyObject *pyobj_f; PyObject *pyobj_arg; @@ -1381,8 +1383,6 @@ libxml_xmlSetParserCtxtErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *a return(NULL); ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt); if (ctxt->_private == NULL) { - xmlParserCtxtPyCtxt *pyCtxt; - pyCtxt = xmlMalloc(sizeof(xmlParserCtxtPyCtxt)); if (pyCtxt == NULL) { py_retval = libxml_intWrap(-1); @@ -1391,11 +1391,16 @@ libxml_xmlSetParserCtxtErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *a memset(pyCtxt,0,sizeof(xmlParserCtxtPyCtxt)); ctxt->_private = pyCtxt; } + else { + pyCtxt = ctxt->_private; + } /* TODO: check f is a function ! */ + Py_XDECREF(pyCtxt->errorFunc); Py_XINCREF(pyobj_f); - ((xmlParserCtxtPyCtxt *)ctxt->_private)->errorFunc = pyobj_f; + pyCtxt->errorFunc = pyobj_f; + Py_XDECREF(pyCtxt->errorFuncArg); Py_XINCREF(pyobj_arg); - ((xmlParserCtxtPyCtxt *)ctxt->_private)->errorFuncArg = pyobj_arg; + pyCtxt->errorFuncArg = pyobj_arg; ctxt->sax->error = libxml_xmlParserCtxtErrorFuncHandler; ctxt->vctxt.error = libxml_xmlParserCtxtErrorFuncHandler; @@ -1445,6 +1450,7 @@ libxml_xmlSetParserCtxtWarningHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject { PyObject *py_retval; xmlParserCtxtPtr ctxt; + xmlParserCtxtPyCtxtPtr pyCtxt; PyObject *pyobj_ctxt; PyObject *pyobj_f; PyObject *pyobj_arg; @@ -1452,11 +1458,25 @@ libxml_xmlSetParserCtxtWarningHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject if (!PyArg_ParseTuple(args, (char *)"OOO:xmlSetParserCtxtWarningHandler", &pyobj_ctxt, &pyobj_f, &pyobj_arg)) return(NULL); ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt); + if (ctxt->_private == NULL) { + pyCtxt = xmlMalloc(sizeof(xmlParserCtxtPyCtxt)); + if (pyCtxt == NULL) { + py_retval = libxml_intWrap(-1); + return(py_retval); + } + memset(pyCtxt,0,sizeof(xmlParserCtxtPyCtxt)); + ctxt->_private = pyCtxt; + } + else { + pyCtxt = ctxt->_private; + } /* TODO: check f is a function ! */ + Py_XDECREF(pyCtxt->warningFunc); Py_XINCREF(pyobj_f); - ((xmlParserCtxtPyCtxt *)ctxt->_private)->warningFunc = pyobj_f; + pyCtxt->warningFunc = pyobj_f; + Py_XDECREF(pyCtxt->warningFuncArg); Py_XINCREF(pyobj_arg); - ((xmlParserCtxtPyCtxt *)ctxt->_private)->warningFuncArg = pyobj_arg; + pyCtxt->warningFuncArg = pyobj_arg; ctxt->sax->warning = libxml_xmlParserCtxtWarningFuncHandler; ctxt->vctxt.warning = libxml_xmlParserCtxtWarningFuncHandler;