summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authorGrzegorz Kossakowski <grzegorz.kossakowski@gmail.com>2014-02-05 23:19:54 +0100
committerGrzegorz Kossakowski <grzegorz.kossakowski@gmail.com>2014-02-05 23:19:54 +0100
commitbd81f93078473941acdccb4056af4c0595cf9ec9 (patch)
tree88cd756303e709dae4e9387457a0770255a25c2f /src/compiler
parentc1aa6c07018925d36c7b4124fb55a1bd4c2cebcf (diff)
parenta2f595ccc77d9ffa210c007b92b605550df74c6f (diff)
downloadscala-bd81f93078473941acdccb4056af4c0595cf9ec9.tar.gz
scala-bd81f93078473941acdccb4056af4c0595cf9ec9.tar.bz2
scala-bd81f93078473941acdccb4056af4c0595cf9ec9.zip
Merge pull request #3449 from retronym/topic/opt11
Another grab bag of compiler optimizations
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/GenICode.scala6
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/Members.scala8
-rw-r--r--src/compiler/scala/tools/nsc/transform/Erasure.scala17
-rw-r--r--src/compiler/scala/tools/nsc/transform/UnCurry.scala3
4 files changed, 23 insertions, 11 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala
index 9ba38b021d..b650cdfa09 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala
@@ -46,8 +46,10 @@ abstract class GenICode extends SubComponent {
var unit: CompilationUnit = NoCompilationUnit
override def run() {
- scalaPrimitives.init()
- classes.clear()
+ if (!settings.isBCodeActive) {
+ scalaPrimitives.init()
+ classes.clear()
+ }
super.run()
}
diff --git a/src/compiler/scala/tools/nsc/backend/icode/Members.scala b/src/compiler/scala/tools/nsc/backend/icode/Members.scala
index 267fa15312..64146585e5 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/Members.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/Members.scala
@@ -21,7 +21,7 @@ trait Members {
import global._
- object NoCode extends Code(null, "NoCode") {
+ object NoCode extends Code(null, TermName("NoCode")) {
override def blocksList: List[BasicBlock] = Nil
}
@@ -29,8 +29,8 @@ trait Members {
* This class represents the intermediate code of a method or
* other multi-block piece of code, like exception handlers.
*/
- class Code(method: IMethod, name: String) {
- def this(method: IMethod) = this(method, method.symbol.decodedName.toString.intern)
+ class Code(method: IMethod, name: Name) {
+ def this(method: IMethod) = this(method, method.symbol.name)
/** The set of all blocks */
val blocks = mutable.ListBuffer[BasicBlock]()
@@ -82,7 +82,7 @@ trait Members {
}
/** This methods returns a string representation of the ICode */
- override def toString = "ICode '" + name + "'"
+ override def toString = "ICode '" + name.decoded + "'"
/* Compute a unique new label */
def nextLabel: Int = {
diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala
index a60310f900..ccfddab94a 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.
diff --git a/src/compiler/scala/tools/nsc/transform/UnCurry.scala b/src/compiler/scala/tools/nsc/transform/UnCurry.scala
index e193cf3de2..e7ea686bc8 100644
--- a/src/compiler/scala/tools/nsc/transform/UnCurry.scala
+++ b/src/compiler/scala/tools/nsc/transform/UnCurry.scala
@@ -105,12 +105,11 @@ abstract class UnCurry extends InfoTransform
*/
def isByNameRef(tree: Tree) = (
tree.isTerm
- && !byNameArgs(tree)
&& (tree.symbol ne null)
&& (isByName(tree.symbol))
+ && !byNameArgs(tree)
)
-
// ------- Handling non-local returns -------------------------------------------------
/** The type of a non-local return expression with given argument type */