From scoder at codespeak.net Sun Dec 2 11:32:01 2007 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 2 Dec 2007 11:32:01 +0100 (CET) Subject: [Lxml-checkins] r49263 - lxml/trunk Message-ID: <20071202103201.7407F813C@code0.codespeak.net> Author: scoder Date: Sun Dec 2 11:32:00 2007 New Revision: 49263 Modified: lxml/trunk/TODO.txt Log: cleanup Modified: lxml/trunk/TODO.txt ============================================================================== --- lxml/trunk/TODO.txt (original) +++ lxml/trunk/TODO.txt Sun Dec 2 11:32:00 2007 @@ -22,12 +22,6 @@ e.g. missing namespace mappings in XPath -ElementTree ------------ - -* _setroot(), even though this is not strictly a public method. - - QName ----- From scoder at codespeak.net Sun Dec 2 11:43:22 2007 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 2 Dec 2007 11:43:22 +0100 (CET) Subject: [Lxml-checkins] r49264 - lxml/trunk/doc Message-ID: <20071202104322.86A5F8142@code0.codespeak.net> Author: scoder Date: Sun Dec 2 11:43:22 2007 New Revision: 49264 Modified: lxml/trunk/doc/performance.txt Log: doc cleanup Modified: lxml/trunk/doc/performance.txt ============================================================================== --- lxml/trunk/doc/performance.txt (original) +++ lxml/trunk/doc/performance.txt Sun Dec 2 11:43:22 2007 @@ -598,7 +598,7 @@ the Python objects, thus trading memory for speed. Just create a cache dictionary and run:: - cache[root] = list(root.getiterator()) + cache[root] = list(root.iter()) after parsing and:: From scoder at codespeak.net Sun Dec 2 13:30:07 2007 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 2 Dec 2007 13:30:07 +0100 (CET) Subject: [Lxml-checkins] r49273 - lxml/trunk/src/lxml Message-ID: <20071202123007.7B6A380C9@code0.codespeak.net> Author: scoder Date: Sun Dec 2 13:30:07 2007 New Revision: 49273 Modified: lxml/trunk/src/lxml/cstd.pxd lxml/trunk/src/lxml/lxml.etree.pyx lxml/trunk/src/lxml/parser.pxi lxml/trunk/src/lxml/python.pxd lxml/trunk/src/lxml/xmlerror.pxi lxml/trunk/src/lxml/xpath.pxi lxml/trunk/src/lxml/xslt.pxi Log: use 'with gil/nogil' where appropriate instead of acuiring/releasing the GIL by hand Modified: lxml/trunk/src/lxml/cstd.pxd ============================================================================== --- lxml/trunk/src/lxml/cstd.pxd (original) +++ lxml/trunk/src/lxml/cstd.pxd Sun Dec 2 13:30:07 2007 @@ -15,6 +15,10 @@ cdef void* memcpy(void* dest, void* src, size_t len) cdef void* memset(void* s, int c, size_t len) +cdef extern from "stdlib.h": + cdef void* malloc(size_t size) + cdef void free(void* ptr) + cdef extern from "stdarg.h": ctypedef void *va_list void va_start(va_list ap, void *last) Modified: lxml/trunk/src/lxml/lxml.etree.pyx ============================================================================== --- lxml/trunk/src/lxml/lxml.etree.pyx (original) +++ lxml/trunk/src/lxml/lxml.etree.pyx Sun Dec 2 13:30:07 2007 @@ -1181,7 +1181,6 @@ cdef _Element NEW_ELEMENT "PY_NEW" (object t) cdef _Element _elementFactory(_Document doc, xmlNode* c_node): - cdef python.PyThreadState* state cdef _Element result result = getProxy(c_node) if result is not None: @@ -1190,9 +1189,9 @@ return None if config.ENABLE_THREADING: - state = python.PyEval_SaveThread() - python.PyThread_acquire_lock(ELEMENT_CREATION_LOCK, python.WAIT_LOCK) - python.PyEval_RestoreThread(state) + with nogil: + python.PyThread_acquire_lock( + ELEMENT_CREATION_LOCK, python.WAIT_LOCK) result = getProxy(c_node) if result is not None: python.PyThread_release_lock(ELEMENT_CREATION_LOCK) Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Sun Dec 2 13:30:07 2007 @@ -409,13 +409,11 @@ xmlparser.xmlClearParserCtxt(self._c_ctxt) cdef int prepare(self) except -1: - cdef python.PyThreadState* state cdef int result if config.ENABLE_THREADING and self._lock is not NULL: - state = python.PyEval_SaveThread() - result = python.PyThread_acquire_lock( - self._lock, python.WAIT_LOCK) - python.PyEval_RestoreThread(state) + with nogil: + result = python.PyThread_acquire_lock( + self._lock, python.WAIT_LOCK) if result == 0: raise ParserError, "parser locking failed" self._error_log.connect() Modified: lxml/trunk/src/lxml/python.pxd ============================================================================== --- lxml/trunk/src/lxml/python.pxd (original) +++ lxml/trunk/src/lxml/python.pxd Sun Dec 2 13:30:07 2007 @@ -95,12 +95,6 @@ cdef object PyErr_NoMemory() cdef object PyErr_SetFromErrno(object type) - ctypedef enum PyGILState_STATE: - PyGILState_LOCKED - PyGILState_UNLOCKED - - cdef PyGILState_STATE PyGILState_Ensure() - cdef void PyGILState_Release(PyGILState_STATE state) cdef PyThreadState* PyEval_SaveThread() cdef void PyEval_RestoreThread(PyThreadState* state) cdef PyObject* PyThreadState_GetDict() @@ -109,7 +103,7 @@ ctypedef void* PyThread_type_lock cdef PyThread_type_lock PyThread_allocate_lock() cdef void PyThread_free_lock(PyThread_type_lock lock) - cdef int PyThread_acquire_lock(PyThread_type_lock lock, int mode) + cdef int PyThread_acquire_lock(PyThread_type_lock lock, int mode) nogil cdef void PyThread_release_lock(PyThread_type_lock lock) cdef long PyThread_get_thread_ident() Modified: lxml/trunk/src/lxml/xmlerror.pxi ============================================================================== --- lxml/trunk/src/lxml/xmlerror.pxi (original) +++ lxml/trunk/src/lxml/xmlerror.pxi Sun Dec 2 13:30:07 2007 @@ -370,7 +370,7 @@ # local log functions: forward error to logger object -cdef void _forwardError(void* c_log_handler, xmlerror.xmlError* error): +cdef void _forwardError(void* c_log_handler, xmlerror.xmlError* error) with gil: cdef _BaseErrorLog log_handler if c_log_handler is not NULL: log_handler = <_BaseErrorLog>c_log_handler @@ -378,19 +378,15 @@ log_handler = __GLOBAL_ERROR_LOG log_handler._receive(error) -cdef void _receiveError(void* c_log_handler, xmlerror.xmlError* error): +cdef void _receiveError(void* c_log_handler, xmlerror.xmlError* error) nogil: # no Python objects here, may be called without thread context ! # when we declare a Python object, Pyrex will INCREF(None) ! - cdef python.PyGILState_STATE gil_state if __DEBUG != 0: - gil_state = python.PyGILState_Ensure() _forwardError(c_log_handler, error) - python.PyGILState_Release(gil_state) -cdef void _receiveXSLTError(void* c_log_handler, char* msg, ...): +cdef void _receiveXSLTError(void* c_log_handler, char* msg, ...) nogil: # no Python objects here, may be called without thread context ! # when we declare a Python object, Pyrex will INCREF(None) ! - cdef python.PyGILState_STATE gil_state cdef xmlerror.xmlError c_error cdef cstd.va_list args cdef char* c_text @@ -422,7 +418,6 @@ c_element = NULL cstd.va_end(args) - gil_state = python.PyGILState_Ensure() c_message = NULL if c_text is NULL: c_error.message = '' @@ -431,7 +426,7 @@ else: text_size = cstd.strlen(c_text) element_size = cstd.strlen(c_element) - c_message = python.PyMem_Malloc( + c_message = cstd.malloc( (text_size + 12 + element_size + 1) * sizeof(char)) cstd.sprintf(c_message, "%s, element '%s'", c_text, c_element) c_error.message = c_message @@ -444,8 +439,7 @@ _forwardError(c_log_handler, &c_error) if c_message is not NULL: - python.PyMem_Free(c_error.message) - python.PyGILState_Release(gil_state) + cstd.free(c_error.message) ################################################################################ Modified: lxml/trunk/src/lxml/xpath.pxi ============================================================================== --- lxml/trunk/src/lxml/xpath.pxi (original) +++ lxml/trunk/src/lxml/xpath.pxi Sun Dec 2 13:30:07 2007 @@ -148,13 +148,11 @@ return c == c'/' cdef int _lock(self) except -1: - cdef python.PyThreadState* state cdef int result if config.ENABLE_THREADING and self._eval_lock != NULL: - state = python.PyEval_SaveThread() - result = python.PyThread_acquire_lock( - self._eval_lock, python.WAIT_LOCK) - python.PyEval_RestoreThread(state) + with nogil: + result = python.PyThread_acquire_lock( + self._eval_lock, python.WAIT_LOCK) if result == 0: raise ParserError, "parser locking failed" return 0 Modified: lxml/trunk/src/lxml/xslt.pxi ============================================================================== --- lxml/trunk/src/lxml/xslt.pxi (original) +++ lxml/trunk/src/lxml/xslt.pxi Sun Dec 2 13:30:07 2007 @@ -64,16 +64,8 @@ context._parser = parser context._c_style_doc = NULL -cdef xmlDoc* _xslt_resolve_stylesheet(char* c_uri, void* context): - cdef xmlDoc* c_doc - c_doc = (<_XSLTResolverContext>context)._c_style_doc - if c_doc is not NULL and c_doc.URL is not NULL: - if cstd.strcmp(c_uri, c_doc.URL) == 0: - return _copyDoc(c_doc, 1) - return NULL - cdef xmlDoc* _xslt_resolve_from_python(char* c_uri, void* c_context, - int parse_options, int* error): + int parse_options, int* error) with gil: # call the Python document loaders cdef _XSLTResolverContext context cdef _ResolverRegistry resolvers @@ -82,6 +74,14 @@ error[0] = 0 context = <_XSLTResolverContext>c_context + + # shortcut if we resolve the stylesheet itself + c_doc = context._c_style_doc + if c_doc is not NULL and c_doc.URL is not NULL: + if cstd.strcmp(c_uri, c_doc.URL) == 0: + return _copyDoc(c_doc, 1) + + # delegate to the Python resolvers try: resolvers = context._resolvers if cstd.strncmp('string://', c_uri, 9) == 0: @@ -115,7 +115,7 @@ return NULL cdef void _xslt_store_resolver_exception(char* c_uri, void* context, - xslt.xsltLoadType c_type): + xslt.xsltLoadType c_type) with gil: message = "Cannot resolve URI %s" % c_uri if c_type == xslt.XSLT_LOAD_DOCUMENT: exception = XSLTApplyError(message) @@ -125,14 +125,13 @@ cdef xmlDoc* _xslt_doc_loader(char* c_uri, tree.xmlDict* c_dict, int parse_options, void* c_ctxt, - xslt.xsltLoadType c_type): + xslt.xsltLoadType c_type) nogil: # no Python objects here, may be called without thread context ! # when we declare a Python object, Pyrex will INCREF(None) ! cdef xmlDoc* c_doc cdef xmlDoc* result cdef void* c_pcontext cdef int error - cdef python.PyGILState_STATE gil_state # find resolver contexts of stylesheet and transformed doc if c_type == xslt.XSLT_LOAD_DOCUMENT: # transformation time @@ -148,14 +147,6 @@ return XSLT_DOC_DEFAULT_LOADER( c_uri, c_dict, parse_options, c_ctxt, c_type) - gil_state = python.PyGILState_Ensure() - c_doc = _xslt_resolve_stylesheet(c_uri, c_pcontext) - if c_doc is not NULL: - python.PyGILState_Release(gil_state) - if c_type == xslt.XSLT_LOAD_STYLESHEET: - c_doc._private = c_pcontext - return c_doc - c_doc = _xslt_resolve_from_python(c_uri, c_pcontext, parse_options, &error) if c_doc is NULL and not error: c_doc = XSLT_DOC_DEFAULT_LOADER( @@ -163,7 +154,6 @@ if c_doc is NULL: _xslt_store_resolver_exception(c_uri, c_pcontext, c_type) - python.PyGILState_Release(gil_state) if c_doc is not NULL and c_type == xslt.XSLT_LOAD_STYLESHEET: c_doc._private = c_pcontext return c_doc From scoder at codespeak.net Sun Dec 2 14:45:02 2007 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 2 Dec 2007 14:45:02 +0100 (CET) Subject: [Lxml-checkins] r49277 - lxml/trunk/src/lxml Message-ID: <20071202134502.A4F278169@code0.codespeak.net> Author: scoder Date: Sun Dec 2 14:45:01 2007 New Revision: 49277 Modified: lxml/trunk/src/lxml/c14n.pxd lxml/trunk/src/lxml/cstd.pxd lxml/trunk/src/lxml/dtd.pxi lxml/trunk/src/lxml/dtdvalid.pxd lxml/trunk/src/lxml/etreepublic.pxd lxml/trunk/src/lxml/htmlparser.pxd lxml/trunk/src/lxml/lxml.etree.pyx lxml/trunk/src/lxml/parser.pxi lxml/trunk/src/lxml/relaxng.pxd lxml/trunk/src/lxml/relaxng.pxi lxml/trunk/src/lxml/schematron.pxd lxml/trunk/src/lxml/schematron.pxi lxml/trunk/src/lxml/serializer.pxi lxml/trunk/src/lxml/tree.pxd lxml/trunk/src/lxml/xinclude.pxd lxml/trunk/src/lxml/xmlerror.pxd lxml/trunk/src/lxml/xmlparser.pxd lxml/trunk/src/lxml/xmlschema.pxd lxml/trunk/src/lxml/xmlschema.pxi lxml/trunk/src/lxml/xpath.pxd lxml/trunk/src/lxml/xpath.pxi lxml/trunk/src/lxml/xslt.pxd lxml/trunk/src/lxml/xslt.pxi Log: use 'with gil/nogil' where appropriate instead of acquiring/releasing the GIL by hand Modified: lxml/trunk/src/lxml/c14n.pxd ============================================================================== --- lxml/trunk/src/lxml/c14n.pxd (original) +++ lxml/trunk/src/lxml/c14n.pxd Sun Dec 2 14:45:01 2007 @@ -7,7 +7,7 @@ int exclusive, char** inclusive_ns_prefixes, int with_comments, - char** doc_txt_ptr) + char** doc_txt_ptr) nogil cdef int xmlC14NDocSave(xmlDoc* doc, xmlNodeSet* nodes, @@ -15,12 +15,12 @@ char** inclusive_ns_prefixes, int with_comments, char* filename, - int compression) + int compression) nogil cdef int xmlC14NDocSaveTo(xmlDoc* doc, xmlNodeSet* nodes, int exclusive, char** inclusive_ns_prefixes, int with_comments, - xmlOutputBuffer* buffer) - + xmlOutputBuffer* buffer) nogil + Modified: lxml/trunk/src/lxml/cstd.pxd ============================================================================== --- lxml/trunk/src/lxml/cstd.pxd (original) +++ lxml/trunk/src/lxml/cstd.pxd Sun Dec 2 14:45:01 2007 @@ -1,29 +1,29 @@ cdef extern from "stdio.h": ctypedef struct FILE - cdef int sprintf(char* str, char* format, ...) - cdef int printf(char* str) + cdef int sprintf(char* str, char* format, ...) nogil + cdef int printf(char* str) nogil cdef extern from "string.h": ctypedef int size_t - cdef int strlen(char* s) - cdef char* strstr(char* haystack, char* needle) - cdef char* strchr(char* haystack, int needle) - cdef char* strrchr(char* haystack, int needle) - cdef int strcmp(char* s1, char* s2) - cdef int strncmp(char* s1, char* s2, size_t len) - cdef void* memcpy(void* dest, void* src, size_t len) - cdef void* memset(void* s, int c, size_t len) + cdef int strlen(char* s) nogil + cdef char* strstr(char* haystack, char* needle) nogil + cdef char* strchr(char* haystack, int needle) nogil + cdef char* strrchr(char* haystack, int needle) nogil + cdef int strcmp(char* s1, char* s2) nogil + cdef int strncmp(char* s1, char* s2, size_t len) nogil + cdef void* memcpy(void* dest, void* src, size_t len) nogil + cdef void* memset(void* s, int c, size_t len) nogil cdef extern from "stdlib.h": - cdef void* malloc(size_t size) - cdef void free(void* ptr) + cdef void* malloc(size_t size) nogil + cdef void free(void* ptr) nogil cdef extern from "stdarg.h": ctypedef void *va_list - void va_start(va_list ap, void *last) - void va_end(va_list ap) + void va_start(va_list ap, void *last) nogil + void va_end(va_list ap) nogil cdef extern from "etree_defs.h": - cdef int va_int(va_list ap) - cdef char *va_charptr(va_list ap) + cdef int va_int(va_list ap) nogil + cdef char *va_charptr(va_list ap) nogil Modified: lxml/trunk/src/lxml/dtd.pxi ============================================================================== --- lxml/trunk/src/lxml/dtd.pxi (original) +++ lxml/trunk/src/lxml/dtd.pxi Sun Dec 2 14:45:01 2007 @@ -53,7 +53,6 @@ Returns true if the document is valid, false if not. """ - cdef python.PyThreadState* state cdef _Document doc cdef _Element root_node cdef xmlDoc* c_doc @@ -70,9 +69,8 @@ raise DTDError, "Failed to create validation context" c_doc = _fakeRootDoc(doc._c_doc, root_node._c_node) - state = python.PyEval_SaveThread() - ret = dtdvalid.xmlValidateDtd(valid_ctxt, c_doc, self._c_dtd) - python.PyEval_RestoreThread(state) + with nogil: + ret = dtdvalid.xmlValidateDtd(valid_ctxt, c_doc, self._c_dtd) _destroyFakeDoc(doc._c_doc, c_doc) dtdvalid.xmlFreeValidCtxt(valid_ctxt) Modified: lxml/trunk/src/lxml/dtdvalid.pxd ============================================================================== --- lxml/trunk/src/lxml/dtdvalid.pxd (original) +++ lxml/trunk/src/lxml/dtdvalid.pxd Sun Dec 2 14:45:01 2007 @@ -4,7 +4,7 @@ cdef extern from "libxml/valid.h": ctypedef struct xmlValidCtxt - cdef xmlValidCtxt* xmlNewValidCtxt() - cdef void xmlFreeValidCtxt(xmlValidCtxt* cur) + cdef xmlValidCtxt* xmlNewValidCtxt() nogil + cdef void xmlFreeValidCtxt(xmlValidCtxt* cur) nogil - cdef int xmlValidateDtd(xmlValidCtxt* ctxt, xmlDoc* doc, xmlDtd* dtd) + cdef int xmlValidateDtd(xmlValidCtxt* ctxt, xmlDoc* doc, xmlDtd* dtd) nogil Modified: lxml/trunk/src/lxml/etreepublic.pxd ============================================================================== --- lxml/trunk/src/lxml/etreepublic.pxd (original) +++ lxml/trunk/src/lxml/etreepublic.pxd Sun Dec 2 14:45:01 2007 @@ -5,16 +5,16 @@ cdef extern from "etree_defs.h": # test if c_node is considered an Element (i.e. Element, Comment, etc.) - cdef bint _isElement(tree.xmlNode* c_node) + cdef bint _isElement(tree.xmlNode* c_node) nogil # return the namespace URI of the node or NULL - cdef char* _getNs(tree.xmlNode* node) + cdef char* _getNs(tree.xmlNode* node) nogil # pair of macros for tree traversal cdef void BEGIN_FOR_EACH_ELEMENT_FROM(tree.xmlNode* tree_top, tree.xmlNode* start_node, - int start_node_inclusive) - cdef void END_FOR_EACH_ELEMENT_FROM(tree.xmlNode* start_node) + int start_node_inclusive) nogil + cdef void END_FOR_EACH_ELEMENT_FROM(tree.xmlNode* start_node) nogil cdef extern from "lxml.etree_api.h": @@ -129,23 +129,23 @@ # XML node helper functions # check if the element has at least one child - cdef bint hasChild(tree.xmlNode* c_node) + cdef bint hasChild(tree.xmlNode* c_node) nogil # find child element number 'index' (supports negative indexes) cdef tree.xmlNode* findChild(tree.xmlNode* c_node, - Py_ssize_t index) + Py_ssize_t index) nogil # find child element number 'index' starting at first one cdef tree.xmlNode* findChildForwards(tree.xmlNode* c_node, - Py_ssize_t index) + Py_ssize_t index) nogil # find child element number 'index' starting at last one cdef tree.xmlNode* findChildBackwards(tree.xmlNode* c_node, - Py_ssize_t index) + Py_ssize_t index) nogil # return next/previous sibling element of the node - cdef tree.xmlNode* nextElement(tree.xmlNode* c_node) - cdef tree.xmlNode* previousElement(tree.xmlNode* c_node) + cdef tree.xmlNode* nextElement(tree.xmlNode* c_node) nogil + cdef tree.xmlNode* previousElement(tree.xmlNode* c_node) nogil ########################################################################## # iterators @@ -191,10 +191,10 @@ cdef object namespacedNameFromNsName(char* c_ns, char* c_tag) # check if the node has a text value (which may be '') - cdef bint hasText(tree.xmlNode* c_node) + cdef bint hasText(tree.xmlNode* c_node) nogil # check if the node has a tail value (which may be '') - cdef bint hasTail(tree.xmlNode* c_node) + cdef bint hasTail(tree.xmlNode* c_node) nogil # get the text content of an element (or None) cdef object textOf(tree.xmlNode* c_node) Modified: lxml/trunk/src/lxml/htmlparser.pxd ============================================================================== --- lxml/trunk/src/lxml/htmlparser.pxd (original) +++ lxml/trunk/src/lxml/htmlparser.pxd Sun Dec 2 14:45:01 2007 @@ -14,30 +14,34 @@ HTML_PARSE_RECOVER # Relaxed parsing HTML_PARSE_COMPACT # compact small text nodes - cdef xmlParserCtxt* htmlCreateMemoryParserCtxt(char* buffer, int size) - cdef xmlParserCtxt* htmlCreateFileParserCtxt(char* filename, char* encoding) + cdef xmlParserCtxt* htmlCreateMemoryParserCtxt( + char* buffer, int size) nogil + cdef xmlParserCtxt* htmlCreateFileParserCtxt( + char* filename, char* encoding) nogil cdef xmlParserCtxt* htmlCreatePushParserCtxt(xmlSAXHandler* sax, void* user_data, char* chunk, int size, - char* filename, int enc) - cdef void htmlFreeParserCtxt(xmlParserCtxt* ctxt) - cdef void htmlCtxtReset(xmlParserCtxt* ctxt) - cdef int htmlCtxtUseOptions(xmlParserCtxt* ctxt, int options) - cdef int htmlParseDocument(xmlParserCtxt* ctxt) + char* filename, int enc) nogil + cdef void htmlFreeParserCtxt(xmlParserCtxt* ctxt) nogil + cdef void htmlCtxtReset(xmlParserCtxt* ctxt) nogil + cdef int htmlCtxtUseOptions(xmlParserCtxt* ctxt, int options) nogil + cdef int htmlParseDocument(xmlParserCtxt* ctxt) nogil cdef int htmlParseChunk(xmlParserCtxt* ctxt, - char* chunk, int size, int terminate) + char* chunk, int size, int terminate) nogil cdef xmlDoc* htmlCtxtReadFile(xmlParserCtxt* ctxt, char* filename, char* encoding, - int options) + int options) nogil cdef xmlDoc* htmlCtxtReadDoc(xmlParserCtxt* ctxt, char* buffer, char* URL, char* encoding, - int options) + int options) nogil cdef xmlDoc* htmlCtxtReadIO(xmlParserCtxt* ctxt, xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, void* ioctx, - char* URL, char* encoding, int options) + char* URL, char* encoding, + int options) nogil cdef xmlDoc* htmlCtxtReadMemory(xmlParserCtxt* ctxt, char* buffer, int size, - char* filename, char* encoding, int options) + char* filename, char* encoding, + int options) nogil Modified: lxml/trunk/src/lxml/lxml.etree.pyx ============================================================================== --- lxml/trunk/src/lxml/lxml.etree.pyx (original) +++ lxml/trunk/src/lxml/lxml.etree.pyx Sun Dec 2 14:45:01 2007 @@ -1588,8 +1588,8 @@ Note that XInclude does not support custom resolvers in Python space due to restrictions of libxml2 <= 2.6.29. """ - cdef python.PyThreadState* state cdef int result + self._assertHasRoot() # We cannot pass the XML_PARSE_NOXINCNODE option as this would free # the XInclude nodes - there may still be Python references to them! # Therefore, we allow XInclude nodes to be converted to @@ -1597,16 +1597,14 @@ # siblings. Tree traversal will simply ignore them as they are not # typed as elements. The included fragment is added between the two, # i.e. as a sibling, which does not conflict with traversal. - self._assertHasRoot() - state = python.PyEval_SaveThread() - if self._context_node._doc._parser is not None: - result = xinclude.xmlXIncludeProcessTreeFlags( - self._context_node._c_node, - self._context_node._doc._parser._parse_options) - else: - result = xinclude.xmlXIncludeProcessTree( - self._context_node._c_node) - python.PyEval_RestoreThread(state) + with nogil: + if self._context_node._doc._parser is not None: + result = xinclude.xmlXIncludeProcessTreeFlags( + self._context_node._c_node, + self._context_node._doc._parser._parse_options) + else: + result = xinclude.xmlXIncludeProcessTree( + self._context_node._c_node) if result == -1: raise XIncludeError, "XInclude processing failed" Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Sun Dec 2 14:45:01 2007 @@ -228,7 +228,6 @@ return xmlparser.xmlNewIOInputStream(ctxt, c_buffer, 0) cdef xmlDoc* _readDoc(self, xmlparser.xmlParserCtxt* ctxt, int options): - cdef python.PyThreadState* state cdef xmlDoc* result cdef char* c_encoding @@ -237,29 +236,24 @@ else: c_encoding = _cstr(self._encoding) - state = python.PyEval_SaveThread() - if ctxt.html: - result = htmlparser.htmlCtxtReadIO( - ctxt, _readFilelikeParser, NULL, self, - self._c_url, c_encoding, options) - else: - result = xmlparser.xmlCtxtReadIO( - ctxt, _readFilelikeParser, NULL, self, - self._c_url, c_encoding, options) - python.PyEval_RestoreThread(state) + with nogil: + if ctxt.html: + result = htmlparser.htmlCtxtReadIO( + ctxt, _readFilelikeParser, NULL, self, + self._c_url, c_encoding, options) + else: + result = xmlparser.xmlCtxtReadIO( + ctxt, _readFilelikeParser, NULL, self, + self._c_url, c_encoding, options) return result cdef tree.xmlDtd* _readDtd(self): - cdef python.PyThreadState* state - cdef tree.xmlDtd* result cdef xmlparser.xmlParserInputBuffer* c_buffer c_buffer = xmlparser.xmlAllocParserInputBuffer(0) c_buffer.context = self c_buffer.readcallback = _readFilelikeParser - state = python.PyEval_SaveThread() - result = xmlparser.xmlIOParseDTD(NULL, c_buffer, 0) - python.PyEval_RestoreThread(state) - return result + with nogil: + return xmlparser.xmlIOParseDTD(NULL, c_buffer, 0) cdef int copyToBuffer(self, char* c_buffer, int c_size): cdef char* c_start @@ -699,7 +693,6 @@ """Parse unicode document, share dictionary if possible. """ cdef _ParserContext context - cdef python.PyThreadState* state cdef xmlDoc* result cdef xmlparser.xmlParserCtxt* pctxt cdef Py_ssize_t py_buffer_len @@ -719,16 +712,15 @@ __GLOBAL_PARSER_CONTEXT.initParserDict(pctxt) c_text = python.PyUnicode_AS_DATA(utext) - state = python.PyEval_SaveThread() - if self._for_html: - result = htmlparser.htmlCtxtReadMemory( - pctxt, c_text, buffer_len, c_filename, _UNICODE_ENCODING, - self._parse_options) - else: - result = xmlparser.xmlCtxtReadMemory( - pctxt, c_text, buffer_len, c_filename, _UNICODE_ENCODING, - self._parse_options) - python.PyEval_RestoreThread(state) + with nogil: + if self._for_html: + result = htmlparser.htmlCtxtReadMemory( + pctxt, c_text, buffer_len, c_filename, _UNICODE_ENCODING, + self._parse_options) + else: + result = xmlparser.xmlCtxtReadMemory( + pctxt, c_text, buffer_len, c_filename, _UNICODE_ENCODING, + self._parse_options) return context._handleParseResultDoc(self, result, None) finally: @@ -739,7 +731,6 @@ """Parse document, share dictionary if possible. """ cdef _ParserContext context - cdef python.PyThreadState* state cdef xmlDoc* result cdef xmlparser.xmlParserCtxt* pctxt cdef char* c_encoding @@ -757,16 +748,15 @@ else: c_encoding = _cstr(self._default_encoding) - state = python.PyEval_SaveThread() - if self._for_html: - result = htmlparser.htmlCtxtReadMemory( - pctxt, c_text, c_len, c_filename, - c_encoding, self._parse_options) - else: - result = xmlparser.xmlCtxtReadMemory( - pctxt, c_text, c_len, c_filename, - c_encoding, self._parse_options) - python.PyEval_RestoreThread(state) + with nogil: + if self._for_html: + result = htmlparser.htmlCtxtReadMemory( + pctxt, c_text, c_len, c_filename, + c_encoding, self._parse_options) + else: + result = xmlparser.xmlCtxtReadMemory( + pctxt, c_text, c_len, c_filename, + c_encoding, self._parse_options) return context._handleParseResultDoc(self, result, None) finally: @@ -774,7 +764,6 @@ cdef xmlDoc* _parseDocFromFile(self, char* c_filename) except NULL: cdef _ParserContext context - cdef python.PyThreadState* state cdef xmlDoc* result cdef xmlparser.xmlParserCtxt* pctxt cdef int orig_options @@ -793,14 +782,13 @@ c_encoding = _cstr(self._default_encoding) orig_options = pctxt.options - state = python.PyEval_SaveThread() - if self._for_html: - result = htmlparser.htmlCtxtReadFile( - pctxt, c_filename, c_encoding, self._parse_options) - else: - result = xmlparser.xmlCtxtReadFile( - pctxt, c_filename, c_encoding, self._parse_options) - python.PyEval_RestoreThread(state) + with nogil: + if self._for_html: + result = htmlparser.htmlCtxtReadFile( + pctxt, c_filename, c_encoding, self._parse_options) + else: + result = xmlparser.xmlCtxtReadFile( + pctxt, c_filename, c_encoding, self._parse_options) pctxt.options = orig_options # work around libxml2 problem return context._handleParseResultDoc(self, result, c_filename) @@ -1630,13 +1618,12 @@ return result cdef xmlDoc* _copyDoc(xmlDoc* c_doc, int recursive) except NULL: - cdef python.PyThreadState* state cdef xmlDoc* result if recursive: - state = python.PyEval_SaveThread() - result = tree.xmlCopyDoc(c_doc, recursive) - if recursive: - python.PyEval_RestoreThread(state) + with nogil: + result = tree.xmlCopyDoc(c_doc, recursive) + else: + result = tree.xmlCopyDoc(c_doc, 0) if result is NULL: python.PyErr_NoMemory() __GLOBAL_PARSER_CONTEXT.initDocDict(result) @@ -1644,14 +1631,12 @@ cdef xmlDoc* _copyDocRoot(xmlDoc* c_doc, xmlNode* c_new_root) except NULL: "Recursively copy the document and make c_new_root the new root node." - cdef python.PyThreadState* state cdef xmlDoc* result cdef xmlNode* c_node result = tree.xmlCopyDoc(c_doc, 0) # non recursive __GLOBAL_PARSER_CONTEXT.initDocDict(result) - state = python.PyEval_SaveThread() - c_node = tree.xmlDocCopyNode(c_new_root, result, 1) # recursive - python.PyEval_RestoreThread(state) + with nogil: + c_node = tree.xmlDocCopyNode(c_new_root, result, 1) # recursive if c_node is NULL: python.PyErr_NoMemory() tree.xmlDocSetRootElement(result, c_node) Modified: lxml/trunk/src/lxml/relaxng.pxd ============================================================================== --- lxml/trunk/src/lxml/relaxng.pxd (original) +++ lxml/trunk/src/lxml/relaxng.pxd Sun Dec 2 14:45:01 2007 @@ -49,12 +49,11 @@ XML_RELAXNG_ERR_ELEMWRONG = 38 XML_RELAXNG_ERR_TEXTWRONG = 39 - cdef xmlRelaxNGValidCtxt* xmlRelaxNGNewValidCtxt(xmlRelaxNG* schema) - cdef int xmlRelaxNGValidateDoc(xmlRelaxNGValidCtxt* ctxt, xmlDoc* doc) - cdef xmlRelaxNG* xmlRelaxNGParse(xmlRelaxNGParserCtxt* ctxt) - cdef xmlRelaxNGParserCtxt* xmlRelaxNGNewParserCtxt(char* URL) - cdef xmlRelaxNGParserCtxt* xmlRelaxNGNewDocParserCtxt(xmlDoc* doc) - cdef void xmlRelaxNGFree(xmlRelaxNG* schema) - cdef void xmlRelaxNGFreeParserCtxt(xmlRelaxNGParserCtxt* ctxt) - cdef void xmlRelaxNGFreeValidCtxt(xmlRelaxNGValidCtxt* ctxt) - + cdef xmlRelaxNGValidCtxt* xmlRelaxNGNewValidCtxt(xmlRelaxNG* schema) nogil + cdef int xmlRelaxNGValidateDoc(xmlRelaxNGValidCtxt* ctxt, xmlDoc* doc) nogil + cdef xmlRelaxNG* xmlRelaxNGParse(xmlRelaxNGParserCtxt* ctxt) nogil + cdef xmlRelaxNGParserCtxt* xmlRelaxNGNewParserCtxt(char* URL) nogil + cdef xmlRelaxNGParserCtxt* xmlRelaxNGNewDocParserCtxt(xmlDoc* doc) nogil + cdef void xmlRelaxNGFree(xmlRelaxNG* schema) nogil + cdef void xmlRelaxNGFreeParserCtxt(xmlRelaxNGParserCtxt* ctxt) nogil + cdef void xmlRelaxNGFreeValidCtxt(xmlRelaxNGValidCtxt* ctxt) nogil Modified: lxml/trunk/src/lxml/relaxng.pxi ============================================================================== --- lxml/trunk/src/lxml/relaxng.pxi (original) +++ lxml/trunk/src/lxml/relaxng.pxi Sun Dec 2 14:45:01 2007 @@ -86,7 +86,6 @@ """Validate doc using Relax NG. Returns true if document is valid, false if not.""" - cdef python.PyThreadState* state cdef _Document doc cdef _Element root_node cdef xmlDoc* c_doc @@ -103,9 +102,8 @@ python.PyErr_NoMemory() c_doc = _fakeRootDoc(doc._c_doc, root_node._c_node) - state = python.PyEval_SaveThread() - ret = relaxng.xmlRelaxNGValidateDoc(valid_ctxt, c_doc) - python.PyEval_RestoreThread(state) + with nogil: + ret = relaxng.xmlRelaxNGValidateDoc(valid_ctxt, c_doc) _destroyFakeDoc(doc._c_doc, c_doc) relaxng.xmlRelaxNGFreeValidCtxt(valid_ctxt) Modified: lxml/trunk/src/lxml/schematron.pxd ============================================================================== --- lxml/trunk/src/lxml/schematron.pxd (original) +++ lxml/trunk/src/lxml/schematron.pxd Sun Dec 2 14:45:01 2007 @@ -14,15 +14,17 @@ XML_SCHEMATRON_OUT_BUFFER = 512 # output to a buffer XML_SCHEMATRON_OUT_IO = 1024 # output to I/O mechanism - cdef xmlSchematronParserCtxt* xmlSchematronNewDocParserCtxt(xmlDoc* doc) - cdef xmlSchematronParserCtxt* xmlSchematronNewParserCtxt(char* filename) - cdef xmlSchematronValidCtxt* xmlSchematronNewValidCtxt(xmlSchematron* schema, - int options) + cdef xmlSchematronParserCtxt* xmlSchematronNewDocParserCtxt( + xmlDoc* doc) nogil + cdef xmlSchematronParserCtxt* xmlSchematronNewParserCtxt( + char* filename) nogil + cdef xmlSchematronValidCtxt* xmlSchematronNewValidCtxt( + xmlSchematron* schema, int options) nogil - cdef xmlSchematron* xmlSchematronParse(xmlSchematronParserCtxt* ctxt) + cdef xmlSchematron* xmlSchematronParse(xmlSchematronParserCtxt* ctxt) nogil cdef int xmlSchematronValidateDoc(xmlSchematronValidCtxt* ctxt, - xmlDoc* instance) + xmlDoc* instance) nogil - cdef void xmlSchematronFreeParserCtxt(xmlSchematronParserCtxt* ctxt) - cdef void xmlSchematronFreeValidCtxt(xmlSchematronValidCtxt* ctxt) - cdef void xmlSchematronFree(xmlSchematron* schema) + cdef void xmlSchematronFreeParserCtxt(xmlSchematronParserCtxt* ctxt) nogil + cdef void xmlSchematronFreeValidCtxt(xmlSchematronValidCtxt* ctxt) nogil + cdef void xmlSchematronFree(xmlSchematron* schema) nogil Modified: lxml/trunk/src/lxml/schematron.pxi ============================================================================== --- lxml/trunk/src/lxml/schematron.pxi (original) +++ lxml/trunk/src/lxml/schematron.pxi Sun Dec 2 14:45:01 2007 @@ -117,7 +117,6 @@ """Validate doc using Schematron. Returns true if document is valid, false if not.""" - cdef python.PyThreadState* state cdef _Document doc cdef _Element root_node cdef xmlDoc* c_doc @@ -140,9 +139,8 @@ raise SchematronError, "Failed to create validation context" c_doc = _fakeRootDoc(doc._c_doc, root_node._c_node) - state = python.PyEval_SaveThread() - ret = schematron.xmlSchematronValidateDoc(valid_ctxt, c_doc) - python.PyEval_RestoreThread(state) + with nogil: + ret = schematron.xmlSchematronValidateDoc(valid_ctxt, c_doc) _destroyFakeDoc(doc._c_doc, c_doc) schematron.xmlSchematronFreeValidCtxt(valid_ctxt) Modified: lxml/trunk/src/lxml/serializer.pxi ============================================================================== --- lxml/trunk/src/lxml/serializer.pxi (original) +++ lxml/trunk/src/lxml/serializer.pxi Sun Dec 2 14:45:01 2007 @@ -18,11 +18,9 @@ raise ValueError, "unknown output method %r" % method cdef _textToString(xmlNode* c_node, encoding): - cdef python.PyThreadState* state cdef char* c_text - state = python.PyEval_SaveThread() - c_text = tree.xmlNodeGetContent(c_node) - python.PyEval_RestoreThread(state) + with nogil: + c_text = tree.xmlNodeGetContent(c_node) if c_text is NULL: python.PyErr_NoMemory() @@ -49,7 +47,6 @@ """Serialize an element to an encoded string representation of its XML tree. """ - cdef python.PyThreadState* state cdef tree.xmlOutputBuffer* c_buffer cdef tree.xmlBuffer* c_result_buffer cdef tree.xmlCharEncodingHandler* enchandler @@ -77,17 +74,17 @@ tree.xmlCharEncCloseFunc(enchandler) raise LxmlError, "Failed to create output buffer" - try: - state = python.PyEval_SaveThread() + with nogil: _writeNodeToBuffer(c_buffer, element._c_node, c_enc, c_method, write_xml_declaration, write_complete_document, pretty_print) tree.xmlOutputBufferFlush(c_buffer) - python.PyEval_RestoreThread(state) if c_buffer.conv is not NULL: c_result_buffer = c_buffer.conv else: c_result_buffer = c_buffer.buffer + + try: result = python.PyString_FromStringAndSize( tree.xmlBufferContent(c_result_buffer), tree.xmlBufferLength(c_result_buffer)) @@ -100,7 +97,6 @@ """Serialize an element to the Python unicode representation of its XML tree. """ - cdef python.PyThreadState* state cdef tree.xmlOutputBuffer* c_buffer cdef tree.xmlBuffer* c_result_buffer cdef int c_method @@ -113,16 +109,17 @@ c_buffer = tree.xmlAllocOutputBuffer(NULL) if c_buffer is NULL: raise LxmlError, "Failed to create output buffer" - try: - state = python.PyEval_SaveThread() + + with nogil: _writeNodeToBuffer(c_buffer, element._c_node, NULL, c_method, 0, write_complete_document, pretty_print) tree.xmlOutputBufferFlush(c_buffer) - python.PyEval_RestoreThread(state) if c_buffer.conv is not NULL: c_result_buffer = c_buffer.conv else: c_result_buffer = c_buffer.buffer + + try: result = python.PyUnicode_DecodeUTF8( tree.xmlBufferContent(c_result_buffer), tree.xmlBufferLength(c_result_buffer), @@ -135,7 +132,7 @@ xmlNode* c_node, char* encoding, int c_method, bint write_xml_declaration, bint write_complete_document, - bint pretty_print): + bint pretty_print) nogil: cdef xmlDoc* c_doc cdef xmlNode* c_nsdecl_node c_doc = c_node.doc @@ -177,7 +174,7 @@ _writeNextSiblings(c_buffer, c_node, encoding, pretty_print) cdef void _writeDeclarationToBuffer(tree.xmlOutputBuffer* c_buffer, - char* version, char* encoding): + char* version, char* encoding) nogil: if version is NULL: version = "1.0" tree.xmlOutputBufferWriteString(c_buffer, "\n") cdef void _writeDtdToBuffer(tree.xmlOutputBuffer* c_buffer, - xmlDoc* c_doc, char* c_root_name, char* encoding): + xmlDoc* c_doc, char* c_root_name, + char* encoding) nogil: cdef tree.xmlDtd* c_dtd cdef xmlNode* c_node c_dtd = c_doc.intSubset @@ -222,7 +220,7 @@ tree.xmlOutputBufferWrite(c_buffer, 3, "]>\n") cdef void _writeTail(tree.xmlOutputBuffer* c_buffer, xmlNode* c_node, - char* encoding, bint pretty_print): + char* encoding, bint pretty_print) nogil: "Write the element tail." c_node = c_node.next while c_node is not NULL and c_node.type == tree.XML_TEXT_NODE: @@ -231,7 +229,7 @@ c_node = c_node.next cdef void _writePrevSiblings(tree.xmlOutputBuffer* c_buffer, xmlNode* c_node, - char* encoding, bint pretty_print): + char* encoding, bint pretty_print) nogil: cdef xmlNode* c_sibling if c_node.parent is not NULL and _isElement(c_node.parent): return @@ -247,7 +245,7 @@ c_sibling = c_sibling.next cdef void _writeNextSiblings(tree.xmlOutputBuffer* c_buffer, xmlNode* c_node, - char* encoding, bint pretty_print): + char* encoding, bint pretty_print) nogil: cdef xmlNode* c_sibling if c_node.parent is not NULL and _isElement(c_node.parent): return @@ -358,7 +356,6 @@ writer._exc_context._raise_if_stored() cdef _tofilelikeC14N(f, _Element element): - cdef python.PyThreadState* state cdef _FilelikeWriter writer cdef tree.xmlOutputBuffer* c_buffer cdef char* c_filename @@ -372,9 +369,9 @@ if _isString(f): filename8 = _encodeFilename(f) c_filename = _cstr(filename8) - state = python.PyEval_SaveThread() - bytes = c14n.xmlC14NDocSave(c_doc, NULL, 0, NULL, 1, c_filename, 0) - python.PyEval_RestoreThread(state) + with nogil: + bytes = c14n.xmlC14NDocSave(c_doc, NULL, 0, NULL, 1, + c_filename, 0) elif hasattr(f, 'write'): writer = _FilelikeWriter(f) c_buffer = writer._createOutputBuffer(NULL) Modified: lxml/trunk/src/lxml/tree.pxd ============================================================================== --- lxml/trunk/src/lxml/tree.pxd (original) +++ lxml/trunk/src/lxml/tree.pxd Sun Dec 2 14:45:01 2007 @@ -35,21 +35,22 @@ XML_CHAR_ENCODING_ASCII = 22 # pure ASCII ctypedef struct xmlCharEncodingHandler - cdef xmlCharEncodingHandler* xmlFindCharEncodingHandler(char* name) - cdef xmlCharEncodingHandler* xmlGetCharEncodingHandler(xmlCharEncoding enc) - cdef int xmlCharEncCloseFunc(xmlCharEncodingHandler* handler) - cdef xmlCharEncoding xmlDetectCharEncoding(char* text, int len) - cdef char* xmlGetCharEncodingName(xmlCharEncoding enc) - cdef xmlCharEncoding xmlParseCharEncoding(char* name) + cdef xmlCharEncodingHandler* xmlFindCharEncodingHandler(char* name) nogil + cdef xmlCharEncodingHandler* xmlGetCharEncodingHandler( + xmlCharEncoding enc) nogil + cdef int xmlCharEncCloseFunc(xmlCharEncodingHandler* handler) nogil + cdef xmlCharEncoding xmlDetectCharEncoding(char* text, int len) nogil + cdef char* xmlGetCharEncodingName(xmlCharEncoding enc) nogil + cdef xmlCharEncoding xmlParseCharEncoding(char* name) nogil cdef extern from "libxml/chvalid.h": - cdef int xmlIsChar_ch(char c) + cdef int xmlIsChar_ch(char c) nogil cdef extern from "libxml/hash.h": ctypedef struct xmlHashTable - ctypedef void xmlHashScanner(void* payload, void* data, char* name) - void xmlHashScan(xmlHashTable* table, xmlHashScanner f, void* data) - void* xmlHashLookup(xmlHashTable* table, char* name) + ctypedef void xmlHashScanner(void* payload, void* data, char* name) nogil + void xmlHashScan(xmlHashTable* table, xmlHashScanner f, void* data) nogil + void* xmlHashLookup(xmlHashTable* table, char* name) nogil cdef extern from "libxml/tree.h": @@ -167,106 +168,112 @@ xmlBuffer* buffer xmlBuffer* conv - cdef void xmlFreeDoc(xmlDoc* cur) - cdef void xmlFreeDtd(xmlDtd* cur) - cdef void xmlFreeNode(xmlNode* cur) - cdef void xmlFreeNsList(xmlNs* ns) - cdef void xmlFreeNs(xmlNs* ns) - cdef void xmlFree(char* buf) + cdef void xmlFreeDoc(xmlDoc* cur) nogil + cdef void xmlFreeDtd(xmlDtd* cur) nogil + cdef void xmlFreeNode(xmlNode* cur) nogil + cdef void xmlFreeNsList(xmlNs* ns) nogil + cdef void xmlFreeNs(xmlNs* ns) nogil + cdef void xmlFree(char* buf) nogil - cdef xmlNode* xmlNewNode(xmlNs* ns, char* name) - cdef xmlNode* xmlNewDocText(xmlDoc* doc, char* content) - cdef xmlNode* xmlNewDocComment(xmlDoc* doc, char* content) - cdef xmlNode* xmlNewDocPI(xmlDoc* doc, char* name, char* content) - cdef xmlNode* xmlNewReference(xmlDoc* doc, char* name) - cdef xmlNs* xmlNewNs(xmlNode* node, char* href, char* prefix) - cdef xmlNode* xmlAddChild(xmlNode* parent, xmlNode* cur) - cdef xmlNode* xmlReplaceNode(xmlNode* old, xmlNode* cur) - cdef xmlNode* xmlAddPrevSibling(xmlNode* cur, xmlNode* elem) - cdef xmlNode* xmlAddNextSibling(xmlNode* cur, xmlNode* elem) + cdef xmlNode* xmlNewNode(xmlNs* ns, char* name) nogil + cdef xmlNode* xmlNewDocText(xmlDoc* doc, char* content) nogil + cdef xmlNode* xmlNewDocComment(xmlDoc* doc, char* content) nogil + cdef xmlNode* xmlNewDocPI(xmlDoc* doc, char* name, char* content) nogil + cdef xmlNode* xmlNewReference(xmlDoc* doc, char* name) nogil + cdef xmlNs* xmlNewNs(xmlNode* node, char* href, char* prefix) nogil + cdef xmlNode* xmlAddChild(xmlNode* parent, xmlNode* cur) nogil + cdef xmlNode* xmlReplaceNode(xmlNode* old, xmlNode* cur) nogil + cdef xmlNode* xmlAddPrevSibling(xmlNode* cur, xmlNode* elem) nogil + cdef xmlNode* xmlAddNextSibling(xmlNode* cur, xmlNode* elem) nogil cdef xmlNode* xmlNewDocNode(xmlDoc* doc, xmlNs* ns, - char* name, char* content) - cdef xmlDoc* xmlNewDoc(char* version) - cdef xmlAttr* xmlNewProp(xmlNode* node, char* name, char* value) + char* name, char* content) nogil + cdef xmlDoc* xmlNewDoc(char* version) nogil + cdef xmlAttr* xmlNewProp(xmlNode* node, char* name, char* value) nogil cdef xmlAttr* xmlNewNsProp(xmlNode* node, xmlNs* ns, - char* name, char* value) - cdef char* xmlGetNoNsProp(xmlNode* node, char* name) - cdef char* xmlGetNsProp(xmlNode* node, char* name, char* nameSpace) - cdef void xmlSetNs(xmlNode* node, xmlNs* ns) - cdef xmlAttr* xmlSetProp(xmlNode* node, char* name, char* value) + char* name, char* value) nogil + cdef char* xmlGetNoNsProp(xmlNode* node, char* name) nogil + cdef char* xmlGetNsProp(xmlNode* node, char* name, char* nameSpace) nogil + cdef void xmlSetNs(xmlNode* node, xmlNs* ns) nogil + cdef xmlAttr* xmlSetProp(xmlNode* node, char* name, char* value) nogil cdef xmlAttr* xmlSetNsProp(xmlNode* node, xmlNs* ns, - char* name, char* value) - cdef int xmlRemoveProp(xmlAttr* cur) - cdef char* xmlGetNodePath(xmlNode* node) - cdef void xmlDocDumpMemory(xmlDoc* cur, char** mem, int* size) + char* name, char* value) nogil + cdef int xmlRemoveProp(xmlAttr* cur) nogil + cdef char* xmlGetNodePath(xmlNode* node) nogil + cdef void xmlDocDumpMemory(xmlDoc* cur, char** mem, int* size) nogil cdef void xmlDocDumpMemoryEnc(xmlDoc* cur, char** mem, int* size, - char* encoding) - cdef int xmlSaveFileTo(xmlOutputBuffer* out, xmlDoc* cur, char* encoding) - - cdef void xmlUnlinkNode(xmlNode* cur) - cdef xmlNode* xmlDocSetRootElement(xmlDoc* doc, xmlNode* root) - cdef xmlNode* xmlDocGetRootElement(xmlDoc* doc) - cdef void xmlSetTreeDoc(xmlNode* tree, xmlDoc* doc) - cdef xmlAttr* xmlHasProp(xmlNode* node, char* name) - cdef xmlAttr* xmlHasNsProp(xmlNode* node, char* name, char* nameSpace) - cdef char* xmlNodeGetContent(xmlNode* cur) - cdef xmlNs* xmlSearchNs(xmlDoc* doc, xmlNode* node, char* prefix) - cdef xmlNs* xmlSearchNsByHref(xmlDoc* doc, xmlNode* node, char* href) - cdef int xmlIsBlankNode(xmlNode* node) - cdef long xmlGetLineNo(xmlNode* node) - cdef void xmlElemDump(FILE* f, xmlDoc* doc, xmlNode* cur) + char* encoding) nogil + cdef int xmlSaveFileTo(xmlOutputBuffer* out, xmlDoc* cur, + char* encoding) nogil + + cdef void xmlUnlinkNode(xmlNode* cur) nogil + cdef xmlNode* xmlDocSetRootElement(xmlDoc* doc, xmlNode* root) nogil + cdef xmlNode* xmlDocGetRootElement(xmlDoc* doc) nogil + cdef void xmlSetTreeDoc(xmlNode* tree, xmlDoc* doc) nogil + cdef xmlAttr* xmlHasProp(xmlNode* node, char* name) nogil + cdef xmlAttr* xmlHasNsProp(xmlNode* node, char* name, char* nameSpace) nogil + cdef char* xmlNodeGetContent(xmlNode* cur) nogil + cdef xmlNs* xmlSearchNs(xmlDoc* doc, xmlNode* node, char* prefix) nogil + cdef xmlNs* xmlSearchNsByHref(xmlDoc* doc, xmlNode* node, char* href) nogil + cdef int xmlIsBlankNode(xmlNode* node) nogil + cdef long xmlGetLineNo(xmlNode* node) nogil + cdef void xmlElemDump(FILE* f, xmlDoc* doc, xmlNode* cur) nogil cdef void xmlNodeDumpOutput(xmlOutputBuffer* buf, xmlDoc* doc, xmlNode* cur, int level, - int format, char* encoding) - cdef void xmlNodeSetName(xmlNode* cur, char* name) - cdef void xmlNodeSetContent(xmlNode* cur, char* content) - cdef xmlDtd* xmlCopyDtd(xmlDtd* dtd) - cdef xmlDoc* xmlCopyDoc(xmlDoc* doc, int recursive) - cdef xmlNode* xmlCopyNode(xmlNode* node, int extended) - cdef xmlNode* xmlDocCopyNode(xmlNode* node, xmlDoc* doc, int extended) - cdef int xmlReconciliateNs(xmlDoc* doc, xmlNode* tree) - cdef xmlNs* xmlNewReconciliedNs(xmlDoc* doc, xmlNode* tree, xmlNs* ns) - cdef xmlBuffer* xmlBufferCreate() - cdef void xmlBufferFree(xmlBuffer* buf) - cdef char* xmlBufferContent(xmlBuffer* buf) - cdef int xmlBufferLength(xmlBuffer* buf) - cdef int xmlKeepBlanksDefault(int val) - cdef char* xmlNodeGetBase(xmlDoc* doc, xmlNode* node) - cdef char* xmlBuildURI(char* href, char* base) - cdef int xmlValidateNCName(char* value, int space) + int format, char* encoding) nogil + cdef void xmlNodeSetName(xmlNode* cur, char* name) nogil + cdef void xmlNodeSetContent(xmlNode* cur, char* content) nogil + cdef xmlDtd* xmlCopyDtd(xmlDtd* dtd) nogil + cdef xmlDoc* xmlCopyDoc(xmlDoc* doc, int recursive) nogil + cdef xmlNode* xmlCopyNode(xmlNode* node, int extended) nogil + cdef xmlNode* xmlDocCopyNode(xmlNode* node, xmlDoc* doc, int extended) nogil + cdef int xmlReconciliateNs(xmlDoc* doc, xmlNode* tree) nogil + cdef xmlNs* xmlNewReconciliedNs(xmlDoc* doc, xmlNode* tree, xmlNs* ns) nogil + cdef xmlBuffer* xmlBufferCreate() nogil + cdef void xmlBufferFree(xmlBuffer* buf) nogil + cdef char* xmlBufferContent(xmlBuffer* buf) nogil + cdef int xmlBufferLength(xmlBuffer* buf) nogil + cdef int xmlKeepBlanksDefault(int val) nogil + cdef char* xmlNodeGetBase(xmlDoc* doc, xmlNode* node) nogil + cdef char* xmlBuildURI(char* href, char* base) nogil + cdef int xmlValidateNCName(char* value, int space) nogil cdef extern from "libxml/HTMLtree.h": cdef void htmlNodeDumpFormatOutput(xmlOutputBuffer* buf, xmlDoc* doc, xmlNode* cur, - char* encoding, int format) + char* encoding, int format) nogil cdef extern from "libxml/valid.h": - cdef xmlAttr* xmlGetID(xmlDoc* doc, char* ID) - cdef void xmlDumpNotationTable(xmlBuffer* buffer, xmlNotationTable* table) + cdef xmlAttr* xmlGetID(xmlDoc* doc, char* ID) nogil + cdef void xmlDumpNotationTable(xmlBuffer* buffer, + xmlNotationTable* table) nogil cdef extern from "libxml/xmlIO.h": - cdef void xmlBufferWriteQuotedString(xmlOutputBuffer* out, char* str) - cdef int xmlOutputBufferWriteString(xmlOutputBuffer* out, char* str) - cdef int xmlOutputBufferWrite(xmlOutputBuffer* out, int len, char* str) - cdef int xmlOutputBufferFlush(xmlOutputBuffer* out) - cdef int xmlOutputBufferClose(xmlOutputBuffer* out) - - ctypedef int (*xmlInputReadCallback)(void* context, char* buffer, int len) - ctypedef int (*xmlInputCloseCallback)(void* context) - - ctypedef int (*xmlOutputWriteCallback)(void* context, char* buffer, int len) - ctypedef int (*xmlOutputCloseCallback)(void* context) + cdef void xmlBufferWriteQuotedString(xmlOutputBuffer* out, char* str) nogil + cdef int xmlOutputBufferWriteString(xmlOutputBuffer* out, char* str) nogil + cdef int xmlOutputBufferWrite(xmlOutputBuffer* out, + int len, char* str) nogil + cdef int xmlOutputBufferFlush(xmlOutputBuffer* out) nogil + cdef int xmlOutputBufferClose(xmlOutputBuffer* out) nogil + + ctypedef int (*xmlInputReadCallback)(void* context, + char* buffer, int len) nogil + ctypedef int (*xmlInputCloseCallback)(void* context) nogil + + ctypedef int (*xmlOutputWriteCallback)(void* context, + char* buffer, int len) nogil + ctypedef int (*xmlOutputCloseCallback)(void* context) nogil - cdef xmlOutputBuffer* xmlAllocOutputBuffer(xmlCharEncodingHandler* encoder) + cdef xmlOutputBuffer* xmlAllocOutputBuffer( + xmlCharEncodingHandler* encoder) nogil cdef xmlOutputBuffer* xmlOutputBufferCreateIO( xmlOutputWriteCallback iowrite, xmlOutputCloseCallback ioclose, void * ioctx, - xmlCharEncodingHandler* encoder) + xmlCharEncodingHandler* encoder) nogil cdef xmlOutputBuffer* xmlOutputBufferCreateFile( - FILE* file, xmlCharEncodingHandler* encoder) + FILE* file, xmlCharEncodingHandler* encoder) nogil cdef xmlOutputBuffer* xmlOutputBufferCreateFilename( - char* URI, xmlCharEncodingHandler* encoder, int compression) + char* URI, xmlCharEncodingHandler* encoder, int compression) nogil cdef extern from "libxml/xmlsave.h": ctypedef struct xmlSaveCtxt @@ -278,31 +285,32 @@ XML_SAVE_NO_XHTML = 8 # disable XHTML1 specific rules (2.6.22) cdef xmlSaveCtxt* xmlSaveToFilename(char* filename, char* encoding, - int options) + int options) nogil cdef xmlSaveCtxt* xmlSaveToBuffer(xmlBuffer* buffer, char* encoding, - int options) # libxml2 2.6.23 - cdef long xmlSaveDoc(xmlSaveCtxt* ctxt, xmlDoc* doc) - cdef long xmlSaveTree(xmlSaveCtxt* ctxt, xmlNode* node) - cdef int xmlSaveClose(xmlSaveCtxt* ctxt) - cdef int xmlSaveFlush(xmlSaveCtxt* ctxt) - cdef int xmlSaveSetAttrEscape(xmlSaveCtxt* ctxt, void* escape_func) - cdef int xmlSaveSetEscape(xmlSaveCtxt* ctxt, void* escape_func) + int options) nogil # libxml2 2.6.23 + cdef long xmlSaveDoc(xmlSaveCtxt* ctxt, xmlDoc* doc) nogil + cdef long xmlSaveTree(xmlSaveCtxt* ctxt, xmlNode* node) nogil + cdef int xmlSaveClose(xmlSaveCtxt* ctxt) nogil + cdef int xmlSaveFlush(xmlSaveCtxt* ctxt) nogil + cdef int xmlSaveSetAttrEscape(xmlSaveCtxt* ctxt, void* escape_func) nogil + cdef int xmlSaveSetEscape(xmlSaveCtxt* ctxt, void* escape_func) nogil cdef extern from "libxml/globals.h": - cdef int xmlThrDefKeepBlanksDefaultValue(int onoff) - cdef int xmlThrDefLineNumbersDefaultValue(int onoff) - cdef int xmlThrDefIndentTreeOutput(int onoff) + cdef int xmlThrDefKeepBlanksDefaultValue(int onoff) nogil + cdef int xmlThrDefLineNumbersDefaultValue(int onoff) nogil + cdef int xmlThrDefIndentTreeOutput(int onoff) nogil cdef extern from "libxml/xmlstring.h": - cdef char* xmlStrdup(char* cur) + cdef char* xmlStrdup(char* cur) nogil cdef extern from "libxml/xmlmemory.h": - cdef void* xmlMalloc(size_t size) + cdef void* xmlMalloc(size_t size) nogil cdef extern from "etree_defs.h": - cdef bint _isElement(xmlNode* node) - cdef bint _isElementOrXInclude(xmlNode* node) - cdef char* _getNs(xmlNode* node) + cdef bint _isElement(xmlNode* node) nogil + cdef bint _isElementOrXInclude(xmlNode* node) nogil + cdef char* _getNs(xmlNode* node) nogil cdef void BEGIN_FOR_EACH_ELEMENT_FROM(xmlNode* tree_top, - xmlNode* start_node, bint inclusive) - cdef void END_FOR_EACH_ELEMENT_FROM(xmlNode* start_node) + xmlNode* start_node, + bint inclusive) nogil + cdef void END_FOR_EACH_ELEMENT_FROM(xmlNode* start_node) nogil Modified: lxml/trunk/src/lxml/xinclude.pxd ============================================================================== --- lxml/trunk/src/lxml/xinclude.pxd (original) +++ lxml/trunk/src/lxml/xinclude.pxd Sun Dec 2 14:45:01 2007 @@ -4,14 +4,15 @@ ctypedef struct xmlXIncludeCtxt - cdef int xmlXIncludeProcess(xmlDoc* doc) - cdef int xmlXIncludeProcessFlags(xmlDoc* doc, int parser_opts) - cdef int xmlXIncludeProcessTree(xmlNode* doc) - cdef int xmlXIncludeProcessTreeFlags(xmlNode* doc, int parser_opts) + cdef int xmlXIncludeProcess(xmlDoc* doc) nogil + cdef int xmlXIncludeProcessFlags(xmlDoc* doc, int parser_opts) nogil + cdef int xmlXIncludeProcessTree(xmlNode* doc) nogil + cdef int xmlXIncludeProcessTreeFlags(xmlNode* doc, int parser_opts) nogil - cdef xmlXIncludeCtxt* xmlXIncludeNewContext(xmlDoc* doc) - cdef int xmlXIncludeProcessNode(xmlXIncludeCtxt* ctxt, xmlNode* node) - cdef int xmlXIncludeSetFlags(xmlXIncludeCtxt* ctxt, int flags) + cdef xmlXIncludeCtxt* xmlXIncludeNewContext(xmlDoc* doc) nogil + cdef int xmlXIncludeProcessNode(xmlXIncludeCtxt* ctxt, xmlNode* node) nogil + cdef int xmlXIncludeSetFlags(xmlXIncludeCtxt* ctxt, int flags) nogil # libxml2 >= 2.6.27 - cdef int xmlXIncludeProcessFlagsData(xmlDoc* doc, int flags, void* data) + cdef int xmlXIncludeProcessFlagsData( + xmlDoc* doc, int flags, void* data) nogil Modified: lxml/trunk/src/lxml/xmlerror.pxd ============================================================================== --- lxml/trunk/src/lxml/xmlerror.pxd (original) +++ lxml/trunk/src/lxml/xmlerror.pxd Sun Dec 2 14:45:01 2007 @@ -783,14 +783,17 @@ int int1 int int2 - ctypedef void (*xmlGenericErrorFunc)(void* ctxt, char* msg, ...) - ctypedef void (*xmlStructuredErrorFunc)(void* userData, xmlError* error) + ctypedef void (*xmlGenericErrorFunc)(void* ctxt, char* msg, ...) nogil + ctypedef void (*xmlStructuredErrorFunc)(void* userData, + xmlError* error) nogil - cdef void xmlSetGenericErrorFunc(void* ctxt, xmlGenericErrorFunc func) - cdef void xmlSetStructuredErrorFunc(void* ctxt, xmlStructuredErrorFunc func) + cdef void xmlSetGenericErrorFunc( + void* ctxt, xmlGenericErrorFunc func) nogil + cdef void xmlSetStructuredErrorFunc( + void* ctxt, xmlStructuredErrorFunc func) nogil cdef extern from "libxml/globals.h": - cdef void xmlThrDefSetGenericErrorFunc(void* ctx, - xmlGenericErrorFunc handler) - cdef void xmlThrDefSetStructuredErrorFunc(void* ctx, - xmlStructuredErrorFunc handler) + cdef void xmlThrDefSetGenericErrorFunc( + void* ctx, xmlGenericErrorFunc handler) nogil + cdef void xmlThrDefSetStructuredErrorFunc( + void* ctx, xmlStructuredErrorFunc handler) nogil Modified: lxml/trunk/src/lxml/xmlparser.pxd ============================================================================== --- lxml/trunk/src/lxml/xmlparser.pxd (original) +++ lxml/trunk/src/lxml/xmlparser.pxd Sun Dec 2 14:45:01 2007 @@ -65,14 +65,14 @@ int initialized cdef extern from "libxml/xmlIO.h": - cdef xmlParserInputBuffer* xmlAllocParserInputBuffer(int enc) + cdef xmlParserInputBuffer* xmlAllocParserInputBuffer(int enc) nogil cdef extern from "libxml/parser.h": - cdef xmlDict* xmlDictCreate() - cdef xmlDict* xmlDictCreateSub(xmlDict* subdict) - cdef void xmlDictFree(xmlDict* sub) - cdef int xmlDictReference(xmlDict* dict) + cdef xmlDict* xmlDictCreate() nogil + cdef xmlDict* xmlDictCreateSub(xmlDict* subdict) nogil + cdef void xmlDictFree(xmlDict* sub) nogil + cdef int xmlDictReference(xmlDict* dict) nogil cdef int XML_COMPLETE_ATTRS # SAX option for adding DTD default attributes @@ -118,31 +118,34 @@ # libxml2 2.6.21+ only: XML_PARSE_COMPACT = 65536 # compact small text nodes - cdef void xmlInitParser() - cdef int xmlLineNumbersDefault(int onoff) - cdef xmlParserCtxt* xmlNewParserCtxt() + cdef void xmlInitParser() nogil + cdef int xmlLineNumbersDefault(int onoff) nogil + cdef xmlParserCtxt* xmlNewParserCtxt() nogil cdef xmlParserInput* xmlNewIOInputStream(xmlParserCtxt* ctxt, xmlParserInputBuffer* input, - int enc) - cdef int xmlCtxtUseOptions(xmlParserCtxt* ctxt, int options) - cdef void xmlFreeParserCtxt(xmlParserCtxt* ctxt) - cdef void xmlCtxtReset(xmlParserCtxt* ctxt) - cdef void xmlClearParserCtxt(xmlParserCtxt* ctxt) + int enc) nogil + cdef int xmlCtxtUseOptions(xmlParserCtxt* ctxt, int options) nogil + cdef void xmlFreeParserCtxt(xmlParserCtxt* ctxt) nogil + cdef void xmlCtxtReset(xmlParserCtxt* ctxt) nogil + cdef void xmlClearParserCtxt(xmlParserCtxt* ctxt) nogil cdef int xmlParseChunk(xmlParserCtxt* ctxt, - char* chunk, int size, int terminate) + char* chunk, int size, int terminate) nogil cdef xmlDoc* xmlCtxtReadDoc(xmlParserCtxt* ctxt, char* cur, char* URL, char* encoding, - int options) + int options) nogil cdef xmlDoc* xmlCtxtReadFile(xmlParserCtxt* ctxt, - char* filename, char* encoding, int options) + char* filename, char* encoding, + int options) nogil cdef xmlDoc* xmlCtxtReadIO(xmlParserCtxt* ctxt, xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, void* ioctx, - char* URL, char* encoding, int options) + char* URL, char* encoding, + int options) nogil cdef xmlDoc* xmlCtxtReadMemory(xmlParserCtxt* ctxt, char* buffer, int size, - char* filename, char* encoding, int options) + char* filename, char* encoding, + int options) nogil # iterparse: @@ -150,33 +153,32 @@ void* user_data, char* chunk, int size, - char* filename) + char* filename) nogil cdef int xmlCtxtResetPush(xmlParserCtxt* ctxt, char* chunk, int size, char* filename, - char* encoding) + char* encoding) nogil # entity loaders: - ctypedef xmlParserInput* (*xmlExternalEntityLoader)(char * URL, - char * ID, - xmlParserCtxt* context) - cdef xmlExternalEntityLoader xmlGetExternalEntityLoader() - cdef void xmlSetExternalEntityLoader(xmlExternalEntityLoader f) + ctypedef xmlParserInput* (*xmlExternalEntityLoader)( + char * URL, char * ID, xmlParserCtxt* context) nogil + cdef xmlExternalEntityLoader xmlGetExternalEntityLoader() nogil + cdef void xmlSetExternalEntityLoader(xmlExternalEntityLoader f) nogil # DTDs: - cdef xmlDtd* xmlParseDTD(char* ExternalID, char* SystemID) + cdef xmlDtd* xmlParseDTD(char* ExternalID, char* SystemID) nogil cdef xmlDtd* xmlIOParseDTD(xmlSAXHandler* sax, xmlParserInputBuffer* input, - int enc) + int enc) nogil cdef extern from "libxml/parserInternals.h": cdef xmlParserInput* xmlNewStringInputStream(xmlParserCtxt* ctxt, - char* buffer) + char* buffer) nogil cdef xmlParserInput* xmlNewInputFromFile(xmlParserCtxt* ctxt, - char* filename) - cdef void xmlFreeInputStream(xmlParserInput* input) - cdef int xmlSwitchEncoding(xmlParserCtxt* ctxt, int enc) + char* filename) nogil + cdef void xmlFreeInputStream(xmlParserInput* input) nogil + cdef int xmlSwitchEncoding(xmlParserCtxt* ctxt, int enc) nogil Modified: lxml/trunk/src/lxml/xmlschema.pxd ============================================================================== --- lxml/trunk/src/lxml/xmlschema.pxd (original) +++ lxml/trunk/src/lxml/xmlschema.pxd Sun Dec 2 14:45:01 2007 @@ -4,14 +4,14 @@ cdef extern from "libxml/xmlschemas.h": ctypedef struct xmlSchema ctypedef struct xmlSchemaParserCtxt - + ctypedef struct xmlSchemaValidCtxt - - cdef xmlSchemaValidCtxt* xmlSchemaNewValidCtxt(xmlSchema* schema) - cdef int xmlSchemaValidateDoc(xmlSchemaValidCtxt* ctxt, xmlDoc* doc) - cdef xmlSchema* xmlSchemaParse(xmlSchemaParserCtxt* ctxt) - cdef xmlSchemaParserCtxt* xmlSchemaNewParserCtxt(char* URL) - cdef xmlSchemaParserCtxt* xmlSchemaNewDocParserCtxt(xmlDoc* doc) - cdef void xmlSchemaFree(xmlSchema* schema) - cdef void xmlSchemaFreeParserCtxt(xmlSchemaParserCtxt* ctxt) - cdef void xmlSchemaFreeValidCtxt(xmlSchemaValidCtxt* ctxt) + + cdef xmlSchemaValidCtxt* xmlSchemaNewValidCtxt(xmlSchema* schema) nogil + cdef int xmlSchemaValidateDoc(xmlSchemaValidCtxt* ctxt, xmlDoc* doc) nogil + cdef xmlSchema* xmlSchemaParse(xmlSchemaParserCtxt* ctxt) nogil + cdef xmlSchemaParserCtxt* xmlSchemaNewParserCtxt(char* URL) nogil + cdef xmlSchemaParserCtxt* xmlSchemaNewDocParserCtxt(xmlDoc* doc) nogil + cdef void xmlSchemaFree(xmlSchema* schema) nogil + cdef void xmlSchemaFreeParserCtxt(xmlSchemaParserCtxt* ctxt) nogil + cdef void xmlSchemaFreeValidCtxt(xmlSchemaValidCtxt* ctxt) nogil Modified: lxml/trunk/src/lxml/xmlschema.pxi ============================================================================== --- lxml/trunk/src/lxml/xmlschema.pxi (original) +++ lxml/trunk/src/lxml/xmlschema.pxi Sun Dec 2 14:45:01 2007 @@ -81,7 +81,6 @@ Returns true if document is valid, false if not. """ - cdef python.PyThreadState* state cdef xmlschema.xmlSchemaValidCtxt* valid_ctxt cdef _Document doc cdef _Element root_node @@ -98,9 +97,8 @@ raise XMLSchemaError, "Failed to create validation context" c_doc = _fakeRootDoc(doc._c_doc, root_node._c_node) - state = python.PyEval_SaveThread() - ret = xmlschema.xmlSchemaValidateDoc(valid_ctxt, c_doc) - python.PyEval_RestoreThread(state) + with nogil: + ret = xmlschema.xmlSchemaValidateDoc(valid_ctxt, c_doc) _destroyFakeDoc(doc._c_doc, c_doc) xmlschema.xmlSchemaFreeValidCtxt(valid_ctxt) Modified: lxml/trunk/src/lxml/xpath.pxd ============================================================================== --- lxml/trunk/src/lxml/xpath.pxd (original) +++ lxml/trunk/src/lxml/xpath.pxd Sun Dec 2 14:45:01 2007 @@ -68,66 +68,65 @@ tree.xmlNode* ancestor int error - ctypedef struct xmlXPathCompExpr: - pass + ctypedef struct xmlXPathCompExpr ctypedef void (*xmlXPathFunction)(xmlXPathParserContext* ctxt, int nargs) ctypedef xmlXPathFunction (*xmlXPathFuncLookupFunc)(void* ctxt, char* name, char* ns_uri) - cdef xmlXPathContext* xmlXPathNewContext(tree.xmlDoc* doc) + cdef xmlXPathContext* xmlXPathNewContext(tree.xmlDoc* doc) nogil cdef xmlXPathObject* xmlXPathEvalExpression(char* str, - xmlXPathContext* ctxt) + xmlXPathContext* ctxt) nogil cdef xmlXPathObject* xmlXPathCompiledEval(xmlXPathCompExpr* comp, - xmlXPathContext* ctxt) - cdef xmlXPathCompExpr* xmlXPathCompile(char* str) + xmlXPathContext* ctxt) nogil + cdef xmlXPathCompExpr* xmlXPathCompile(char* str) nogil cdef xmlXPathCompExpr* xmlXPathCtxtCompile(xmlXPathContext* ctxt, - char* str) - cdef void xmlXPathFreeContext(xmlXPathContext* ctxt) - cdef void xmlXPathFreeCompExpr(xmlXPathCompExpr* comp) - cdef void xmlXPathFreeObject(xmlXPathObject* obj) + char* str) nogil + cdef void xmlXPathFreeContext(xmlXPathContext* ctxt) nogil + cdef void xmlXPathFreeCompExpr(xmlXPathCompExpr* comp) nogil + cdef void xmlXPathFreeObject(xmlXPathObject* obj) nogil cdef int xmlXPathRegisterNs(xmlXPathContext* ctxt, - char* prefix, char* ns_uri) + char* prefix, char* ns_uri) nogil - cdef xmlNodeSet* xmlXPathNodeSetCreate(tree.xmlNode* val) - cdef void xmlXPathFreeNodeSet(xmlNodeSet* val) + cdef xmlNodeSet* xmlXPathNodeSetCreate(tree.xmlNode* val) nogil + cdef void xmlXPathFreeNodeSet(xmlNodeSet* val) nogil cdef extern from "libxml/xpathInternals.h": cdef int xmlXPathRegisterFunc(xmlXPathContext* ctxt, char* name, - xmlXPathFunction f) + xmlXPathFunction f) nogil cdef int xmlXPathRegisterFuncNS(xmlXPathContext* ctxt, char* name, char* ns_uri, - xmlXPathFunction f) + xmlXPathFunction f) nogil cdef void xmlXPathRegisterFuncLookup(xmlXPathContext *ctxt, xmlXPathFuncLookupFunc f, - void *funcCtxt) + void *funcCtxt) nogil cdef int xmlXPathRegisterVariable(xmlXPathContext *ctxt, char* name, - xmlXPathObject* value) + xmlXPathObject* value) nogil cdef int xmlXPathRegisterVariableNS(xmlXPathContext *ctxt, char* name, char* ns_uri, - xmlXPathObject* value) - cdef void xmlXPathRegisteredVariablesCleanup(xmlXPathContext *ctxt) - cdef void xmlXPathRegisteredNsCleanup(xmlXPathContext *ctxt) - cdef xmlXPathObject* valuePop (xmlXPathParserContext *ctxt) - cdef int valuePush(xmlXPathParserContext* ctxt, xmlXPathObject *value) + xmlXPathObject* value) nogil + cdef void xmlXPathRegisteredVariablesCleanup(xmlXPathContext *ctxt) nogil + cdef void xmlXPathRegisteredNsCleanup(xmlXPathContext *ctxt) nogil + cdef xmlXPathObject* valuePop (xmlXPathParserContext *ctxt) nogil + cdef int valuePush(xmlXPathParserContext* ctxt, xmlXPathObject *value) nogil - cdef xmlXPathObject* xmlXPathNewCString(char *val) - cdef xmlXPathObject* xmlXPathWrapCString(char * val) - cdef xmlXPathObject* xmlXPathNewString(char *val) - cdef xmlXPathObject* xmlXPathWrapString(char * val) - cdef xmlXPathObject* xmlXPathNewFloat(double val) - cdef xmlXPathObject* xmlXPathNewBoolean(int val) - cdef xmlXPathObject* xmlXPathNewNodeSet(tree.xmlNode* val) - cdef xmlXPathObject* xmlXPathNewValueTree(tree.xmlNode* val) + cdef xmlXPathObject* xmlXPathNewCString(char *val) nogil + cdef xmlXPathObject* xmlXPathWrapCString(char * val) nogil + cdef xmlXPathObject* xmlXPathNewString(char *val) nogil + cdef xmlXPathObject* xmlXPathWrapString(char * val) nogil + cdef xmlXPathObject* xmlXPathNewFloat(double val) nogil + cdef xmlXPathObject* xmlXPathNewBoolean(int val) nogil + cdef xmlXPathObject* xmlXPathNewNodeSet(tree.xmlNode* val) nogil + cdef xmlXPathObject* xmlXPathNewValueTree(tree.xmlNode* val) nogil cdef void xmlXPathNodeSetAdd(xmlNodeSet* cur, - tree.xmlNode* val) + tree.xmlNode* val) nogil cdef void xmlXPathNodeSetAddUnique(xmlNodeSet* cur, - tree.xmlNode* val) - cdef xmlXPathObject* xmlXPathWrapNodeSet(xmlNodeSet* val) - cdef void xmlXPathErr(xmlXPathParserContext* ctxt, int error) + tree.xmlNode* val) nogil + cdef xmlXPathObject* xmlXPathWrapNodeSet(xmlNodeSet* val) nogil + cdef void xmlXPathErr(xmlXPathParserContext* ctxt, int error) nogil Modified: lxml/trunk/src/lxml/xpath.pxi ============================================================================== --- lxml/trunk/src/lxml/xpath.pxi (original) +++ lxml/trunk/src/lxml/xpath.pxi Sun Dec 2 14:45:01 2007 @@ -248,7 +248,6 @@ Absolute XPath expressions (starting with '/') will be evaluated against the ElementTree as returned by getroottree(). """ - cdef python.PyThreadState* state cdef xpath.xmlXPathObject* xpathObj cdef _Document doc cdef char* c_path @@ -261,10 +260,10 @@ try: self._context.register_context(doc) self._context.registerVariables(_variables) - state = python.PyEval_SaveThread() - xpathObj = xpath.xmlXPathEvalExpression( - _cstr(path), self._xpathCtxt) - python.PyEval_RestoreThread(state) + c_path = _cstr(path) + with nogil: + xpathObj = xpath.xmlXPathEvalExpression( + c_path, self._xpathCtxt) result = self._handle_result(xpathObj, doc) finally: self._error_log.disconnect() @@ -292,10 +291,10 @@ Variables may be provided as keyword arguments. Note that namespaces are currently not supported for variables. """ - cdef python.PyThreadState* state cdef xpath.xmlXPathObject* xpathObj cdef xmlDoc* c_doc cdef _Document doc + cdef char* c_path path = _utf8(_path) doc = self._element._doc @@ -306,12 +305,12 @@ c_doc = _fakeRootDoc(doc._c_doc, self._element._c_node) try: self._context.registerVariables(_variables) - state = python.PyEval_SaveThread() - self._xpathCtxt.doc = c_doc - self._xpathCtxt.node = tree.xmlDocGetRootElement(c_doc) - xpathObj = xpath.xmlXPathEvalExpression( - _cstr(path), self._xpathCtxt) - python.PyEval_RestoreThread(state) + c_path = _cstr(path) + with nogil: + self._xpathCtxt.doc = c_doc + self._xpathCtxt.node = tree.xmlDocGetRootElement(c_doc) + xpathObj = xpath.xmlXPathEvalExpression( + c_path, self._xpathCtxt) result = self._handle_result(xpathObj, doc) finally: _destroyFakeDoc(doc._c_doc, c_doc) @@ -370,7 +369,6 @@ self._raise_parse_error() def __call__(self, _etree_or_element, **_variables): - cdef python.PyThreadState* state cdef xpath.xmlXPathObject* xpathObj cdef _Document document cdef _Element element @@ -387,10 +385,9 @@ try: self._context.register_context(document) self._context.registerVariables(_variables) - state = python.PyEval_SaveThread() - xpathObj = xpath.xmlXPathCompiledEval( - self._xpath, self._xpathCtxt) - python.PyEval_RestoreThread(state) + with nogil: + xpathObj = xpath.xmlXPathCompiledEval( + self._xpath, self._xpathCtxt) result = self._handle_result(xpathObj, document) finally: self._error_log.disconnect() Modified: lxml/trunk/src/lxml/xslt.pxd ============================================================================== --- lxml/trunk/src/lxml/xslt.pxd (original) +++ lxml/trunk/src/lxml/xslt.pxd Sun Dec 2 14:45:01 2007 @@ -23,20 +23,21 @@ xmlDict* dict int profile - cdef xsltStylesheet* xsltParseStylesheetDoc(xmlDoc* doc) - cdef void xsltFreeStylesheet(xsltStylesheet* sheet) + cdef xsltStylesheet* xsltParseStylesheetDoc(xmlDoc* doc) nogil + cdef void xsltFreeStylesheet(xsltStylesheet* sheet) nogil cdef extern from "libxslt/extensions.h": cdef int xsltRegisterExtFunction(xsltTransformContext* ctxt, char* name, char* URI, - xmlXPathFunction function) + xmlXPathFunction function) nogil cdef int xsltRegisterExtModuleFunction(char* name, char* URI, - xmlXPathFunction function) + xmlXPathFunction function) nogil cdef int xsltUnregisterExtModuleFunction(char* name, char* URI) - cdef xmlXPathFunction xsltExtModuleFunctionLookup(char* name, char* URI) + cdef xmlXPathFunction xsltExtModuleFunctionLookup( + char* name, char* URI) nogil cdef int xsltRegisterExtPrefix(xsltStylesheet* style, - char* prefix, char* URI) + char* prefix, char* URI) nogil cdef extern from "libxslt/documents.h": ctypedef enum xsltLoadType: @@ -49,30 +50,30 @@ void* ctxt, xsltLoadType type) cdef xsltDocLoaderFunc xsltDocDefaultLoader - cdef void xsltSetLoaderFunc(xsltDocLoaderFunc f) + cdef void xsltSetLoaderFunc(xsltDocLoaderFunc f) nogil cdef extern from "libxslt/transform.h": cdef xmlDoc* xsltApplyStylesheet(xsltStylesheet* style, xmlDoc* doc, - char** params) + char** params) nogil cdef xmlDoc* xsltApplyStylesheetUser(xsltStylesheet* style, xmlDoc* doc, char** params, char* output, void* profile, - xsltTransformContext* context) + xsltTransformContext* context) nogil cdef xsltTransformContext* xsltNewTransformContext(xsltStylesheet* style, - xmlDoc* doc) - cdef void xsltFreeTransformContext(xsltTransformContext* context) + xmlDoc* doc) nogil + cdef void xsltFreeTransformContext(xsltTransformContext* context) nogil cdef extern from "libxslt/xsltutils.h": cdef int xsltSaveResultToString(char** doc_txt_ptr, int* doc_txt_len, xmlDoc* result, - xsltStylesheet* style) + xsltStylesheet* style) nogil - cdef void xsltSetGenericErrorFunc(void* ctxt, - void (*handler)(void* ctxt, char* msg, ...)) - cdef void xsltSetTransformErrorFunc(xsltTransformContext*, - void* ctxt, - void (*handler)(void* ctxt, char* msg, ...)) + cdef void xsltSetGenericErrorFunc( + void* ctxt, void (*handler)(void* ctxt, char* msg, ...)) nogil + cdef void xsltSetTransformErrorFunc( + xsltTransformContext*, void* ctxt, + void (*handler)(void* ctxt, char* msg, ...)) nogil cdef extern from "libxslt/security.h": ctypedef struct xsltSecurityPrefs @@ -87,20 +88,20 @@ xsltTransformContext* ctxt, char* value) - cdef xsltSecurityPrefs* xsltNewSecurityPrefs() - cdef void xsltFreeSecurityPrefs(xsltSecurityPrefs* sec) + cdef xsltSecurityPrefs* xsltNewSecurityPrefs() nogil + cdef void xsltFreeSecurityPrefs(xsltSecurityPrefs* sec) nogil cdef int xsltSecurityForbid(xsltSecurityPrefs* sec, xsltTransformContext* ctxt, - char* value) + char* value) nogil cdef int xsltSecurityAllow(xsltSecurityPrefs* sec, xsltTransformContext* ctxt, - char* value) + char* value) nogil cdef int xsltSetSecurityPrefs(xsltSecurityPrefs* sec, xsltSecurityOption option, - xsltSecurityCheck func) + xsltSecurityCheck func) nogil cdef int xsltSetCtxtSecurityPrefs(xsltSecurityPrefs* sec, - xsltTransformContext* ctxt) - cdef xmlDoc* xsltGetProfileInformation(xsltTransformContext* ctxt) + xsltTransformContext* ctxt) nogil + cdef xmlDoc* xsltGetProfileInformation(xsltTransformContext* ctxt) nogil cdef extern from "libxslt/extra.h": cdef char* XSLT_LIBXSLT_NAMESPACE @@ -109,7 +110,7 @@ cdef char* XSLT_XT_NAMESPACE cdef xmlXPathFunction xsltFunctionNodeSet - cdef void xsltRegisterAllExtras() + cdef void xsltRegisterAllExtras() nogil cdef extern from "libexslt/exslt.h": - cdef void exsltRegisterAll() + cdef void exsltRegisterAll() nogil Modified: lxml/trunk/src/lxml/xslt.pxi ============================================================================== --- lxml/trunk/src/lxml/xslt.pxi (original) +++ lxml/trunk/src/lxml/xslt.pxi Sun Dec 2 14:45:01 2007 @@ -271,7 +271,6 @@ def __init__(self, xslt_input, extensions=None, regexp=True, access_control=None): - cdef python.PyThreadState* state cdef xslt.xsltStylesheet* c_style cdef xmlDoc* c_doc cdef xmlDoc* fake_c_doc @@ -301,9 +300,8 @@ c_doc._private = self._xslt_resolver_context self._error_log.connect() - state = python.PyEval_SaveThread() - c_style = xslt.xsltParseStylesheetDoc(c_doc) - python.PyEval_RestoreThread(state) + with nogil: + c_style = xslt.xsltParseStylesheetDoc(c_doc) self._error_log.disconnect() if c_style is NULL: @@ -443,7 +441,6 @@ cdef xmlDoc* _run_transform(self, _Document input_doc, xmlDoc* c_input_doc, parameters, _XSLTContext context, xslt.xsltTransformContext* transform_ctxt): - cdef python.PyThreadState* state cdef xmlDoc* c_result cdef char** params cdef Py_ssize_t i, parameter_count @@ -480,10 +477,9 @@ else: params = NULL - state = python.PyEval_SaveThread() - c_result = xslt.xsltApplyStylesheetUser( - self._c_style, c_input_doc, params, NULL, NULL, transform_ctxt) - python.PyEval_RestoreThread(state) + with nogil: + c_result = xslt.xsltApplyStylesheetUser( + self._c_style, c_input_doc, params, NULL, NULL, transform_ctxt) if params is not NULL: # deallocate space for parameters @@ -499,7 +495,6 @@ cdef XSLT _xslt cdef _Document _profile cdef _saveToStringAndSize(self, char** s, int* l): - cdef python.PyThreadState* state cdef _Document doc cdef int r if self._context_node is not None: @@ -509,9 +504,9 @@ if doc is None: s[0] = NULL return - state = python.PyEval_SaveThread() - r = xslt.xsltSaveResultToString(s, l, doc._c_doc, self._xslt._c_style) - python.PyEval_RestoreThread(state) + with nogil: + r = xslt.xsltSaveResultToString(s, l, doc._c_doc, + self._xslt._c_style) if r == -1: raise XSLTSaveError, "Error saving XSLT result to string" From scoder at codespeak.net Wed Dec 5 19:30:47 2007 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 5 Dec 2007 19:30:47 +0100 (CET) Subject: [Lxml-checkins] r49400 - in lxml/trunk: . src/lxml src/lxml/tests Message-ID: <20071205183047.C59DA1684CC@codespeak.net> Author: scoder Date: Wed Dec 5 19:30:47 2007 New Revision: 49400 Modified: lxml/trunk/TODO.txt lxml/trunk/selftest.py lxml/trunk/src/lxml/parser.pxi lxml/trunk/src/lxml/tests/test_elementtree.py lxml/trunk/src/lxml/xmlerror.pxi lxml/trunk/src/lxml/xslt.pxi Log: properties 'position' and 'code' on ParseError exceptions, small fixes to XSLT error reporting Modified: lxml/trunk/TODO.txt ============================================================================== --- lxml/trunk/TODO.txt (original) +++ lxml/trunk/TODO.txt Wed Dec 5 19:30:47 2007 @@ -54,6 +54,6 @@ * clean support for entities (is the Entity element class enough?) -* implement 'position' property on ParseError exception - -* rewrite iterparse() to accept a parser as argument instead of being one +* rewrite iterparse() to accept a parser as argument instead of being + one (or maybe not: iterparse() can't deal with all parser options + anyway). Modified: lxml/trunk/selftest.py ============================================================================== --- lxml/trunk/selftest.py (original) +++ lxml/trunk/selftest.py Wed Dec 5 19:30:47 2007 @@ -653,7 +653,7 @@ except ET.ParseError: return sys.exc_value -# doesn't work with lxml.etree +# doesn't work with lxml.etree -> different positions del error def namespace(): Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Wed Dec 5 19:30:47 2007 @@ -13,7 +13,10 @@ class XMLSyntaxError(ParseError): """Syntax error while parsing an XML document. """ - pass + def __init__(self, message, code, line, column): + ParseError.__init__(self, message) + self.position = (line, column) + self.code = code class ParserError(LxmlError): """Internal lxml parser error. @@ -449,7 +452,6 @@ context._initParserContext(c_ctxt) context._error_log = _ErrorLog() - cdef int _raiseParseError(xmlparser.xmlParserCtxt* ctxt, filename, _ErrorLog error_log) except 0: if filename is not None and \ @@ -458,18 +460,21 @@ message = "Error reading file '%s': %s" % ( filename, (ctxt.lastError.message).strip()) else: - message = "Error reading file '%s'" % filename - raise IOError, message + message = "Error reading '%s'" % filename + raise IOError(message) elif error_log: - raise XMLSyntaxError, error_log._buildExceptionMessage( - "Document is not well formed") + raise error_log._buildParseException( + XMLSyntaxError, "Document is not well formed") elif ctxt.lastError.message is not NULL: message = (ctxt.lastError.message).strip() + code = ctxt.lastError.code + line = ctxt.lastError.line + column = ctxt.lastError.int2 if ctxt.lastError.line > 0: - message = "line %d: %s" % (ctxt.lastError.line, message) - raise XMLSyntaxError, message + message = "line %d: %s" % (line, message) + raise XMLSyntaxError(message, code, line, column) else: - raise XMLSyntaxError + raise XMLSyntaxError(None, xmlerror.XML_ERR_INTERNAL_ERROR, 0, 0) cdef xmlDoc* _handleParseResult(_ParserContext context, xmlparser.xmlParserCtxt* c_ctxt, @@ -931,7 +936,8 @@ cdef xmlDoc* c_doc cdef _Document doc if not self._feed_parser_running: - raise XMLSyntaxError, "no element found" + raise XMLSyntaxError("no element found", + xmlerror.XML_ERR_INTERNAL_ERROR, 0, 0) context = self._getPushParserContext() pctxt = context._c_ctxt Modified: lxml/trunk/src/lxml/tests/test_elementtree.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_elementtree.py (original) +++ lxml/trunk/src/lxml/tests/test_elementtree.py Wed Dec 5 19:30:47 2007 @@ -3008,6 +3008,17 @@ self.assertRaises(ParseError, parser.close) + def test_feed_parser_error_position(self): + ParseError = self.etree.ParseError + parser = self.etree.XMLParser() + try: + parser.close() + except ParseError, e: + self.assertNotEquals(None, e.code) + self.assertNotEquals(0, e.code) + self.assert_(isinstance(e.position, tuple)) + self.assert_(e.position >= (0, 0)) + # parser target interface def test_parser_target_tag(self): Modified: lxml/trunk/src/lxml/xmlerror.pxi ============================================================================== --- lxml/trunk/src/lxml/xmlerror.pxi (original) +++ lxml/trunk/src/lxml/xmlerror.pxi Wed Dec 5 19:30:47 2007 @@ -128,6 +128,28 @@ if is_error: self.last_error = entry + cdef _buildParseException(self, exctype, default_message): + code = xmlerror.XML_ERR_INTERNAL_ERROR + if self._first_error is None: + return exctype(default_message, code, 0, 0) + if self._first_error is None or \ + self._first_error.message is None or \ + not self._first_error.message: + message = default_message + line = 0 + column = 0 + else: + message = self._first_error.message + code = self._first_error.type + line = self._first_error.line + column = self._first_error.column + if line > 0: + if column > 0: + message = "%s, line %d, column %d" % (message, line, column) + else: + message = "%s, line %d" % (message, line) + return exctype(message, code, line, column) + cdef _buildExceptionMessage(self, default_message): if self._first_error is None: return default_message @@ -393,7 +415,9 @@ cdef char* c_message cdef char* c_element cdef int i, text_size, element_size - if __DEBUG == 0 or msg is NULL or msg[0] == c'\n': + if __DEBUG == 0 or msg is NULL: + return + if msg[0] == c'\n' or msg[0] == c'\0': return cstd.va_start(args, msg) @@ -401,18 +425,19 @@ c_text = cstd.va_charptr(args) else: c_text = NULL - if cstd.strstr(msg, 'file %s') is not NULL: + if cstd.strstr(msg, 'file %s'): c_error.file = cstd.va_charptr(args) - if c_error.file is not NULL and cstd.strlen(c_error.file) > 0: - if cstd.strncmp(c_error.file, 'XSLT:', 5) == 0: - c_error.file = '' + if c_error.file and \ + cstd.strncmp(c_error.file, + 'string://__STRING__XSLT', 23) == 0: + c_error.file = '' else: c_error.file = NULL - if cstd.strstr(msg, 'line %d') is not NULL: + if cstd.strstr(msg, 'line %d'): c_error.line = cstd.va_int(args) else: c_error.line = -1 - if cstd.strstr(msg, 'element %s') is not NULL: + if cstd.strstr(msg, 'element %s'): c_element = cstd.va_charptr(args) else: c_element = NULL @@ -420,7 +445,17 @@ c_message = NULL if c_text is NULL: - c_error.message = '' + if c_element is not NULL and \ + cstd.strchr(msg, c'%') == cstd.strrchr(msg, c'%'): + # special case: a single occurrence of 'element %s' + text_size = cstd.strlen(msg) + element_size = cstd.strlen(c_element) + c_message = cstd.malloc( + (text_size + element_size + 1) * sizeof(char)) + cstd.sprintf(c_message, msg, c_element) + c_error.message = c_message + else: + c_error.message = '' elif c_element is NULL: c_error.message = c_text else: @@ -439,8 +474,7 @@ _forwardError(c_log_handler, &c_error) if c_message is not NULL: - cstd.free(c_error.message) - + cstd.free(c_message) ################################################################################ ## CONSTANTS FROM "xmlerror.h" (or rather libxml-xmlerror.html) Modified: lxml/trunk/src/lxml/xslt.pxi ============================================================================== --- lxml/trunk/src/lxml/xslt.pxi (original) +++ lxml/trunk/src/lxml/xslt.pxi Wed Dec 5 19:30:47 2007 @@ -273,10 +273,8 @@ access_control=None): cdef xslt.xsltStylesheet* c_style cdef xmlDoc* c_doc - cdef xmlDoc* fake_c_doc cdef _Document doc cdef _Element root_node - cdef _ExsltRegExp _regexp doc = _documentOrRaise(xslt_input) root_node = _rootNodeOrRaise(xslt_input) @@ -308,10 +306,13 @@ tree.xmlFreeDoc(c_doc) self._xslt_resolver_context._raise_if_stored() # last error seems to be the most accurate here - if self._error_log.last_error is not None: - raise XSLTParseError, self._error_log.last_error.message + if self._error_log.last_error is not None and \ + self._error_log.last_error.message: + raise XSLTParseError(self._error_log.last_error.message) else: - raise XSLTParseError, "Cannot parse stylesheet" + raise XSLTParseError( + self._error_log._buildExceptionMessage( + "Cannot parse stylesheet")) c_doc._private = NULL # no longer used! self._c_style = c_style From scoder at codespeak.net Wed Dec 5 19:31:25 2007 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 5 Dec 2007 19:31:25 +0100 (CET) Subject: [Lxml-checkins] r49401 - lxml/trunk/src/lxml/tests Message-ID: <20071205183125.8DD901684CC@codespeak.net> Author: scoder Date: Wed Dec 5 19:31:25 2007 New Revision: 49401 Modified: lxml/trunk/src/lxml/tests/test_xslt.py Log: additional XSLT doc resolver test case Modified: lxml/trunk/src/lxml/tests/test_xslt.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_xslt.py (original) +++ lxml/trunk/src/lxml/tests/test_xslt.py Wed Dec 5 19:31:25 2007 @@ -622,7 +622,6 @@ '{http://www.w3.org/1999/XSL/Transform}stylesheet') def test_xslt_document_error(self): - # make sure document('') works from parsed strings xslt = etree.XSLT(etree.XML("""\ @@ -633,6 +632,68 @@ """)) self.assertRaises(etree.XSLTApplyError, xslt, etree.XML('')) + def test_xslt_document_XML_resolver(self): + # make sure document('') works when custom resolvers are in use + assertEquals = self.assertEquals + called = {'count' : 0} + class TestResolver(etree.Resolver): + def resolve(self, url, id, context): + assertEquals(url, 'file://ANYTHING') + called['count'] += 1 + return self.resolve_string('', context) + + parser = etree.XMLParser() + parser.resolvers.add(TestResolver()) + + xslt = etree.XSLT(etree.XML("""\ + + + + + + + + + + + + + + + A + B + + +""", parser)) + + self.assertEquals(called['count'], 0) + result = xslt(etree.XML('')) + self.assertEquals(called['count'], 1) + + root = result.getroot() + self.assertEquals(root.tag, + 'test') + self.assertEquals(len(root), 4) + + self.assertEquals(root[0].tag, + 'CALLED') + self.assertEquals(root[1].tag, + '{local}entry') + self.assertEquals(root[1].text, + None) + self.assertEquals(root[1].get("value"), + 'A') + self.assertEquals(root[2].tag, + 'CALLED') + self.assertEquals(root[3].tag, + '{local}entry') + self.assertEquals(root[3].text, + None) + self.assertEquals(root[3].get("value"), + 'B') + def test_xslt_move_result(self): root = etree.XML('''\ From scoder at codespeak.net Wed Dec 5 19:31:51 2007 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 5 Dec 2007 19:31:51 +0100 (CET) Subject: [Lxml-checkins] r49402 - lxml/trunk/src/lxml Message-ID: <20071205183151.8060D1684CD@codespeak.net> Author: scoder Date: Wed Dec 5 19:31:51 2007 New Revision: 49402 Modified: lxml/trunk/src/lxml/parsertarget.pxi Log: fix: memory leak in target parser Modified: lxml/trunk/src/lxml/parsertarget.pxi ============================================================================== --- lxml/trunk/src/lxml/parsertarget.pxi (original) +++ lxml/trunk/src/lxml/parsertarget.pxi Wed Dec 5 19:31:51 2007 @@ -115,5 +115,14 @@ cdef xmlDoc* _handleParseResultDoc(self, _BaseParser parser, xmlDoc* result, filename) except NULL: + if result is not NULL and result._private is NULL: + # no _Document proxy => orphen + tree.xmlFreeDoc(result) + if self._c_ctxt.myDoc is not NULL and \ + self._c_ctxt.myDoc is not result and \ + self._c_ctxt.myDoc._private is NULL: + # no _Document proxy => orphen + tree.xmlFreeDoc(self._c_ctxt.myDoc) + self._c_ctxt.myDoc = NULL self._raise_if_stored() raise _TargetParserResult(self._python_target.close()) From scoder at codespeak.net Wed Dec 5 19:32:16 2007 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 5 Dec 2007 19:32:16 +0100 (CET) Subject: [Lxml-checkins] r49403 - lxml/trunk Message-ID: <20071205183216.9A91D1684CE@codespeak.net> Author: scoder Date: Wed Dec 5 19:32:16 2007 New Revision: 49403 Modified: lxml/trunk/CHANGES.txt Log: changelog Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Wed Dec 5 19:32:16 2007 @@ -2,6 +2,23 @@ lxml changelog ============== +Under development +================= + +Features added +-------------- + +* New properties ``position`` and ``code`` on ParseError exception (as + in ET 1.3) + +Bugs fixed +---------- + +* Minor bugs in XSLT error message formatting. + +* Result document memory leak in target parser. + + 2.0alpha5 (2007-11-24) ====================== From scoder at codespeak.net Wed Dec 5 19:33:05 2007 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 5 Dec 2007 19:33:05 +0100 (CET) Subject: [Lxml-checkins] r49404 - lxml/trunk/src/lxml Message-ID: <20071205183305.B15B71684CE@codespeak.net> Author: scoder Date: Wed Dec 5 19:33:05 2007 New Revision: 49404 Modified: lxml/trunk/src/lxml/schematron.pxi Log: cleanup in schematron code Modified: lxml/trunk/src/lxml/schematron.pxi ============================================================================== --- lxml/trunk/src/lxml/schematron.pxi (original) +++ lxml/trunk/src/lxml/schematron.pxi Wed Dec 5 19:33:05 2007 @@ -81,8 +81,8 @@ cdef char* c_href cdef schematron.xmlSchematronParserCtxt* parser_ctxt if not config.ENABLE_SCHEMATRON: - raise SchematronError, \ - "lxml.etree was compiled without Schematron support." + raise SchematronError( + "lxml.etree was compiled without Schematron support.") self._c_schema = NULL if etree is not None: doc = _documentOrRaise(etree) @@ -98,7 +98,7 @@ parser_ctxt = schematron.xmlSchematronNewParserCtxt(_cstr(filename)) c_doc = NULL else: - raise SchematronParseError, "No tree or file given" + raise SchematronParseError("No tree or file given") if parser_ctxt is NULL: python.PyErr_NoMemory() @@ -107,7 +107,8 @@ schematron.xmlSchematronFreeParserCtxt(parser_ctxt) if self._c_schema is NULL: - raise SchematronParseError, "Document is not a valid Schematron schema" + raise SchematronParseError( + "Document is not a valid Schematron schema") _Validator.__init__(self) def __dealloc__(self): @@ -127,27 +128,28 @@ doc = _documentOrRaise(etree) root_node = _rootNodeOrRaise(etree) - self._error_log.connect() options = schematron.XML_SCHEMATRON_OUT_QUIET - if tree.LIBXML_VERSION <= 20629: - # hack to switch off stderr output - options = options | schematron.XML_SCHEMATRON_OUT_XML + #if tree.LIBXML_VERSION <= 20630: # ... and later? + # hack to switch off stderr output + options = options | schematron.XML_SCHEMATRON_OUT_XML + valid_ctxt = schematron.xmlSchematronNewValidCtxt( self._c_schema, options) if valid_ctxt is NULL: - self._error_log.disconnect() - raise SchematronError, "Failed to create validation context" + raise SchematronError("Failed to create validation context") + self._error_log.connect() c_doc = _fakeRootDoc(doc._c_doc, root_node._c_node) with nogil: ret = schematron.xmlSchematronValidateDoc(valid_ctxt, c_doc) _destroyFakeDoc(doc._c_doc, c_doc) + self._error_log.disconnect() schematron.xmlSchematronFreeValidCtxt(valid_ctxt) - self._error_log.disconnect() if ret == -1: - raise SchematronValidateError, "Internal error in Schematron validation" + raise SchematronValidateError( + "Internal error in Schematron validation") if ret == 0: return True else: From scoder at codespeak.net Sat Dec 8 16:06:43 2007 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 8 Dec 2007 16:06:43 +0100 (CET) Subject: [Lxml-checkins] r49552 - lxml/trunk/src/lxml Message-ID: <20071208150643.8BB311684C2@codespeak.net> Author: scoder Date: Sat Dec 8 16:06:42 2007 New Revision: 49552 Modified: lxml/trunk/src/lxml/xslt.pxi Log: Modified: lxml/trunk/src/lxml/xslt.pxi ============================================================================== --- lxml/trunk/src/lxml/xslt.pxi (original) +++ lxml/trunk/src/lxml/xslt.pxi Sat Dec 8 16:06:42 2007 @@ -316,7 +316,6 @@ c_doc._private = NULL # no longer used! self._c_style = c_style - self._context = _XSLTContext(None, extensions, regexp) def __dealloc__(self): From scoder at codespeak.net Sat Dec 8 16:06:46 2007 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 8 Dec 2007 16:06:46 +0100 (CET) Subject: [Lxml-checkins] r49553 - in lxml/trunk: . doc src/lxml Message-ID: <20071208150646.1E6831684C1@codespeak.net> Author: scoder Date: Sat Dec 8 16:06:45 2007 New Revision: 49553 Modified: lxml/trunk/CHANGES.txt lxml/trunk/doc/extensions.txt lxml/trunk/src/lxml/extensions.pxi Log: Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Sat Dec 8 16:06:45 2007 @@ -18,6 +18,12 @@ * Result document memory leak in target parser. +Other changes +------------- + +* Second argument to ``lxml.etree.Extension()`` helper is no longer + required, third argument is now a keyword-only argument ``ns``. + 2.0alpha5 (2007-11-24) ====================== Modified: lxml/trunk/doc/extensions.txt ============================================================================== --- lxml/trunk/doc/extensions.txt (original) +++ lxml/trunk/doc/extensions.txt Sat Dec 8 16:06:45 2007 @@ -217,20 +217,21 @@ >>> ext_module = MyExt() >>> functions = ('function1', 'function2') - >>> extensions = etree.Extension( ext_module, functions, 'local-ns' ) + >>> extensions = etree.Extension( ext_module, functions, ns='local-ns' ) >>> e = etree.XPathEvaluator(doc, namespaces=namespaces, extensions=extensions) >>> print e.evaluate('l:function1(string(b))') 1Haegar -The second argument to ``Extension`` can either be be a sequence of names to -select from the module, a dictionary that explicitly maps function names to -their XPath alter-ego or ``None`` (explicitly passed) to take all available -functions under their original name (if their name does not start with '_'). - -The third argument takes a namespace URI or ``None`` (also if left out) for -the default namespace. The following examples will therefore all do the same -thing:: +The optional second argument to ``Extension`` can either be be a +sequence of names to select from the module, a dictionary that +explicitly maps function names to their XPath alter-ego or ``None`` +(explicitly passed) to take all available functions under their +original name (if their name does not start with '_'). + +The additional ``ns`` keyword argument takes a namespace URI or +``None`` (also if left out) for the default namespace. The following +examples will therefore all do the same thing:: >>> functions = ('function1', 'function2', 'function3') >>> extensions = etree.Extension( ext_module, functions ) @@ -238,12 +239,12 @@ >>> print e.evaluate('function1(function2(function3(string(b))))') 123Haegar - >>> extensions = etree.Extension( ext_module, functions, None ) + >>> extensions = etree.Extension( ext_module, functions, ns=None ) >>> e = etree.XPathEvaluator(doc, extensions=extensions) >>> print e.evaluate('function1(function2(function3(string(b))))') 123Haegar - >>> extensions = etree.Extension( ext_module, None ) + >>> extensions = etree.Extension(ext_module) >>> e = etree.XPathEvaluator(doc, extensions=extensions) >>> print e.evaluate('function1(function2(function3(string(b))))') 123Haegar @@ -253,15 +254,15 @@ ... 'function2' : 'function2', ... 'function3' : 'function3' ... } - >>> extensions = etree.Extension( ext_module, functions ) + >>> extensions = etree.Extension(ext_module, functions) >>> e = etree.XPathEvaluator(doc, extensions=extensions) >>> print e.evaluate('function1(function2(function3(string(b))))') 123Haegar For convenience, you can also pass a sequence of extensions:: - >>> extensions1 = etree.Extension( ext_module, None ) - >>> extensions2 = etree.Extension( ext_module, None, 'local-ns' ) + >>> extensions1 = etree.Extension(ext_module) + >>> extensions2 = etree.Extension(ext_module, ns='local-ns') >>> e = etree.XPathEvaluator(doc, extensions=[extensions1, extensions2], ... namespaces=namespaces) >>> print e.evaluate('function1(l:function2(function3(string(b))))') Modified: lxml/trunk/src/lxml/extensions.pxi ============================================================================== --- lxml/trunk/src/lxml/extensions.pxi (original) +++ lxml/trunk/src/lxml/extensions.pxi Sat Dec 8 16:06:45 2007 @@ -323,8 +323,17 @@ #print "Holding document:", element._doc._c_doc self._temp_refs.add((<_Element>o)._doc) +def Extension(module, function_mapping=None, *, ns=None): + """Build a dictionary of extension functions from the functions + defined in a module or the methods of an object. + + As second argument, you can pass an additional mapping of + attribute names to XPath function names, or a list of function + names that should be taken. -def Extension(module, function_mapping, ns=None): + The ``ns`` keyword argument accepts a namespace URI for the XPath + functions. + """ functions = {} if python.PyDict_Check(function_mapping): for function_name, xpath_name in function_mapping.items(): @@ -332,16 +341,13 @@ getattr(module, function_name)) else: if function_mapping is None: - function_mapping = [] - for name in dir(module): - if not name.startswith('_'): - python.PyList_Append(function_mapping, name) + function_mapping = [ name for name in dir(module) + if not name.startswith('_') ] for function_name in function_mapping: python.PyDict_SetItem(functions, (ns, function_name), getattr(module, function_name)) return functions - ################################################################################ # EXSLT regexp implementation From scoder at codespeak.net Sat Dec 8 16:06:50 2007 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 8 Dec 2007 16:06:50 +0100 (CET) Subject: [Lxml-checkins] r49554 - lxml/trunk/src/lxml Message-ID: <20071208150650.4970C16851F@codespeak.net> Author: scoder Date: Sat Dec 8 16:06:49 2007 New Revision: 49554 Modified: lxml/trunk/src/lxml/extensions.pxi Log: Modified: lxml/trunk/src/lxml/extensions.pxi ============================================================================== --- lxml/trunk/src/lxml/extensions.pxi (original) +++ lxml/trunk/src/lxml/extensions.pxi Sat Dec 8 16:06:49 2007 @@ -81,12 +81,14 @@ ns_uri_utf = self._to_utf(ns_uri) python.PyList_Append(ns, (prefix_utf, ns_uri_utf)) namespaces = ns + else: + namespaces = None self._doc = None self._exc = _ExceptionContext() self._extensions = extensions self._namespaces = namespaces - self._temp_refs = _TempStore() + self._temp_refs = _TempStore() if enable_regexp: _regexp = _ExsltRegExp() From scoder at codespeak.net Sat Dec 8 16:06:53 2007 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 8 Dec 2007 16:06:53 +0100 (CET) Subject: [Lxml-checkins] r49555 - lxml/trunk/src/lxml Message-ID: <20071208150653.D3D1C168523@codespeak.net> Author: scoder Date: Sat Dec 8 16:06:53 2007 New Revision: 49555 Modified: lxml/trunk/src/lxml/lxml.etree.pyx Log: Modified: lxml/trunk/src/lxml/lxml.etree.pyx ============================================================================== --- lxml/trunk/src/lxml/lxml.etree.pyx (original) +++ lxml/trunk/src/lxml/lxml.etree.pyx Sat Dec 8 16:06:53 2007 @@ -1746,8 +1746,12 @@ tree.xmlFree(c_result) return 1 - def __richcmp__(self, other, int op): - return python.PyObject_RichCompare(dict(self), other, op) + def __richcmp__(one, other, int op): + if not python.PyDict_Check(one): + one = dict(one) + if not python.PyDict_Check(other): + other = dict(other) + return python.PyObject_RichCompare(one, other, op) cdef class _AttribIterator: """Attribute iterator - for internal use only! From scoder at codespeak.net Sat Dec 8 16:06:55 2007 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 8 Dec 2007 16:06:55 +0100 (CET) Subject: [Lxml-checkins] r49556 - lxml/trunk/src/lxml Message-ID: <20071208150655.06DD3168541@codespeak.net> Author: scoder Date: Sat Dec 8 16:06:55 2007 New Revision: 49556 Modified: lxml/trunk/src/lxml/lxml.etree.pyx Log: Modified: lxml/trunk/src/lxml/lxml.etree.pyx ============================================================================== --- lxml/trunk/src/lxml/lxml.etree.pyx (original) +++ lxml/trunk/src/lxml/lxml.etree.pyx Sat Dec 8 16:06:55 2007 @@ -215,6 +215,14 @@ cdef class QName: """QName wrapper. + + Pass a tag name by itself or a namespace URI and a tag name to + create a qualified name. The ``text`` property holds the + qualified name in ``{namespace}tagname`` notation. + + You can pass QName objects wherever a tag name is expected. Also, + setting Element text from a QName will resolve the namespace + prefix and set a qualified text value. """ cdef readonly object text def __init__(self, text_or_uri, tag=None): From scoder at codespeak.net Sat Dec 8 16:06:59 2007 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 8 Dec 2007 16:06:59 +0100 (CET) Subject: [Lxml-checkins] r49557 - lxml/trunk/src/lxml Message-ID: <20071208150659.57AEA1684C2@codespeak.net> Author: scoder Date: Sat Dec 8 16:06:58 2007 New Revision: 49557 Modified: lxml/trunk/src/lxml/parser.pxi Log: Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Sat Dec 8 16:06:58 2007 @@ -1284,6 +1284,10 @@ ############################################################ cdef class TreeBuilder(_SaxParserTarget): + """Parser target that builds a tree. + + The final tree is returned by the ``close()`` method. + """ cdef _BaseParser _parser cdef object _factory cdef object _data From scoder at codespeak.net Sat Dec 8 16:07:02 2007 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 8 Dec 2007 16:07:02 +0100 (CET) Subject: [Lxml-checkins] r49558 - lxml/trunk/doc Message-ID: <20071208150702.618C01684D7@codespeak.net> Author: scoder Date: Sat Dec 8 16:07:01 2007 New Revision: 49558 Modified: lxml/trunk/doc/compatibility.txt Log: Modified: lxml/trunk/doc/compatibility.txt ============================================================================== --- lxml/trunk/doc/compatibility.txt (original) +++ lxml/trunk/doc/compatibility.txt Sat Dec 8 16:07:01 2007 @@ -3,10 +3,10 @@ ============================= A lot of care has been taken to ensure compatibility between etree and -ElementTree. Nonetheless some differences and incompatibilities exist: +ElementTree. Nonetheless, some differences and incompatibilities exist: -* Importing etree is obviously different; etree uses a lower case - package name, while ElementTree a combination of upper-case and +* Importing etree is obviously different; etree uses a lower-case + package name, while ElementTree uses a combination of upper-case and lower case in imports:: # etree @@ -89,9 +89,10 @@ API. In general, etree tries to avoid AssertionErrors in favour of being more specific about the reason for the exception. -* When parsing fails in ``iterparse()``, ElementTree raises a low-level - ExpatError instead of a SyntaxError as the other parsers. lxml.etree - follows the other parts of the parser API and raises an (XML)SyntaxError. +* When parsing fails in ``iterparse()``, ElementTree up to version + 1.2.x raises a low-level ``ExpatError`` instead of a ``SyntaxError`` + as the other parsers. Both lxml and ElementTree 1.3 raise a + ``ParseError`` for parser errors. * The ``iterparse()`` function in lxml is implemented based on the libxml2 parser and tree generator. This means that modifications of the document @@ -115,8 +116,17 @@ tries to provide a default setup that is as close to the ElementTree parser as possible. -* ElementTree has a bug when serializing an empty Comment (no text argument - given) to XML, etree serializes this successfully. +* The ``TreeBuilder`` class of ``lxml.etree`` uses a different + signature for the ``start()`` method. It accepts an additional + argument ``nsmap`` to propagate the namespace declarations of an + element in addition to its own namespace. To assure compatibility + with ElementTree (which does not support this argument), lxml checks + if the method accepts 3 arguments before calling it, and otherwise + drops the namespace mapping. This should work with most existing + ElementTree code, although there may still be conflicting cases. + +* ElementTree 1.2 has a bug when serializing an empty Comment (no text + argument given) to XML, etree serializes this successfully. * ElementTree adds whitespace around comments on serialization, lxml does not. This means that a comment text "text" that ElementTree serializes as From scoder at codespeak.net Sat Dec 8 16:07:05 2007 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 8 Dec 2007 16:07:05 +0100 (CET) Subject: [Lxml-checkins] r49559 - lxml/trunk Message-ID: <20071208150705.5BCED168542@codespeak.net> Author: scoder Date: Sat Dec 8 16:07:04 2007 New Revision: 49559 Modified: lxml/trunk/INSTALL.txt Log: Modified: lxml/trunk/INSTALL.txt ============================================================================== --- lxml/trunk/INSTALL.txt (original) +++ lxml/trunk/INSTALL.txt Sat Dec 8 16:07:04 2007 @@ -34,7 +34,7 @@ This has been reported to work on Linux, MacOS-X 10.4 and Windows, as long as libxml2 and libxslt are properly installed (including development packages, -i.e. header files etc.). +i.e. header files, etc.). Building lxml from sources @@ -84,3 +84,5 @@ ``DYLD_LIBRARY_PATH`` to the directory where fink keeps the libraries. .. _fink: http://finkproject.org/ + +A MacPort of lxml is available. Try ``port install py25-lxml``. From lxml-checkins at codespeak.net Wed Dec 12 03:39:24 2007 From: lxml-checkins at codespeak.net (VIAGRA ® Official Site) Date: Wed, 12 Dec 2007 03:39:24 +0100 (CET) Subject: [Lxml-checkins] December 73% OFF Message-ID: <20071212163926.6712.qmail@mx-ll-58.147.38-21.tttmaxnet.com> An HTML attachment was scrubbed... URL: http://codespeak.net/pipermail/lxml-checkins/attachments/20071212/ddc196c8/attachment.htm From lxml-checkins at codespeak.net Thu Dec 13 19:33:43 2007 From: lxml-checkins at codespeak.net (VIAGRA ® Official Site) Date: Thu, 13 Dec 2007 19:33:43 +0100 (CET) Subject: [Lxml-checkins] December 79% OFF Message-ID: <20071213-43344.4862.qmail@client-201.240.53.123.speedy.net.pe> An HTML attachment was scrubbed... URL: http://codespeak.net/pipermail/lxml-checkins/attachments/20071213/df75b6ea/attachment.htm From scoder at codespeak.net Fri Dec 14 08:42:38 2007 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 14 Dec 2007 08:42:38 +0100 (CET) Subject: [Lxml-checkins] r49760 - in lxml/trunk: . src/lxml Message-ID: <20071214074238.4049216851B@codespeak.net> Author: scoder Date: Fri Dec 14 08:42:36 2007 New Revision: 49760 Modified: lxml/trunk/ (props changed) lxml/trunk/src/lxml/lxml.etree.pyx Log: r3087 at delle: sbehnel | 2007-12-09 17:54:38 +0100 cleanup Modified: lxml/trunk/src/lxml/lxml.etree.pyx ============================================================================== --- lxml/trunk/src/lxml/lxml.etree.pyx (original) +++ lxml/trunk/src/lxml/lxml.etree.pyx Fri Dec 14 08:42:36 2007 @@ -639,7 +639,7 @@ if self._c_node.parent != NULL and not _isElement(self._c_node.parent): if element._c_node.type != tree.XML_PI_NODE: if element._c_node.type != tree.XML_COMMENT_NODE: - raise TypeError, "Only processing instructions and comments can be siblings of the root element" + raise TypeError("Only processing instructions and comments can be siblings of the root element") element.tail = None _appendSibling(self, element) @@ -654,7 +654,7 @@ if self._c_node.parent != NULL and not _isElement(self._c_node.parent): if element._c_node.type != tree.XML_PI_NODE: if element._c_node.type != tree.XML_COMMENT_NODE: - raise TypeError, "Only processing instructions and comments can be siblings of the root element" + raise TypeError("Only processing instructions and comments can be siblings of the root element") element.tail = None _prependSibling(self, element) From scoder at codespeak.net Fri Dec 14 08:42:43 2007 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 14 Dec 2007 08:42:43 +0100 (CET) Subject: [Lxml-checkins] r49761 - in lxml/trunk: . src/lxml src/lxml/tests Message-ID: <20071214074243.9F74D16851D@codespeak.net> Author: scoder Date: Fri Dec 14 08:42:43 2007 New Revision: 49761 Modified: lxml/trunk/ (props changed) lxml/trunk/src/lxml/serializer.pxi lxml/trunk/src/lxml/tests/test_etree.py lxml/trunk/src/lxml/tests/test_sax.py Log: r3088 at delle: sbehnel | 2007-12-09 17:56:04 +0100 on serialisation: add new lines after root-level processing instructions and comments Modified: lxml/trunk/src/lxml/serializer.pxi ============================================================================== --- lxml/trunk/src/lxml/serializer.pxi (original) +++ lxml/trunk/src/lxml/serializer.pxi Fri Dec 14 08:42:43 2007 @@ -236,12 +236,13 @@ # we are at a root node, so add PI and comment siblings c_sibling = c_node while c_sibling.prev != NULL and \ - (c_sibling.prev.type == tree.XML_PI_NODE or \ - c_sibling.prev.type == tree.XML_COMMENT_NODE): + (c_sibling.prev.type == tree.XML_PI_NODE or \ + c_sibling.prev.type == tree.XML_COMMENT_NODE): c_sibling = c_sibling.prev while c_sibling != c_node: tree.xmlNodeDumpOutput(c_buffer, c_node.doc, c_sibling, 0, pretty_print, encoding) + tree.xmlOutputBufferWriteString(c_buffer, "\n") c_sibling = c_sibling.next cdef void _writeNextSiblings(tree.xmlOutputBuffer* c_buffer, xmlNode* c_node, @@ -252,8 +253,9 @@ # we are at a root node, so add PI and comment siblings c_sibling = c_node.next while c_sibling != NULL and \ - (c_sibling.type == tree.XML_PI_NODE or \ - c_sibling.type == tree.XML_COMMENT_NODE): + (c_sibling.type == tree.XML_PI_NODE or \ + c_sibling.type == tree.XML_COMMENT_NODE): + tree.xmlOutputBufferWriteString(c_buffer, "\n") tree.xmlNodeDumpOutput(c_buffer, c_node.doc, c_sibling, 0, pretty_print, encoding) c_sibling = c_sibling.next Modified: lxml/trunk/src/lxml/tests/test_etree.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_etree.py (original) +++ lxml/trunk/src/lxml/tests/test_etree.py Fri Dec 14 08:42:43 2007 @@ -284,7 +284,7 @@ tostring = self.etree.tostring XMLParser = self.etree.XMLParser - xml = '' + xml = '\n\n' f = StringIO(xml) tree = parse(f) Modified: lxml/trunk/src/lxml/tests/test_sax.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_sax.py (original) +++ lxml/trunk/src/lxml/tests/test_sax.py Fri Dec 14 08:42:43 2007 @@ -44,9 +44,9 @@ xml_out) def test_etree_sax_pi_root(self): - tree = self.parse('ab') + tree = self.parse('\nab') xml_out = self._saxify_serialize(tree) - self.assertEquals('ab', + self.assertEquals('\nab', xml_out) def test_etree_sax_attributes(self): From scoder at codespeak.net Fri Dec 14 08:42:53 2007 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 14 Dec 2007 08:42:53 +0100 (CET) Subject: [Lxml-checkins] r49762 - in lxml/trunk: . doc src/lxml src/lxml/tests Message-ID: <20071214074253.F408416851B@codespeak.net> Author: scoder Date: Fri Dec 14 08:42:53 2007 New Revision: 49762 Modified: lxml/trunk/ (props changed) lxml/trunk/CHANGES.txt lxml/trunk/doc/api.txt lxml/trunk/doc/parsing.txt lxml/trunk/doc/tutorial.txt lxml/trunk/selftest.py lxml/trunk/selftest2.py lxml/trunk/src/lxml/serializer.pxi lxml/trunk/src/lxml/tests/test_elementtree.py lxml/trunk/src/lxml/tests/test_etree.py lxml/trunk/src/lxml/tests/test_io.py lxml/trunk/src/lxml/tests/test_sax.py lxml/trunk/src/lxml/tests/test_xslt.py Log: r3089 at delle: sbehnel | 2007-12-09 18:45:51 +0100 append newline at the end of serialised documents Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Fri Dec 14 08:42:53 2007 @@ -21,6 +21,10 @@ Other changes ------------- +* The serialisation of ElementTree objects now appends a newline at + the end of t