From a58a1a33984029e7da0649b60cdf6095db247edb Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 15 Aug 2023 18:54:59 +0200 Subject: [PATCH] Reflection: do not try to box COROUTINE_SUSPENDED #KT-58887 Fixed --- ...LightTreeBlackBoxCodegenTestGenerated.java | 6 ++++ .../FirPsiBlackBoxCodegenTestGenerated.java | 6 ++++ .../reflection/call/inlineClasses/kt58887.kt | 34 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++ ...kBoxCodegenWithIrInlinerTestGenerated.java | 6 ++++ .../LightAnalysisModeTestGenerated.java | 5 +++ .../internal/calls/ValueClassAwareCaller.kt | 2 ++ 8 files changed, 71 insertions(+) create mode 100644 compiler/testData/codegen/box/reflection/call/inlineClasses/kt58887.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java index 28d5d97a02b..b3912c6f98a 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java @@ -44311,6 +44311,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/internalPrimaryValOfInlineClass.kt"); } + @Test + @TestMetadata("kt58887.kt") + public void testKt58887() throws Exception { + runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/kt58887.kt"); + } + @Test @TestMetadata("primaryValOfInlineClass.kt") public void testPrimaryValOfInlineClass() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java index 804a1066d49..42f1245ff30 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java @@ -44311,6 +44311,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/internalPrimaryValOfInlineClass.kt"); } + @Test + @TestMetadata("kt58887.kt") + public void testKt58887() throws Exception { + runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/kt58887.kt"); + } + @Test @TestMetadata("primaryValOfInlineClass.kt") public void testPrimaryValOfInlineClass() throws Exception { diff --git a/compiler/testData/codegen/box/reflection/call/inlineClasses/kt58887.kt b/compiler/testData/codegen/box/reflection/call/inlineClasses/kt58887.kt new file mode 100644 index 00000000000..9d0660113c1 --- /dev/null +++ b/compiler/testData/codegen/box/reflection/call/inlineClasses/kt58887.kt @@ -0,0 +1,34 @@ +// TARGET_BACKEND: JVM +// WITH_REFLECT +// WITH_COROUTINES + +import helpers.EmptyContinuation +import kotlin.coroutines.Continuation +import kotlin.coroutines.startCoroutine +import kotlin.coroutines.suspendCoroutine +import kotlin.reflect.KFunction +import kotlin.reflect.full.callSuspendBy + +var c: Continuation? = null + +suspend fun suspendMe(): Z = + suspendCoroutine { c = it } + +fun builder(c: suspend () -> Unit) { + c.startCoroutine(EmptyContinuation()) +} + +fun box(): String { + var result = Z("Fail") + builder { + val ref: KFunction = ::suspendMe + result = ref.callSuspendBy(emptyMap()) + } + c!!.resumeWith(Result.success(Z("OK"))) + return result.value +} + +@JvmInline +value class Z(val value: String) { + override fun toString(): String = value +} 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 95b2407b6a8..8a340ec50a2 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 @@ -41701,6 +41701,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/internalPrimaryValOfInlineClass.kt"); } + @Test + @TestMetadata("kt58887.kt") + public void testKt58887() throws Exception { + runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/kt58887.kt"); + } + @Test @TestMetadata("primaryValOfInlineClass.kt") public void testPrimaryValOfInlineClass() throws Exception { 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 c9812c60f02..388a80dc683 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 @@ -44311,6 +44311,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/internalPrimaryValOfInlineClass.kt"); } + @Test + @TestMetadata("kt58887.kt") + public void testKt58887() throws Exception { + runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/kt58887.kt"); + } + @Test @TestMetadata("primaryValOfInlineClass.kt") public void testPrimaryValOfInlineClass() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java index 08cc6582473..37709bff6f1 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java @@ -44311,6 +44311,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/internalPrimaryValOfInlineClass.kt"); } + @Test + @TestMetadata("kt58887.kt") + public void testKt58887() throws Exception { + runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/kt58887.kt"); + } + @Test @TestMetadata("primaryValOfInlineClass.kt") public void testPrimaryValOfInlineClass() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 880e14e40e8..be340cec0a8 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -35138,6 +35138,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/internalPrimaryValOfInlineClass.kt"); } + @TestMetadata("kt58887.kt") + public void testKt58887() throws Exception { + runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/kt58887.kt"); + } + @TestMetadata("primaryValOfInlineClass.kt") public void testPrimaryValOfInlineClass() throws Exception { runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/primaryValOfInlineClass.kt"); diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/calls/ValueClassAwareCaller.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/calls/ValueClassAwareCaller.kt index feacd27f8c8..ff31b72c94a 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/calls/ValueClassAwareCaller.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/calls/ValueClassAwareCaller.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.types.asSimpleType import java.lang.reflect.Member import java.lang.reflect.Method import java.lang.reflect.Type +import kotlin.coroutines.intrinsics.COROUTINE_SUSPENDED import kotlin.reflect.jvm.internal.KDeclarationContainerImpl import kotlin.reflect.jvm.internal.KotlinReflectionInternalError import kotlin.reflect.jvm.internal.defaultPrimitiveValue @@ -186,6 +187,7 @@ internal class ValueClassAwareCaller( } val result = caller.call(unboxedArguments) + if (result === COROUTINE_SUSPENDED) return result // box is not null only for inline classes return box?.invoke(null, result) ?: result