From 288b766d4e5b95f13441e476807d36704f3e5a11 Mon Sep 17 00:00:00 2001 From: Iulian Dragos Date: Thu, 5 Jul 2007 15:52:06 +0000 Subject: Fixed small bug in try-finally generation in co... Fixed small bug in try-finally generation in conjunction with inlining. --- .../scala/tools/nsc/backend/icode/GenICode.scala | 36 ++++++++++++++++++---- 1 file 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)) -- cgit v1.2.3