diff --git a/shared/src/main/scala/scala/util/parsing/input/PagedSeq.scala b/shared/src/main/scala/scala/util/parsing/input/PagedSeq.scala index cf375b27..e4eca244 100644 --- a/shared/src/main/scala/scala/util/parsing/input/PagedSeq.scala +++ b/shared/src/main/scala/scala/util/parsing/input/PagedSeq.scala @@ -41,21 +41,8 @@ object PagedSeq { fromIterator(source.iterator) /** Constructs a paged character sequence from a string iterator */ - def fromStrings(source: Iterator[String]): PagedSeq[Char] = { - var current: String = "" - def more(data: Array[Char], start: Int, len: Int): Int = - if (current.length != 0) { - val cnt = current.length min len - current.getChars(0, cnt, data, start) - current = current.substring(cnt) - if (cnt == len) cnt - else (more(data, start + cnt, len - cnt) max 0) + cnt - } else if (source.hasNext) { - current = source.next() - more(data, start, len) - } else -1 - new PagedSeq(more(_: Array[Char], _: Int, _: Int)) - } + def fromStrings(source: Iterator[String]): PagedSeq[Char] = + fromIterator(source.flatMap(_.iterator)) /** Constructs a paged character sequence from a string iterable */ def fromStrings(source: Iterable[String]): PagedSeq[Char] = diff --git a/shared/src/test/scala/scala/util/parsing/input/gh178.scala b/shared/src/test/scala/scala/util/parsing/input/gh178.scala new file mode 100644 index 00000000..7e62d083 --- /dev/null +++ b/shared/src/test/scala/scala/util/parsing/input/gh178.scala @@ -0,0 +1,15 @@ +package scala.util.parsing.input + +import org.junit.Assert.assertEquals +import org.junit.Test + +class gh178 { + + @Test + def test: Unit = { + val len = 100000 + val i = Iterator.fill(len)("A") + val pagedSeq = PagedSeq.fromStrings(i) + assertEquals(len, pagedSeq.slice(0).length) // should not fail with StackOverflowError + } +}