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