diff options
author | Iulian Dragos <jaguarul@gmail.com> | 2007-07-05 15:52:06 +0000 |
---|---|---|
committer | Iulian Dragos <jaguarul@gmail.com> | 2007-07-05 15:52:06 +0000 |
commit | 288b766d4e5b95f13441e476807d36704f3e5a11 (patch) | |
tree | 2968a7b9d9fe6d338f1cc4b207056aa7a4c74700 | |
parent | c7345c8a951fdc57ade7d8b9af0bb18c1f88c191 (diff) | |
download | scala-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.scala | 36 |
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)) |