summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2009-11-09 15:24:07 +0000
committerIulian Dragos <jaguarul@gmail.com>2009-11-09 15:24:07 +0000
commit43ad0dea06b14b31769ff60f0b428ba597f96559 (patch)
treeb5bdf7d06824d3eaa517d719c6977a9bee45df68 /src
parent6debb6aa08d0ad76c33b493511d12b251f4a4fba (diff)
downloadscala-43ad0dea06b14b31769ff60f0b428ba597f96559.tar.gz
scala-43ad0dea06b14b31769ff60f0b428ba597f96559.tar.bz2
scala-43ad0dea06b14b31769ff60f0b428ba597f96559.zip
Fixed the optimizer for inlining correctly Scal...
Fixed the optimizer for inlining correctly ScalaRunTime.inlinedEquals
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/GenICode.scala16
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/ICodes.scala4
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/TypeKinds.scala1
3 files changed, 12 insertions, 9 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala
index f781daaa5e..d12bf0c2c5 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala
@@ -1430,17 +1430,15 @@ abstract class GenICode extends SubComponent {
* is enabled AND none of the eqeq logging options are enabled.
*/
if (mustUseAnyComparator && (!settings.YfutureEqEq.value || cannotAvoidBoxesRuntime)) {
- val ctx1 = genLoad(l, ctx, ANY_REF_CLASS)
- val ctx2 = genLoad(r, ctx1, ANY_REF_CLASS)
- // when -optimise is on we call the @inline-version of equals
+ var equalsMethod = BoxesRunTime_equals
+ // when -optimise is on we call the @inline-version of equals, found in ScalaRunTime
if (settings.XO.value) {
- val inlinedEquals = definitions.getMember(definitions.ScalaRunTimeModule, nme.inlinedEquals)
- ctx2.bb.emit(LOAD_MODULE(definitions.ScalaRunTimeModule))
- ctx2.bb.emit(CALL_METHOD(inlinedEquals, Dynamic))
- } else {
- ctx2.bb.emit(
- CALL_METHOD(BoxesRunTime_equals, Static(false)))
+ equalsMethod = definitions.getMember(definitions.ScalaRunTimeModule, nme.inlinedEquals)
+ ctx.bb.emit(LOAD_MODULE(definitions.ScalaRunTimeModule))
}
+ val ctx1 = genLoad(l, ctx, ANY_REF_CLASS)
+ val ctx2 = genLoad(r, ctx1, ANY_REF_CLASS)
+ ctx2.bb.emit(CALL_METHOD(equalsMethod, if (settings.XO.value) Dynamic else Static(false)))
ctx2.bb.emit(CZJUMP(thenCtx.bb, elseCtx.bb, NE, BOOL))
ctx2.bb.close
}
diff --git a/src/compiler/scala/tools/nsc/backend/icode/ICodes.scala b/src/compiler/scala/tools/nsc/backend/icode/ICodes.scala
index af4a3bd47b..8cb3162e94 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/ICodes.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/ICodes.scala
@@ -2,6 +2,10 @@
* Copyright 2005-2009 LAMP/EPFL
* @author Martin Odersky
*/
+/* NSC -- new scala compiler
+ * Copyright 2005-2009 LAMP/EPFL
+ * @author Martin Odersky
+ */
// $Id$
diff --git a/src/compiler/scala/tools/nsc/backend/icode/TypeKinds.scala b/src/compiler/scala/tools/nsc/backend/icode/TypeKinds.scala
index 346fce3395..a3cc5310ab 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/TypeKinds.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/TypeKinds.scala
@@ -135,6 +135,7 @@ trait TypeKinds { self: ICodes =>
case (BYTE, INT) | (INT, BYTE) => INT
case (SHORT, INT) | (INT, SHORT) => INT
case (CHAR, INT) | (INT, CHAR) => INT
+ case (BOOL, INT) | (INT, BOOL) => INT
case _ => throw new CheckerError("Incompatible types: " + a + " with " + b)
}
}