Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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 lazyval 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)

AltStyle によって変換されたページ (->オリジナル) /