Skip to content

Commit f809b06

Browse files
committed
Fix packrat caching with PagedSeqReader
This fixes #45. The problem was that whenever PagedSeqReader is constructed, source is assigned seq (although lazily) but since PagedSeq is not a subclass of java.lang.CharSequence, an implicit conversion takes place via Predef#SeqCharSequence, creating a new object. The problem is that this happens every time PagedSeqReader#rest or drop is called, breaking packrat caching entirely.
1 parent aacfcf8 commit f809b06

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

src/main/scala/scala/util/parsing/input/PagedSeqReader.scala

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ object PagedSeqReader {
3030
* @author Martin Odersky
3131
*/
3232
class PagedSeqReader(seq: PagedSeq[Char],
33-
override val offset: Int) extends Reader[Char] {
33+
override val offset: Int) extends Reader[Char] { outer =>
3434
import PagedSeqReader._
3535

36-
override lazy val source: java.lang.CharSequence = seq
36+
override val source: java.lang.CharSequence = seq
3737

3838
/** Construct a `PagedSeqReader` with its first element at
3939
* `source(0)` and position `(1,1)`.
@@ -51,7 +51,9 @@ class PagedSeqReader(seq: PagedSeq[Char],
5151
* otherwise, it's a `PagedSeqReader` containing the rest of input.
5252
*/
5353
def rest: PagedSeqReader =
54-
if (seq.isDefinedAt(offset)) new PagedSeqReader(seq, offset + 1)
54+
if (seq.isDefinedAt(offset)) new PagedSeqReader(seq, offset + 1) {
55+
override val source: java.lang.CharSequence = outer.source
56+
}
5557
else this
5658

5759
/** The position of the first element in the reader.
@@ -67,5 +69,7 @@ class PagedSeqReader(seq: PagedSeq[Char],
6769
* `n` elements.
6870
*/
6971
override def drop(n: Int): PagedSeqReader =
70-
new PagedSeqReader(seq, offset + n)
72+
new PagedSeqReader(seq, offset + n) {
73+
override val source: java.lang.CharSequence = outer.source
74+
}
7175
}

0 commit comments

Comments
 (0)