diff options
author | Grzegorz Kossakowski <grzegorz.kossakowski@gmail.com> | 2014-08-19 11:55:15 +0200 |
---|---|---|
committer | Grzegorz Kossakowski <grzegorz.kossakowski@gmail.com> | 2014-08-19 11:55:15 +0200 |
commit | ac7e1026090cf0895e03717e715ce25015263175 (patch) | |
tree | 8d0f48f7e8fdf65eb86d623e2a23843b478c4c68 /src/library/scala/util/parsing/combinator/SubSequence.scala | |
parent | b5759efa364791a6b66865b05538549078f97aa1 (diff) | |
parent | fceae7084cc196e37bb8cf9efa96b994c0d73738 (diff) | |
download | scala-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.scala | 32 |
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 +} |