From 1c3a20fab9b875adc7fa0d24b3e9bde0dad3bf51 Mon Sep 17 00:00:00 2001 From: pyos Date: Wed, 6 Oct 2021 12:04:02 +0200 Subject: [PATCH] JVM_IR: generate `$suspendImpl` in interfaces as public The visibility was the cause of KT-44533; not generating `$suspendImpl` at all makes `super` calls impossible. ^KT-49106 Fixed --- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++ .../jvm/lower/AddContinuationLowering.kt | 7 ++-- .../noDefaultImpls/suspendSuperCall.kt | 34 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++ .../LightAnalysisModeTestGenerated.java | 5 +++ 6 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/suspendSuperCall.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 316d16364d6..30c43440af1 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -24826,6 +24826,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/suspendFunction.kt"); } + @Test + @TestMetadata("suspendSuperCall.kt") + public void testSuspendSuperCall() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/suspendSuperCall.kt"); + } + @Nested @TestMetadata("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/delegationBy") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt index 232a2256e5b..4eb5247983e 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt @@ -224,7 +224,10 @@ private class AddContinuationLowering(context: JvmBackendContext) : SuspendLower irFunction, origin = JvmLoweredDeclarationOrigin.SUSPEND_IMPL_STATIC_FUNCTION, modality = Modality.OPEN, - visibility = JavaDescriptorVisibilities.PACKAGE_VISIBILITY, + visibility = if (irFunction.parentAsClass.isJvmInterface) + DescriptorVisibilities.PUBLIC + else + JavaDescriptorVisibilities.PACKAGE_VISIBILITY, isFakeOverride = false, copyMetadata = false ) @@ -344,7 +347,7 @@ private class AddContinuationLowering(context: JvmBackendContext) : SuspendLower } } - val newFunction = if (function.isOverridable && !function.parentAsClass.isJvmInterface) { + val newFunction = if (function.isOverridable) { // Create static method for the suspend state machine method so that reentering the method // does not lead to virtual dispatch to the wrong method. createStaticSuspendImpl(view).also { result += it } diff --git a/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/suspendSuperCall.kt b/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/suspendSuperCall.kt new file mode 100644 index 00000000000..4d01bedb07f --- /dev/null +++ b/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/suspendSuperCall.kt @@ -0,0 +1,34 @@ +// !JVM_DEFAULT_MODE: all +// TARGET_BACKEND: JVM +// IGNORE_BACKEND: JVM +// JVM_TARGET: 1.8 +// WITH_COROUTINES +// WITH_RUNTIME +import kotlin.coroutines.* +import kotlin.coroutines.intrinsics.* +import helpers.* + +suspend fun suspendHere() = suspendCoroutineUninterceptedOrReturn { + it.resume(Unit) + COROUTINE_SUSPENDED +} + +interface MyInterface { + suspend fun myMethod(myParam: String): String { + suspendHere() + return myParam + } +} + +class MyImplementation : MyInterface { + override suspend fun myMethod(myParam: String): String { + suspendHere() + return super.myMethod(myParam) + } +} + +fun box(): String { + var result = "fail" + suspend { result = MyImplementation().myMethod("OK") }.startCoroutine(EmptyContinuation) + return result +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index ac7aaefa460..b9d97b2d7a9 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -24688,6 +24688,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/suspendFunction.kt"); } + @Test + @TestMetadata("suspendSuperCall.kt") + public void testSuspendSuperCall() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/suspendSuperCall.kt"); + } + @Nested @TestMetadata("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/delegationBy") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 21bbb4f1f3a..a602a2ce5b9 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -24826,6 +24826,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/suspendFunction.kt"); } + @Test + @TestMetadata("suspendSuperCall.kt") + public void testSuspendSuperCall() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/suspendSuperCall.kt"); + } + @Nested @TestMetadata("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/delegationBy") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 1f52b7f22ca..2cff2c2051f 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -20618,6 +20618,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/kt42967_all.kt"); } + @TestMetadata("suspendSuperCall.kt") + public void ignoreSuspendSuperCall() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/suspendSuperCall.kt"); + } + private void runTest(String testDataFilePath) throws Exception { KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath); }