[Python-checkins] cpython: Get rid of ugly code duplication for ElementTree.parse when the accelerator
eli.bendersky
python-checkins at python.org
Mon May 20 03:47:33 CEST 2013
http://hg.python.org/cpython/rev/8425e8cc2bf2
changeset: 83852:8425e8cc2bf2
user: Eli Bendersky <eliben at gmail.com>
date: Sun May 19 18:47:23 2013 -0700
summary:
Get rid of ugly code duplication for ElementTree.parse when the accelerator
is imported. Instead, ElementTree.parse can look for a special internal method
defined by the accelerator.
files:
Lib/xml/etree/ElementTree.py | 39 ++++++-----------------
Modules/_elementtree.c | 7 +--
2 files changed, 14 insertions(+), 32 deletions(-)
diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py
--- a/Lib/xml/etree/ElementTree.py
+++ b/Lib/xml/etree/ElementTree.py
@@ -587,9 +587,17 @@
source = open(source, "rb")
close_source = True
try:
- if not parser:
- parser = XMLParser(target=TreeBuilder())
- while 1:
+ if parser is None:
+ # If no parser was specified, create a default XMLParser
+ parser = XMLParser()
+ if hasattr(parser, '_parse_whole'):
+ # The default XMLParser, when it comes from an accelerator,
+ # can define an internal _parse_whole API for efficiency.
+ # It can be used to parse the whole source without feeding
+ # it with chunks.
+ self._root = parser._parse_whole(source)
+ return self._root
+ while True:
data = source.read(65536)
if not data:
break
@@ -1651,30 +1659,5 @@
# Element, SubElement, ParseError, TreeBuilder, XMLParser
from _elementtree import *
-
- # Overwrite 'ElementTree.parse' to use the C XMLParser
- class ElementTree(ElementTree):
- __doc__ = ElementTree.__doc__
- def parse(self, source, parser=None):
- __doc__ = ElementTree.parse.__doc__
- close_source = False
- if not hasattr(source, 'read'):
- source = open(source, 'rb')
- close_source = True
- try:
- if parser is not None:
- while True:
- data = source.read(65536)
- if not data:
- break
- parser.feed(data)
- self._root = parser.close()
- else:
- parser = XMLParser()
- self._root = parser._parse(source)
- return self._root
- finally:
- if close_source:
- source.close()
except ImportError:
pass
diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c
--- a/Modules/_elementtree.c
+++ b/Modules/_elementtree.c
@@ -3347,10 +3347,9 @@
}
static PyObject*
-xmlparser_parse(XMLParserObject* self, PyObject* args)
+xmlparser_parse_whole(XMLParserObject* self, PyObject* args)
{
- /* (internal) parse until end of input stream */
-
+ /* (internal) parse the whole input, until end of stream */
PyObject* reader;
PyObject* buffer;
PyObject* temp;
@@ -3526,7 +3525,7 @@
static PyMethodDef xmlparser_methods[] = {
{"feed", (PyCFunction) xmlparser_feed, METH_VARARGS},
{"close", (PyCFunction) xmlparser_close, METH_VARARGS},
- {"_parse", (PyCFunction) xmlparser_parse, METH_VARARGS},
+ {"_parse_whole", (PyCFunction) xmlparser_parse_whole, METH_VARARGS},
{"_setevents", (PyCFunction) xmlparser_setevents, METH_VARARGS},
{"doctype", (PyCFunction) xmlparser_doctype, METH_VARARGS},
{NULL, NULL}
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list