summaryrefslogtreecommitdiff
path: root/src/library/scala/util/parsing/combinator/SubSequence.scala
diff options
context:
space:
mode:
authorGrzegorz Kossakowski <grzegorz.kossakowski@gmail.com>2014-08-19 11:55:15 +0200
committerGrzegorz Kossakowski <grzegorz.kossakowski@gmail.com>2014-08-19 11:55:15 +0200
commitac7e1026090cf0895e03717e715ce25015263175 (patch)
tree8d0f48f7e8fdf65eb86d623e2a23843b478c4c68 /src/library/scala/util/parsing/combinator/SubSequence.scala
parentb5759efa364791a6b66865b05538549078f97aa1 (diff)
parentfceae7084cc196e37bb8cf9efa96b994c0d73738 (diff)
downloadscala-ac7e1026090cf0895e03717e715ce25015263175.tar.gz
scala-ac7e1026090cf0895e03717e715ce25015263175.tar.bz2
scala-ac7e1026090cf0895e03717e715ce25015263175.zip
Merge pull request #3860 from gourlaysama/wip/t7710-backport
[backport] SI-7710 fix memory performance of RegexParsers in jdk7u6+
Diffstat (limited to 'src/library/scala/util/parsing/combinator/SubSequence.scala')
-rw-r--r--src/library/scala/util/parsing/combinator/SubSequence.scala32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/library/scala/util/parsing/combinator/SubSequence.scala b/src/library/scala/util/parsing/combinator/SubSequence.scala
new file mode 100644
index 0000000000..79c8acac0f
--- /dev/null
+++ b/src/library/scala/util/parsing/combinator/SubSequence.scala
@@ -0,0 +1,32 @@
+/* __ *\
+** ________ ___ / / ___ Scala API **
+** / __/ __// _ | / / / _ | (c) 2006-2013, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+\* */
+
+
+package scala
+package util.parsing.combinator
+
+// A shallow wrapper over another CharSequence (usually a String)
+//
+// See SI-7710: in jdk7u6 String.subSequence stopped sharing the char array of the original
+// string and began copying it.
+// RegexParsers calls subSequence twice per input character: that's a lot of array copying!
+private[combinator] class SubSequence(s: CharSequence, start: Int, val length: Int) extends CharSequence {
+ def this(s: CharSequence, start: Int) = this(s, start, s.length - start)
+
+ def charAt(i: Int) =
+ if (i >= 0 && i < length) s.charAt(start + i) else throw new IndexOutOfBoundsException(s"index: $i, length: $length")
+
+ def subSequence(_start: Int, _end: Int) = {
+ if (_start < 0 || _end < 0 || _end > length || _start > _end)
+ throw new IndexOutOfBoundsException(s"start: ${_start}, end: ${_end}, length: $length")
+
+ new SubSequence(s, start + _start, _end - _start)
+ }
+
+ override def toString = s.subSequence(start, start + length).toString
+}