diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.java index 797f709de85..fe7cfd62b81 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.java @@ -141,12 +141,12 @@ public class AnonymousObjectTransformer extends ObjectTransformer additionalFakeParams = extractParametersMappingAndPatchConstructor(constructor, allCapturedParamBuilder, constructorParamBuilder, transformationInfo, parentRemapper); - List deferringMethods = new ArrayList(); + List deferringMethods = new ArrayList(); generateConstructorAndFields(classBuilder, allCapturedParamBuilder, constructorParamBuilder, parentRemapper, additionalFakeParams); for (MethodNode next : methodsToTransform) { - MethodVisitor deferringVisitor = newMethod(classBuilder, next); + DeferredMethodVisitor deferringVisitor = newMethod(classBuilder, next); InlineResult funResult = inlineMethodAndUpdateGlobalResult(parentRemapper, deferringVisitor, next, allCapturedParamBuilder, false); @@ -161,7 +161,8 @@ public class AnonymousObjectTransformer extends ObjectTransformer", constructorDescriptor, null, ArrayUtil.EMPTY_STRING_ARRAY); inlineMethodAndUpdateGlobalResult(parentRemapper, intermediateMethodNode, constructor, constructorInlineBuilder, true); + InlineCodegenUtil.removeFinallyMarkers(intermediateMethodNode); AbstractInsnNode first = intermediateMethodNode.instructions.getFirst(); final Label oldStartLabel = first instanceof LabelNode ? ((LabelNode) first).getLabel() : null; diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.java index d1b31f4d980..295b4ee2adb 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.java @@ -466,7 +466,9 @@ public class InlineCodegen extends CallGenerator { adapter, infos, ((StackValue.Local) remapper.remap(parameters.getArgsSizeOnStack() + 1).value).index ); removeStaticInitializationTrigger(adapter); - removeFinallyMarkers(adapter); + if (!InlineCodegenUtil.isFinallyMarkerRequired(codegen.getContext())) { + InlineCodegenUtil.removeFinallyMarkers(adapter); + } adapter.accept(new MethodBodyVisitor(codegen.v)); @@ -1024,25 +1026,6 @@ public class InlineCodegen extends CallGenerator { //processor.substituteLocalVarTable(intoNode); } - private void removeFinallyMarkers(@NotNull MethodNode intoNode) { - if (InlineCodegenUtil.isFinallyMarkerRequired(codegen.getContext())) return; - - InsnList instructions = intoNode.instructions; - AbstractInsnNode curInstr = instructions.getFirst(); - while (curInstr != null) { - if (InlineCodegenUtil.isFinallyMarker(curInstr)) { - AbstractInsnNode marker = curInstr; - //just to assert - getConstant(marker.getPrevious()); - curInstr = curInstr.getNext(); - instructions.remove(marker.getPrevious()); - instructions.remove(marker); - continue; - } - curInstr = curInstr.getNext(); - } - } - @NotNull public static SourceMapper createNestedSourceMapper(@NotNull SMAPAndMethodNode nodeAndSmap, @NotNull SourceMapper parent) { return new NestedSourceMapper(parent, nodeAndSmap.getSortedRanges(), nodeAndSmap.getClassSMAP().getSourceInfo()); 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 357e8f26c29..bf27ac78687 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java @@ -466,6 +466,23 @@ public class InlineCodegenUtil { } } + public static void removeFinallyMarkers(@NotNull MethodNode intoNode) { + InsnList instructions = intoNode.instructions; + AbstractInsnNode curInstr = instructions.getFirst(); + while (curInstr != null) { + if (isFinallyMarker(curInstr)) { + AbstractInsnNode marker = curInstr; + //just to assert + getConstant(marker.getPrevious()); + curInstr = curInstr.getNext(); + instructions.remove(marker.getPrevious()); + instructions.remove(marker); + continue; + } + curInstr = curInstr.getNext(); + } + } + public static void addInlineMarker(@NotNull InstructionAdapter v, boolean isStartNotEnd) { v.visitMethodInsn( Opcodes.INVOKESTATIC, INLINE_MARKER_CLASS_NAME, diff --git a/compiler/testData/codegen/bytecodeText/inline/finallyMarkers.kt b/compiler/testData/codegen/bytecodeText/inline/finallyMarkers.kt new file mode 100644 index 00000000000..5d06d15ad72 --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/inline/finallyMarkers.kt @@ -0,0 +1,25 @@ +inline fun test(crossinline l: () -> String) { + { + l() + }() + + object { + val z = l() //constuctor + } +} + + +fun box(): String { + var z = "fail" + test { + synchronized("123") { + z = "OK" + z + } + } + + return z +} + +// 0 finallyStart +// 0 finallyEnd \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java index 3373fab602e..20e50dd07c5 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java @@ -1247,6 +1247,12 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/bytecodeText/inline"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("finallyMarkers.kt") + public void testFinallyMarkers() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/inline/finallyMarkers.kt"); + doTest(fileName); + } + @TestMetadata("inlineReturnsNothing1.kt") public void testInlineReturnsNothing1() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/inline/inlineReturnsNothing1.kt");