diff options
author | Paul Phillips <paulp@improving.org> | 2011-07-04 20:40:05 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-07-04 20:40:05 +0000 |
commit | 257a7e65deb01c9e161c83ea5fd7a2b3c862e5e1 (patch) | |
tree | bccde9a93d807606c604ba898968316ff61fbaf5 /src/compiler/scala/tools/nsc/backend/icode/analysis/SemiLattice.scala | |
parent | 9e7d7e021cd49851257aca44b81e20427d886529 (diff) | |
download | scala-257a7e65deb01c9e161c83ea5fd7a2b3c862e5e1.tar.gz scala-257a7e65deb01c9e161c83ea5fd7a2b3c862e5e1.tar.bz2 scala-257a7e65deb01c9e161c83ea5fd7a2b3c862e5e1.zip |
Fixed a bug in the optimizer which was preventi...
Fixed a bug in the optimizer which was preventing private methods from
being inlined. Also relaxes a condition related to the "liftedTry"
problem: the inliner has to exclude certain methods from consideration
if there is a value on the stack and the method being inlined has
exception handlers. The new condition is as before, except that it does
not exclude methods of the "try/finally" variety (i.e. finalizers, but
no other exception handlers.) This is necessary to optimize this common
pattern:
@inline private def foo(body: => Unit) {
val saved = something
try body
finally something = saved
}
The closure for "body" can be fully eliminated, but only if the contents
of foo can be inlined into the caller.
Closes #4764, review by rompf.
Diffstat (limited to 'src/compiler/scala/tools/nsc/backend/icode/analysis/SemiLattice.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/icode/analysis/SemiLattice.scala | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/icode/analysis/SemiLattice.scala b/src/compiler/scala/tools/nsc/backend/icode/analysis/SemiLattice.scala index d458b2546f..cfce0878ed 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/analysis/SemiLattice.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/analysis/SemiLattice.scala @@ -3,7 +3,6 @@ * @author Martin Odersky */ - package scala.tools.nsc package backend.icode package analysis @@ -26,6 +25,11 @@ trait SemiLattice { case _ => false } + private def tstring(x: Any): String = x match { + case xs: TraversableOnce[_] => xs map tstring mkString " " + case _ => "" + x + } + override def toString = "IState(" + tstring(vars) + ", " + tstring(stack) + ")" } /** Return the least upper bound of a and b. */ |