summaryrefslogtreecommitdiff
path: root/src/library/scala/xml/pull/XMLEventReader.scala
diff options
context:
space:
mode:
authorSom Snytt <som.snytt@gmail.com>2014-12-23 16:09:43 -0800
committerSom Snytt <som.snytt@gmail.com>2015-02-13 09:15:52 -0800
commitfe7867f8a7f309fe16b454fe977bd2f1870d59c2 (patch)
tree9d421598203e2d2eb0fbc8e8b4f14b0d292e9e67 /src/library/scala/xml/pull/XMLEventReader.scala
parentad0ddd4603e6ec134460491333444d505d376883 (diff)
downloadscala-fe7867f8a7f309fe16b454fe977bd2f1870d59c2.tar.gz
scala-fe7867f8a7f309fe16b454fe977bd2f1870d59c2.tar.bz2
scala-fe7867f8a7f309fe16b454fe977bd2f1870d59c2.zip
[backport] SI-4339 Event errors and attribute fix
Improve attribute parsing and propagate errors across event thread. Otherwise tests just hang. This is tested, right? This is an upstream port of scala-xml 5f2cfadeb9e8574ed66f37dc7a7a868eb129a8a9
Diffstat (limited to 'src/library/scala/xml/pull/XMLEventReader.scala')
-rwxr-xr-xsrc/library/scala/xml/pull/XMLEventReader.scala9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/library/scala/xml/pull/XMLEventReader.scala b/src/library/scala/xml/pull/XMLEventReader.scala
index 428c305055..26572c9946 100755
--- a/src/library/scala/xml/pull/XMLEventReader.scala
+++ b/src/library/scala/xml/pull/XMLEventReader.scala
@@ -91,12 +91,16 @@ extends scala.collection.AbstractIterator[XMLEvent]
override def run() {
curInput = input
- interruptibly { this.initialize.document() }
- setEvent(POISON)
+ try interruptibly { this.initialize.document() }
+ catch { case e:Exception => setEvent(ExceptionEvent(e)) }
+ finally setEvent(POISON)
}
}
}
+// An internal class used to propagate exception from helper threads to API end users.
+private case class ExceptionEvent(exception:Exception) extends XMLEvent
+
// An iterator designed for one or more producers to generate
// elements, and a single consumer to iterate. Iteration will continue
// until closeIterator() is called, after which point producers
@@ -141,6 +145,7 @@ trait ProducerConsumerIterator[T >: Null] extends Iterator[T] {
def next() = {
if (eos) throw new NoSuchElementException("ProducerConsumerIterator")
if (buffer == null) fillBuffer
+ if (buffer.isInstanceOf[ExceptionEvent]) throw buffer.asInstanceOf[ExceptionEvent].exception
drainBuffer
}