diff options
author | Rex Kerr <ichoran@gmail.com> | 2014-11-21 17:20:41 -0800 |
---|---|---|
committer | Rex Kerr <ichoran@gmail.com> | 2014-11-21 17:20:41 -0800 |
commit | 7cf0370ef9e68b60f594143447b753945a8a8780 (patch) | |
tree | 3c46fbe66b663ad94a88cef80ef05f69d0490cd3 /src/library/scala/collection/immutable/PagedSeq.scala | |
parent | c4df20d29a8d15ef23cf0d10fad56da0791bbbf6 (diff) | |
download | scala-7cf0370ef9e68b60f594143447b753945a8a8780.tar.gz scala-7cf0370ef9e68b60f594143447b753945a8a8780.tar.bz2 scala-7cf0370ef9e68b60f594143447b753945a8a8780.zip |
SI-6519 PagedSeq is not lazy enough
This was actually an issue with `length` of all things--it wasn't stopping scanning when it was past the end of what was requested. It'd just gratuitously read everything.
Also fixed an overflow bug with isDefinedAt along the way (start + index > Int.MaxValue would always return true despite never working).
Diffstat (limited to 'src/library/scala/collection/immutable/PagedSeq.scala')
-rw-r--r-- | src/library/scala/collection/immutable/PagedSeq.scala | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/library/scala/collection/immutable/PagedSeq.scala b/src/library/scala/collection/immutable/PagedSeq.scala index 3a64820be6..f11217d26a 100644 --- a/src/library/scala/collection/immutable/PagedSeq.scala +++ b/src/library/scala/collection/immutable/PagedSeq.scala @@ -158,7 +158,7 @@ extends scala.collection.AbstractSeq[T] * @note Calling this method will force the entire sequence to be read. */ def length: Int = { - while (!latest.isLast) addMore() + while (!latest.isLast && latest.end < end) addMore() (latest.end min end) - start } @@ -175,7 +175,8 @@ extends scala.collection.AbstractSeq[T] */ override def isDefinedAt(index: Int) = index >= 0 && index < end - start && { - val p = page(index + start); index + start < p.end + val absidx = index + start + absidx >= 0 && absidx < page(absidx).end } /** The subsequence from index `start` up to `end -1` if `end` @@ -192,6 +193,9 @@ extends scala.collection.AbstractSeq[T] if (f.next eq null) f.addMore(more) f = f.next } + // Warning -- not refining `more` means that slices can freely request and obtain + // data outside of their slice. This is part of the design of PagedSeq + // (to read pages!) but can be surprising. new PagedSeq(more, f, s, e) } |