summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/transform/Erasure.scala
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-11-01 17:55:33 +0100
committerJason Zaugg <jzaugg@gmail.com>2014-01-31 22:15:24 +0100
commite3af86a5e535650bc04a29f1977b0e35616148f6 (patch)
treeb73d66a95c20e15b0b608be34716d5ee7022ccc2 /src/compiler/scala/tools/nsc/transform/Erasure.scala
parenta6f2704619a1f724693b456dadcb1836e2f71328 (diff)
downloadscala-e3af86a5e535650bc04a29f1977b0e35616148f6.tar.gz
scala-e3af86a5e535650bc04a29f1977b0e35616148f6.tar.bz2
scala-e3af86a5e535650bc04a29f1977b0e35616148f6.zip
Optimize generic signatures utility method `dotCleanup`
Diffstat (limited to 'src/compiler/scala/tools/nsc/transform/Erasure.scala')
-rw-r--r--src/compiler/scala/tools/nsc/transform/Erasure.scala17
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.