diff options
author | Hubert Plociniczak <hubert.plociniczak@epfl.ch> | 2011-02-24 10:41:37 +0000 |
---|---|---|
committer | Hubert Plociniczak <hubert.plociniczak@epfl.ch> | 2011-02-24 10:41:37 +0000 |
commit | b0b63f1901668d0d2acd7de00dd26157f28751f3 (patch) | |
tree | a1ec44683918a7ea68f4db9c6a1c9ff1a323386b /src | |
parent | dd45d81acf8b4e8961406b5b940e1dd70153c2a4 (diff) | |
download | scala-b0b63f1901668d0d2acd7de00dd26157f28751f3.tar.gz scala-b0b63f1901668d0d2acd7de00dd26157f28751f3.tar.bz2 scala-b0b63f1901668d0d2acd7de00dd26157f28751f3.zip |
lazy val calls shouldn't be included in pure ex...
lazy val calls shouldn't be included in pure expressions in general.
closes 4047. fixed also bug in optimizer (was eliminating a.foo call in
the test). review by dragos
Diffstat (limited to 'src')
3 files changed, 6 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/TreeInfo.scala b/src/compiler/scala/tools/nsc/ast/TreeInfo.scala index 800b5c2816..8a6f26c9b1 100644 --- a/src/compiler/scala/tools/nsc/ast/TreeInfo.scala +++ b/src/compiler/scala/tools/nsc/ast/TreeInfo.scala @@ -87,7 +87,7 @@ abstract class TreeInfo { * However, before typing, applications of nullary functional values are also * Apply(function, Nil) trees. To prevent them from being treated as pure, * we check that the callee is a method. */ - fn.symbol.isMethod && isPureExpr(fn) + fn.symbol.isMethod && !fn.symbol.isLazy && isPureExpr(fn) case Typed(expr, _) => isPureExpr(expr) case Block(stats, expr) => diff --git a/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala b/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala index 5e58806588..e1774523a5 100644 --- a/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala +++ b/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala @@ -271,7 +271,7 @@ abstract class DeadCodeElimination extends SubComponent { /** Is 'sym' a side-effecting method? TODO: proper analysis. */ private def isSideEffecting(sym: Symbol): Boolean = { - !((sym.isGetter && !sym.isLazy) + !((sym.isGetter && sym.isFinal && !sym.isLazy) || (sym.isConstructor && !(sym.owner == method.symbol.owner && method.symbol.isConstructor) // a call to another constructor && sym.owner.owner == definitions.RuntimePackage.moduleClass) diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala index 70ecea4db5..a9a9180495 100644 --- a/src/compiler/scala/tools/nsc/transform/Erasure.scala +++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala @@ -766,15 +766,15 @@ abstract class Erasure extends AddInterfaces while (opc.hasNext) { val member = opc.overriding val other = opc.overridden - //Console.println("bridge? " + member + ":" + member.tpe + member.locationString + " to " + other + ":" + other.tpe + other.locationString);//DEBUG + //Console.println("bridge? " + member + ":" + member.tpe + member.locationString + " to " + other + ":" + other.tpe + other.locationString)//DEBUG if (atPhase(currentRun.explicitouterPhase)(!member.isDeferred)) { - val otpe = erasure(other.tpe); + val otpe = erasure(other.tpe) val bridgeNeeded = atPhase(phase.next) ( !(other.tpe =:= member.tpe) && !(deconstMap(other.tpe) =:= deconstMap(member.tpe)) && { var e = bridgesScope.lookupEntry(member.name) while ((e ne null) && !((e.sym.tpe =:= otpe) && (bridgeTarget(e.sym) == member))) - e = bridgesScope.lookupNextEntry(e); + e = bridgesScope.lookupNextEntry(e) (e eq null) } ); @@ -808,7 +808,7 @@ abstract class Erasure extends AddInterfaces log("generating bridge from " + other + "(" + Flags.flagsToString(bridge.flags) + ")" + ":" + otpe + other.locationString + " to " + member + ":" + erasure(member.tpe) + member.locationString + " =\n " + bridgeDef); bridgeDef } - } :: bridges; + } :: bridges } } opc.next |