summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2007-07-05 15:52:06 +0000
committerIulian Dragos <jaguarul@gmail.com>2007-07-05 15:52:06 +0000
commit288b766d4e5b95f13441e476807d36704f3e5a11 (patch)
tree2968a7b9d9fe6d338f1cc4b207056aa7a4c74700
parentc7345c8a951fdc57ade7d8b9af0bb18c1f88c191 (diff)
downloadscala-288b766d4e5b95f13441e476807d36704f3e5a11.tar.gz
scala-288b766d4e5b95f13441e476807d36704f3e5a11.tar.bz2
scala-288b766d4e5b95f13441e476807d36704f3e5a11.zip
Fixed small bug in try-finally generation in co...
Fixed small bug in try-finally generation in conjunction with inlining.
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/GenICode.scala36
1 files changed, 30 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala
index 2696465725..51f7c6af4b 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala
@@ -485,20 +485,40 @@ abstract class GenICode extends SubComponent {
case Try(block, catches, finalizer) =>
val kind = toTypeKind(tree.tpe)
+ var tmp: Local = null
+ val guardResult = kind != UNIT && mayCleanStack(finalizer)
+ if (guardResult) {
+ tmp = ctx.method.addLocal(
+ new Local(ctx.method.symbol.newVariable(tree.pos, unit.fresh.newName("tmp")).setInfo(tree.tpe).setFlag(Flags.SYNTHETIC),
+ kind, false))
+ }
+
var handlers = for (CaseDef(pat, _, body) <- catches.reverse)
yield pat match {
case Typed(Ident(nme.WILDCARD), tpt) => (tpt.tpe.symbol, kind, {
ctx: Context =>
ctx.bb.emit(DROP(REFERENCE(tpt.tpe.symbol)));
val ctx1 = genLoad(body, ctx, kind);
- genLoad(finalizer, ctx1, UNIT);
+ if (guardResult) {
+ ctx1.bb.emit(STORE_LOCAL(tmp))
+ val ctx2 = genLoad(finalizer, ctx1, UNIT)
+ ctx2.bb.emit(LOAD_LOCAL(tmp))
+ ctx2
+ } else
+ genLoad(finalizer, ctx1, UNIT);
})
case Ident(nme.WILDCARD) => (definitions.ThrowableClass, kind, {
ctx: Context =>
ctx.bb.emit(DROP(REFERENCE(definitions.ThrowableClass)))
val ctx1 = genLoad(body, ctx, kind)
- genLoad(finalizer, ctx1, UNIT)
+ if (guardResult) {
+ ctx1.bb.emit(STORE_LOCAL(tmp))
+ val ctx2 = genLoad(finalizer, ctx1, UNIT)
+ ctx2.bb.emit(LOAD_LOCAL(tmp))
+ ctx2
+ } else
+ genLoad(finalizer, ctx1, UNIT)
})
case Bind(name, _) =>
@@ -510,7 +530,13 @@ abstract class GenICode extends SubComponent {
ctx.bb.emit(LOAD_EXCEPTION(), pat.pos)
ctx.bb.emit(STORE_LOCAL(exception), pat.pos);
val ctx1 = genLoad(body, ctx, kind);
- genLoad(finalizer, ctx1, UNIT);
+ if (guardResult) {
+ ctx1.bb.emit(STORE_LOCAL(tmp))
+ val ctx2 = genLoad(finalizer, ctx1, UNIT)
+ ctx2.bb.emit(LOAD_LOCAL(tmp))
+ ctx2
+ } else
+ genLoad(finalizer, ctx1, UNIT);
})
}
@@ -539,12 +565,10 @@ abstract class GenICode extends SubComponent {
bodyCtx => {
generatedType = kind; //toTypeKind(block.tpe);
val ctx1 = genLoad(block, bodyCtx, generatedType);
- if (kind != UNIT && mayCleanStack(finalizer)) {
+ if (guardResult) {
val tmp = ctx1.method.addLocal(
new Local(ctx.method.symbol.newVariable(tree.pos, unit.fresh.newName("tmp")).setInfo(tree.tpe).setFlag(Flags.SYNTHETIC),
kind, false))
- if (settings.Xdce.value)
- ctx.bb.emit(LOAD_EXCEPTION())
ctx1.bb.emit(STORE_LOCAL(tmp))
val ctx2 = genLoad(duppedFinalizer, ctx1, UNIT)
ctx2.bb.emit(LOAD_LOCAL(tmp))