diff options
author | Som Snytt <som.snytt@gmail.com> | 2014-12-23 16:09:43 -0800 |
---|---|---|
committer | Som Snytt <som.snytt@gmail.com> | 2015-02-13 09:15:52 -0800 |
commit | fe7867f8a7f309fe16b454fe977bd2f1870d59c2 (patch) | |
tree | 9d421598203e2d2eb0fbc8e8b4f14b0d292e9e67 /src/library/scala/xml/pull/XMLEventReader.scala | |
parent | ad0ddd4603e6ec134460491333444d505d376883 (diff) | |
download | scala-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-x | src/library/scala/xml/pull/XMLEventReader.scala | 9 |
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 } |