From cd189c0812cb07ceaba24f9a85f3d91dfb397ac0 Mon Sep 17 00:00:00 2001 From: Ilmir Usmanov Date: Thu, 4 Feb 2021 02:29:42 +0100 Subject: [PATCH] JVM_IR. Do not unbox Result in inline lambda Since JVM_IR generates inline lambdas differently from old backend, in this case, it generates them as normal functions. Thus, there is no need to unbox the lambda argument. #KT-44671 Fixed --- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++ .../backend/jvm/codegen/ExpressionCodegen.kt | 1 + .../resultExceptionOrNullInLambda.kt | 29 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++ .../LightAnalysisModeTestGenerated.java | 5 ++++ .../IrJsCodegenBoxES6TestGenerated.java | 5 ++++ .../IrJsCodegenBoxTestGenerated.java | 5 ++++ .../semantics/JsCodegenBoxTestGenerated.java | 5 ++++ 9 files changed, 68 insertions(+) create mode 100644 compiler/testData/codegen/box/coroutines/intrinsicSemantics/resultExceptionOrNullInLambda.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 f12f52072f1..eb521be52a6 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 @@ -10685,6 +10685,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/coroutines/intrinsicSemantics/intercepted.kt"); } + @Test + @TestMetadata("resultExceptionOrNullInLambda.kt") + public void testResultExceptionOrNullInLambda() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/intrinsicSemantics/resultExceptionOrNullInLambda.kt"); + } + @Test @TestMetadata("startCoroutine.kt") public void testStartCoroutine() throws Exception { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt index e07e062b7b4..8137dd38511 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt @@ -626,6 +626,7 @@ class ExpressionCodegen( // bridge to unbox it. Instead, we unbox it in the non-mangled function manually. private fun unboxResultIfNeeded(arg: IrGetValue) { if (arg.type.erasedUpperBound.fqNameWhenAvailable != StandardNames.RESULT_FQ_NAME) return + if (irFunction.origin == IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA) return if (!onlyResultInlineClassParameters()) return if (irFunction !is IrSimpleFunction) return // Skip Result's methods diff --git a/compiler/testData/codegen/box/coroutines/intrinsicSemantics/resultExceptionOrNullInLambda.kt b/compiler/testData/codegen/box/coroutines/intrinsicSemantics/resultExceptionOrNullInLambda.kt new file mode 100644 index 00000000000..c39a5850475 --- /dev/null +++ b/compiler/testData/codegen/box/coroutines/intrinsicSemantics/resultExceptionOrNullInLambda.kt @@ -0,0 +1,29 @@ +// WITH_RUNTIME + +import kotlin.coroutines.intrinsics.* +import kotlin.coroutines.* + +fun myRun(c: () -> Unit) { + c() +} + +@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") +fun box(): String { + var contiuation: Continuation? = null + val c: suspend () -> Unit = { + suspendCoroutine { + contiuation = it + } + } + + var exception: Throwable? = null + myRun { + c.startCoroutineUninterceptedOrReturn(Continuation(EmptyCoroutineContext) { + exception = it.exceptionOrNull() + }) + } + + contiuation?.resumeWithException(RuntimeException("OK")) + + return exception!!.message!! +} \ No newline at end of file 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 ea9ae710da4..0d276b1f143 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 @@ -10685,6 +10685,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/coroutines/intrinsicSemantics/intercepted.kt"); } + @Test + @TestMetadata("resultExceptionOrNullInLambda.kt") + public void testResultExceptionOrNullInLambda() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/intrinsicSemantics/resultExceptionOrNullInLambda.kt"); + } + @Test @TestMetadata("startCoroutine.kt") public void testStartCoroutine() 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 d2068ee058c..a5b60776c46 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 @@ -10685,6 +10685,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/coroutines/intrinsicSemantics/intercepted.kt"); } + @Test + @TestMetadata("resultExceptionOrNullInLambda.kt") + public void testResultExceptionOrNullInLambda() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/intrinsicSemantics/resultExceptionOrNullInLambda.kt"); + } + @Test @TestMetadata("startCoroutine.kt") public void testStartCoroutine() 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 847d2cd6f19..037244e41a9 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -8558,6 +8558,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/coroutines/intrinsicSemantics/intercepted.kt"); } + @TestMetadata("resultExceptionOrNullInLambda.kt") + public void testResultExceptionOrNullInLambda() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/intrinsicSemantics/resultExceptionOrNullInLambda.kt"); + } + @TestMetadata("startCoroutine.kt") public void testStartCoroutine() throws Exception { runTest("compiler/testData/codegen/box/coroutines/intrinsicSemantics/startCoroutine.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index 5afbd7e34c5..616a670a869 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -7668,6 +7668,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/coroutines/intrinsicSemantics/intercepted.kt"); } + @TestMetadata("resultExceptionOrNullInLambda.kt") + public void testResultExceptionOrNullInLambda() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/intrinsicSemantics/resultExceptionOrNullInLambda.kt"); + } + @TestMetadata("startCoroutine.kt") public void testStartCoroutine() throws Exception { runTest("compiler/testData/codegen/box/coroutines/intrinsicSemantics/startCoroutine.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 9f7051e24cb..037a75ef67b 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -7153,6 +7153,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/coroutines/intrinsicSemantics/intercepted.kt"); } + @TestMetadata("resultExceptionOrNullInLambda.kt") + public void testResultExceptionOrNullInLambda() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/intrinsicSemantics/resultExceptionOrNullInLambda.kt"); + } + @TestMetadata("startCoroutine.kt") public void testStartCoroutine() throws Exception { runTest("compiler/testData/codegen/box/coroutines/intrinsicSemantics/startCoroutine.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index bd0136b67db..1051675f628 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -7153,6 +7153,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/coroutines/intrinsicSemantics/intercepted.kt"); } + @TestMetadata("resultExceptionOrNullInLambda.kt") + public void testResultExceptionOrNullInLambda() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/intrinsicSemantics/resultExceptionOrNullInLambda.kt"); + } + @TestMetadata("startCoroutine.kt") public void testStartCoroutine() throws Exception { runTest("compiler/testData/codegen/box/coroutines/intrinsicSemantics/startCoroutine.kt"); -- GitLab