From aecb925b7b20a30e7eac8fe8b04651dc2d929a2b Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 13 Jan 2015 20:28:52 +0300 Subject: [PATCH] Refined skipping last goto when inlining try/catch/finally block --- .../kotlin/codegen/ExpressionCodegen.java | 3 ++ .../codegen/inline/InlineCodegenUtil.java | 13 ++++++++ .../inline/InternalFinallyBlockInliner.java | 31 +++---------------- ...StoreStackBeforeInlineMethodTransformer.kt | 5 ++- .../src/kotlin/jvm/internal/InlineMarker.java | 4 +++ 5 files changed, 28 insertions(+), 28 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index f295d24d353..803919fbdf9 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -1746,6 +1746,9 @@ public class ExpressionCodegen extends JetVisitor implem } if (tryCatchBlockEnd != null) { + if (context.isInlineFunction()) { + InlineCodegenUtil.generateGoToTryCatchBlockEndMarker(v); + } v.goTo(tryCatchBlockEnd); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java index e31858f1050..88f61b39bcd 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java @@ -75,6 +75,7 @@ public class InlineCodegenUtil { public static final String INLINE_MARKER_CLASS_NAME = "kotlin/jvm/internal/InlineMarker"; public static final String INLINE_MARKER_BEFORE_METHOD_NAME = "beforeInlineCall"; public static final String INLINE_MARKER_AFTER_METHOD_NAME = "afterInlineCall"; + public static final String INLINE_MARKER_GOTO_TRY_CATCH_BLOCK_END = "goToTryCatchBlockEnd"; @Nullable public static MethodNode getMethodNode( @@ -391,6 +392,18 @@ public class InlineCodegenUtil { } } + public static void generateGoToTryCatchBlockEndMarker(@NotNull InstructionAdapter v) { + v.invokestatic(INLINE_MARKER_CLASS_NAME, INLINE_MARKER_GOTO_TRY_CATCH_BLOCK_END, "()V", false); + } + + public static boolean isGoToTryCatchBlockEnd(@NotNull AbstractInsnNode node) { + if (!(node.getPrevious() instanceof MethodInsnNode)) return false; + MethodInsnNode previous = (MethodInsnNode) node.getPrevious(); + return node.getOpcode() == Opcodes.GOTO && + INLINE_MARKER_CLASS_NAME.equals(previous.owner) && + INLINE_MARKER_GOTO_TRY_CATCH_BLOCK_END.equals(previous.name); + } + public static class LabelTextifier extends Textifier { public LabelTextifier() { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InternalFinallyBlockInliner.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InternalFinallyBlockInliner.java index f03c016b0b1..93b148e2a5f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InternalFinallyBlockInliner.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InternalFinallyBlockInliner.java @@ -470,8 +470,7 @@ public class InternalFinallyBlockInliner extends CoveringTryCatchNodeProcessor?>) { diff --git a/core/runtime.jvm/src/kotlin/jvm/internal/InlineMarker.java b/core/runtime.jvm/src/kotlin/jvm/internal/InlineMarker.java index 5b750f54779..2623dce7f13 100644 --- a/core/runtime.jvm/src/kotlin/jvm/internal/InlineMarker.java +++ b/core/runtime.jvm/src/kotlin/jvm/internal/InlineMarker.java @@ -25,4 +25,8 @@ public class InlineMarker { public static void afterInlineCall() { } + + public static void goToTryCatchBlockEnd() { + + } } \ No newline at end of file