diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-11-01 17:55:33 +0100 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2014-01-31 22:15:24 +0100 |
commit | e3af86a5e535650bc04a29f1977b0e35616148f6 (patch) | |
tree | b73d66a95c20e15b0b608be34716d5ee7022ccc2 /src | |
parent | a6f2704619a1f724693b456dadcb1836e2f71328 (diff) | |
download | scala-e3af86a5e535650bc04a29f1977b0e35616148f6.tar.gz scala-e3af86a5e535650bc04a29f1977b0e35616148f6.tar.bz2 scala-e3af86a5e535650bc04a29f1977b0e35616148f6.zip |
Optimize generic signatures utility method `dotCleanup`
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/Erasure.scala | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala index 0a013995b6..aaaa3287c7 100644 --- a/src/compiler/scala/tools/nsc/transform/Erasure.scala +++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala @@ -92,11 +92,22 @@ abstract class Erasure extends AddInterfaces // more rigorous way up front rather than catching it after the fact, // but that will be more involved. private def dotCleanup(sig: String): String = { + // OPT 50% of time in generic signatures (~1% of compile time) was in this method, hence the imperative rewrite. var last: Char = '\u0000' - sig map { - case '.' if last != '>' => last = '.' ; '$' - case ch => last = ch ; ch + var i = 0 + val len = sig.length + val copy: Array[Char] = sig.toCharArray + var changed = false + while (i < sig.length) { + val ch = copy(i) + if (ch == '.' && last != '>') { + copy(i) = '$' + changed = true + } + last = ch + i += 1 } + if (changed) new String(copy) else sig } /** This object is only used for sanity testing when -check:genjvm is set. |