summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2010-09-17 00:16:18 +0000
committerPaul Phillips <paulp@improving.org>2010-09-17 00:16:18 +0000
commit4fe2d213ce613cf88d30b7ff1285cd74d4e32942 (patch)
treedae0ad3cd65583970b23c9a8bbd79956964e3da6
parent003bd3adee88b177dd18594f03695afe7db21261 (diff)
downloadscala-4fe2d213ce613cf88d30b7ff1285cd74d4e32942.tar.gz
scala-4fe2d213ce613cf88d30b7ff1285cd74d4e32942.tar.bz2
scala-4fe2d213ce613cf88d30b7ff1285cd74d4e32942.zip
Modified XMLEventReader to write dummy <ignore/...
Modified XMLEventReader to write dummy <ignore/> tag only once. Contributed by Jean-Laurent Huynh, reviewed by extempore. Closes #3840.
-rwxr-xr-x[-rw-r--r--]src/library/scala/xml/pull/XMLEventReader.scala9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/library/scala/xml/pull/XMLEventReader.scala b/src/library/scala/xml/pull/XMLEventReader.scala
index fa428a440f..d51202f2d8 100644..100755
--- a/src/library/scala/xml/pull/XMLEventReader.scala
+++ b/src/library/scala/xml/pull/XMLEventReader.scala
@@ -57,6 +57,8 @@ class XMLEventReader(src: Source) extends ProducerConsumerIterator[XMLEvent]
private class Parser(val input: Source) extends MarkupHandler with MarkupParser with ExternalSources with Runnable {
val preserveWS = XMLEventReader.this.preserveWS
+ // track level for elem memory usage optimization
+ private var level = 0
// this is Parser's way to add to the queue - the odd return type
// is to conform to MarkupHandler's interface
@@ -66,14 +68,19 @@ class XMLEventReader(src: Source) extends ProducerConsumerIterator[XMLEvent]
}
override def elemStart(pos: Int, pre: String, label: String, attrs: MetaData, scope: NamespaceBinding) {
+ level += 1
setEvent(EvElemStart(pre, label, attrs, scope))
}
override def elemEnd(pos: Int, pre: String, label: String) {
setEvent(EvElemEnd(pre, label))
+ level -= 1
}
// this is a dummy to satisfy MarkupHandler's API
- final def elem(pos: Int, pre: String, label: String, attrs: MetaData, pscope: NamespaceBinding, nodes: NodeSeq): NodeSeq = <ignore/>
+ // memory usage optimization return one <ignore/> for top level to satisfy MarkupParser.document() otherwise NodeSeq.Empty
+ private var ignoreWritten = false
+ final def elem(pos: Int, pre: String, label: String, attrs: MetaData, pscope: NamespaceBinding, nodes: NodeSeq): NodeSeq =
+ if (level == 1 && !ignoreWritten) {ignoreWritten = true; <ignore/> } else NodeSeq.Empty
def procInstr(pos: Int, target: String, txt: String) = setEvent(EvProcInstr(target, txt))
def comment(pos: Int, txt: String) = setEvent(EvComment(txt))