From 334419d6d2a62089943a535cbd479d7cc35b8de2 Mon Sep 17 00:00:00 2001 From: Filip Ochnik Date: Fri, 4 Jan 2019 15:27:31 +0100 Subject: [PATCH] Fix StackOverflowError in Page.latest Fixes #64 --- .../scala/util/parsing/input/PagedSeq.scala | 7 ++++++- .../scala/scala/util/parsing/input/gh64.scala | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 shared/src/test/scala/scala/util/parsing/input/gh64.scala 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..287224b4 100644 --- a/shared/src/main/scala/scala/util/parsing/input/PagedSeq.scala +++ b/shared/src/main/scala/scala/util/parsing/input/PagedSeq.scala @@ -243,7 +243,12 @@ private class Page[T: ClassTag](val num: Int) { /** The last page as currently present in the sequence; This can change as more * elements get appended to the sequence. */ final def latest: Page[T] = { - if (later.next != null) later = later.next.latest + var oldLater = later + while (later.next != null) later = later.next + while (oldLater.next != null) { + oldLater = oldLater.next + oldLater.later = later + } later } diff --git a/shared/src/test/scala/scala/util/parsing/input/gh64.scala b/shared/src/test/scala/scala/util/parsing/input/gh64.scala new file mode 100644 index 00000000..0d6da46a --- /dev/null +++ b/shared/src/test/scala/scala/util/parsing/input/gh64.scala @@ -0,0 +1,16 @@ +package scala.util.parsing.input + +import org.junit.Assert._ +import org.junit.Test + +class gh64 { + + @Test + def test: Unit = { + val len = 4096 * 20000 + val i = Iterator.fill(len)(true) // use `true` to make this test more lightweight + val pagedSeq = PagedSeq.fromIterator(i) + pagedSeq.slice(len - 1) // load the whole pagedSeq without caching `latest` element + assertEquals(len, pagedSeq.length) // should not throw StackOverflowError + } +}