diff options
author | Iulian Dragos <jaguarul@gmail.com> | 2009-11-09 15:24:07 +0000 |
---|---|---|
committer | Iulian Dragos <jaguarul@gmail.com> | 2009-11-09 15:24:07 +0000 |
commit | 43ad0dea06b14b31769ff60f0b428ba597f96559 (patch) | |
tree | b5bdf7d06824d3eaa517d719c6977a9bee45df68 /src | |
parent | 6debb6aa08d0ad76c33b493511d12b251f4a4fba (diff) | |
download | scala-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')
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) } } |