From 5c92da3f35bc3c7261bcda372244f2fb5a3da937 Mon Sep 17 00:00:00 2001 From: Ilmir Usmanov Date: Thu, 12 Dec 2019 18:36:20 +0100 Subject: [PATCH] JVM_IR: Do not generate parameter annotations for continuation constructors The idea is the same as in case of anonymous objects: they are created only from Kotlin code, so we are sure, that the parameters are valid. Also, the inliner complains on their transformations. --- .../kotlin/codegen/inline/MethodInliner.kt | 6 ------ .../kotlin/backend/jvm/codegen/FunctionCodegen.kt | 15 ++++++++++----- .../bridges/lambdaWithLongReceiver_ir.txt | 6 +++--- .../bridges/lambdaWithMultipleParameters_ir.txt | 6 +++--- compiler/testData/codegen/box/coroutines/epam.kt | 1 - .../coroutines/multiModule/inlineCrossModule.kt | 1 - .../inlineWithoutStateMachine_ir.txt | 6 +++--- .../innerObjectRetransformation_ir.txt | 8 ++++---- 8 files changed, 23 insertions(+), 26 deletions(-) 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 e662bc5b14a..3d7bd951cb7 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.kt @@ -131,12 +131,6 @@ class MethodInliner( processReturns(resultNode, returnLabelOwner, remapReturn, end) //flush transformed node to output - // TODO: HACK resultNode's invisibleParameterAnnotations' size is greater than adapter's - if (resultNode.name == "" && resultNode.desc.contains("Lkotlin/coroutines/Continuation;") && - inliningContext.root.state.isIrBackend - ) { - resultNode.invisibleParameterAnnotations = null - } resultNode.accept(SkipMaxAndEndVisitor(adapter)) sourceMapper.endMapping() diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt index cd59d547bb5..78d707bdbbf 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt @@ -68,11 +68,8 @@ open class FunctionCodegen( ) } - // Since the only arguments to anonymous object constructors are captured variables and complex - // super constructor arguments, there shouldn't be any annotations on them other than @NonNull, - // and those are meaningless on synthetic parameters. (Also, the inliner cannot handle them and - // will throw an exception if we generate any.) - if (irFunction !is IrConstructor || !irFunction.parentAsClass.isAnonymousObject) { + + if (irFunction !is IrConstructor || !irFunction.parentAsClass.shouldNotGenerateConstructorParameterAnnotations()) { generateParameterAnnotations(functionView, methodVisitor, signature, classCodegen, context) } @@ -110,6 +107,14 @@ open class FunctionCodegen( return signature } + // Since the only arguments to anonymous object constructors are captured variables and complex + // super constructor arguments, there shouldn't be any annotations on them other than @NonNull, + // and those are meaningless on synthetic parameters. (Also, the inliner cannot handle them and + // will throw an exception if we generate any.) + // The same applies for continuations. + private fun IrClass.shouldNotGenerateConstructorParameterAnnotations() = + isAnonymousObject || origin == JvmLoweredDeclarationOrigin.CONTINUATION_CLASS || origin == JvmLoweredDeclarationOrigin.SUSPEND_LAMBDA + private fun psiElement(): KtElement = if (irFunction.isSuspend) irFunction.symbol.descriptor.psiElement as KtElement else context.suspendLambdaToOriginalFunctionMap[irFunction.parentAsClass.attributeOwnerId]!!.symbol.descriptor.psiElement as KtElement diff --git a/compiler/testData/codegen/box/coroutines/bridges/lambdaWithLongReceiver_ir.txt b/compiler/testData/codegen/box/coroutines/bridges/lambdaWithLongReceiver_ir.txt index 159b90bc0a6..c8f7bc41449 100644 --- a/compiler/testData/codegen/box/coroutines/bridges/lambdaWithLongReceiver_ir.txt +++ b/compiler/testData/codegen/box/coroutines/bridges/lambdaWithLongReceiver_ir.txt @@ -5,7 +5,7 @@ final class LambdaWithLongReceiverKt$box$1$1 { private field label: int inner class LambdaWithLongReceiverKt$box$1 inner class LambdaWithLongReceiverKt$box$1$1 - public method (@org.jetbrains.annotations.Nullable p0: kotlin.coroutines.Continuation): void + public method (p0: kotlin.coroutines.Continuation): void public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.Nullable p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): kotlin.coroutines.Continuation public final method invoke(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object @@ -19,7 +19,7 @@ final class LambdaWithLongReceiverKt$box$1 { private field label: int inner class LambdaWithLongReceiverKt$box$1 inner class LambdaWithLongReceiverKt$box$1$1 - public method (@org.jetbrains.annotations.NotNull p0: kotlin.jvm.internal.Ref$ObjectRef, @org.jetbrains.annotations.Nullable p1: kotlin.coroutines.Continuation): void + public method (p0: kotlin.jvm.internal.Ref$ObjectRef, p1: kotlin.coroutines.Continuation): void public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): kotlin.coroutines.Continuation public final method invoke(p0: java.lang.Object): java.lang.Object public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object @@ -29,7 +29,7 @@ final class LambdaWithLongReceiverKt$box$1 { final class LambdaWithLongReceiverKt$call$1 { field label: int @org.jetbrains.annotations.NotNull field result: java.lang.Object - public method (@org.jetbrains.annotations.Nullable p0: kotlin.coroutines.Continuation): void + public method (p0: kotlin.coroutines.Continuation): void public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object } diff --git a/compiler/testData/codegen/box/coroutines/bridges/lambdaWithMultipleParameters_ir.txt b/compiler/testData/codegen/box/coroutines/bridges/lambdaWithMultipleParameters_ir.txt index 320a45d2a85..4763af0e576 100644 --- a/compiler/testData/codegen/box/coroutines/bridges/lambdaWithMultipleParameters_ir.txt +++ b/compiler/testData/codegen/box/coroutines/bridges/lambdaWithMultipleParameters_ir.txt @@ -10,7 +10,7 @@ final class LambdaWithMultipleParametersKt$box$1$1 { private field label: int inner class LambdaWithMultipleParametersKt$box$1 inner class LambdaWithMultipleParametersKt$box$1$1 - public method (@org.jetbrains.annotations.Nullable p0: kotlin.coroutines.Continuation): void + public method (p0: kotlin.coroutines.Continuation): void public final method invoke(p0: java.lang.Object, p1: java.lang.Object, p2: java.lang.Object, p3: java.lang.Object, p4: java.lang.Object, p5: java.lang.Object, p6: java.lang.Object): java.lang.Object public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object } @@ -23,7 +23,7 @@ final class LambdaWithMultipleParametersKt$box$1 { private field label: int inner class LambdaWithMultipleParametersKt$box$1 inner class LambdaWithMultipleParametersKt$box$1$1 - public method (@org.jetbrains.annotations.NotNull p0: kotlin.jvm.internal.Ref$ObjectRef, @org.jetbrains.annotations.Nullable p1: kotlin.coroutines.Continuation): void + public method (p0: kotlin.jvm.internal.Ref$ObjectRef, p1: kotlin.coroutines.Continuation): void public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): kotlin.coroutines.Continuation public final method invoke(p0: java.lang.Object): java.lang.Object public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object @@ -33,7 +33,7 @@ final class LambdaWithMultipleParametersKt$box$1 { final class LambdaWithMultipleParametersKt$call$1 { field label: int @org.jetbrains.annotations.NotNull field result: java.lang.Object - public method (@org.jetbrains.annotations.Nullable p0: kotlin.coroutines.Continuation): void + public method (p0: kotlin.coroutines.Continuation): void public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object } diff --git a/compiler/testData/codegen/box/coroutines/epam.kt b/compiler/testData/codegen/box/coroutines/epam.kt index 7e30276711e..89ff451811c 100644 --- a/compiler/testData/codegen/box/coroutines/epam.kt +++ b/compiler/testData/codegen/box/coroutines/epam.kt @@ -1,5 +1,4 @@ // IGNORE_BACKEND_FIR: JVM_IR -// IGNORE_BACKEND: JVM_IR // FULL_JDK // COMMON_COROUTINES_TEST // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/coroutines/multiModule/inlineCrossModule.kt b/compiler/testData/codegen/box/coroutines/multiModule/inlineCrossModule.kt index f21d394399e..652b1bd36e8 100644 --- a/compiler/testData/codegen/box/coroutines/multiModule/inlineCrossModule.kt +++ b/compiler/testData/codegen/box/coroutines/multiModule/inlineCrossModule.kt @@ -1,5 +1,4 @@ // IGNORE_BACKEND_FIR: JVM_IR -// IGNORE_BACKEND: JVM_IR // IGNORE_BACKEND: NATIVE // WITH_COROUTINES // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/inlineWithoutStateMachine_ir.txt b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/inlineWithoutStateMachine_ir.txt index f3fa064975e..539dacea245 100644 --- a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/inlineWithoutStateMachine_ir.txt +++ b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/inlineWithoutStateMachine_ir.txt @@ -6,7 +6,7 @@ final class InlineWithoutStateMachineKt$box$1 { field L$1: java.lang.Object private field label: int inner class InlineWithoutStateMachineKt$box$1 - public method (@org.jetbrains.annotations.NotNull p0: kotlin.jvm.internal.Ref$ObjectRef, @org.jetbrains.annotations.Nullable p1: kotlin.coroutines.Continuation): void + public method (p0: kotlin.jvm.internal.Ref$ObjectRef, p1: kotlin.coroutines.Continuation): void public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): kotlin.coroutines.Continuation public final method invoke(p0: java.lang.Object): java.lang.Object public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object @@ -19,7 +19,7 @@ final class InlineWithoutStateMachineKt$complexSuspend$1 { field L$1: java.lang.Object field label: int @org.jetbrains.annotations.NotNull field result: java.lang.Object - public method (@org.jetbrains.annotations.Nullable p0: kotlin.coroutines.Continuation): void + public method (p0: kotlin.coroutines.Continuation): void public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object } @@ -29,7 +29,7 @@ final class InlineWithoutStateMachineKt$suspendHere$1 { field L$0: java.lang.Object field label: int @org.jetbrains.annotations.NotNull field result: java.lang.Object - public method (@org.jetbrains.annotations.Nullable p0: kotlin.coroutines.Continuation): void + public method (p0: kotlin.coroutines.Continuation): void public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object } diff --git a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/innerObjectRetransformation_ir.txt b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/innerObjectRetransformation_ir.txt index 49b02cf8b6b..fbcb48a83a7 100644 --- a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/innerObjectRetransformation_ir.txt +++ b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/innerObjectRetransformation_ir.txt @@ -13,7 +13,7 @@ public interface flow/FlowCollector { final class flow/InnerObjectRetransformationKt$box$1 { private field label: int inner class flow/InnerObjectRetransformationKt$box$1 - public method (@org.jetbrains.annotations.Nullable p0: kotlin.coroutines.Continuation): void + public method (p0: kotlin.coroutines.Continuation): void public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): kotlin.coroutines.Continuation public final method invoke(p0: java.lang.Object): java.lang.Object public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object @@ -72,7 +72,7 @@ final class flow/InnerObjectRetransformationKt$check$1 { field L$0: java.lang.Object field label: int @org.jetbrains.annotations.NotNull field result: java.lang.Object - public method (@org.jetbrains.annotations.Nullable p0: kotlin.coroutines.Continuation): void + public method (p0: kotlin.coroutines.Continuation): void public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object } @@ -81,7 +81,7 @@ final class flow/InnerObjectRetransformationKt$collect$2$emit$1 { field label: int @org.jetbrains.annotations.NotNull field result: java.lang.Object private field this$0: flow.InnerObjectRetransformationKt$collect$2 - public method (@org.jetbrains.annotations.NotNull p0: flow.InnerObjectRetransformationKt$collect$2, @org.jetbrains.annotations.Nullable p1: kotlin.coroutines.Continuation): void + public method (p0: flow.InnerObjectRetransformationKt$collect$2, p1: kotlin.coroutines.Continuation): void public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object } @@ -99,7 +99,7 @@ final class flow/InnerObjectRetransformationKt$flow$1$collect$1 { field label: int @org.jetbrains.annotations.NotNull field result: java.lang.Object private field this$0: flow.InnerObjectRetransformationKt$flow$1 - public method (@org.jetbrains.annotations.NotNull p0: flow.InnerObjectRetransformationKt$flow$1, @org.jetbrains.annotations.Nullable p1: kotlin.coroutines.Continuation): void + public method (p0: flow.InnerObjectRetransformationKt$flow$1, p1: kotlin.coroutines.Continuation): void public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object }