diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.kt index 60888288b7b..40c24f14e20 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.kt @@ -82,8 +82,12 @@ class MethodInliner( //substitute returns with "goto end" instruction to keep non local returns in lambdas val end = Label() + val isTransformingAnonymousObject = nodeRemapper is RegeneratedLambdaFieldRemapper transformedNode = doInline(transformedNode) - removeClosureAssertions(transformedNode) + if (!isTransformingAnonymousObject) { + //don't remove assertion in transformed anonymous object + removeClosureAssertions(transformedNode) + } transformedNode.instructions.resetLabels() val resultNode = MethodNode( @@ -93,7 +97,7 @@ class MethodInliner( val visitor = RemapVisitor( resultNode, remapper, nodeRemapper, /*copy annotation and attributes*/ - nodeRemapper is RegeneratedLambdaFieldRemapper + isTransformingAnonymousObject ) try { transformedNode.accept(visitor) diff --git a/compiler/testData/codegen/boxAgainstJava/inline/kt19910.kt b/compiler/testData/codegen/boxAgainstJava/inline/kt19910.kt new file mode 100644 index 00000000000..44f766f071b --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/inline/kt19910.kt @@ -0,0 +1,39 @@ +// FILE: J.java +// FULL_JDK +// WITH_RUNTIME +// TARGET_BACKEND: JVM +public class J { + public interface Consumer { + void accept(String p); + } + + public static void invokeWithNull(Consumer x) { + x.accept(null); + } +} + +// FILE: Kotlin.kt + + +inline fun makeRunnable(crossinline lambda: () -> Unit) = + object : Runnable { + override fun run() { + lambda() + } + } + +fun box(): String { + try { + makeRunnable { + J.invokeWithNull(object : J.Consumer { + override fun accept(t: String) { + println(t) + } + }) + }.run() + } catch (e: IllegalArgumentException) { + return "OK" + } + + return "fail: exception expected" +} \ No newline at end of file diff --git a/compiler/tests-common/org/jetbrains/kotlin/codegen/InlineTestUtil.kt b/compiler/tests-common/org/jetbrains/kotlin/codegen/InlineTestUtil.kt index efe64cd1abc..d4713326204 100644 --- a/compiler/tests-common/org/jetbrains/kotlin/codegen/InlineTestUtil.kt +++ b/compiler/tests-common/org/jetbrains/kotlin/codegen/InlineTestUtil.kt @@ -124,7 +124,7 @@ object InlineTestUtil { return null } - override fun visitMethod(access: Int, name: String, desc: String, signature: String, exceptions: Array): MethodVisitor? { + override fun visitMethod(access: Int, name: String, desc: String, signature: String?, exceptions: Array?): MethodVisitor? { if (skipMethodsOfThisClass) { return null } diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java index 24b3db77bf9..9b603310fba 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java @@ -354,6 +354,21 @@ public class BlackBoxAgainstJavaCodegenTestGenerated extends AbstractBlackBoxAga } } + @TestMetadata("compiler/testData/codegen/boxAgainstJava/inline") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Inline extends AbstractBlackBoxAgainstJavaCodegenTest { + public void testAllFilesPresentInInline() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxAgainstJava/inline"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("kt19910.kt") + public void testKt19910() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/inline/kt19910.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/codegen/boxAgainstJava/innerClass") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)