diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/TransformationInfo.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/TransformationInfo.kt index 54a28a963c6..ef093536e94 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/TransformationInfo.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/TransformationInfo.kt @@ -97,9 +97,9 @@ class AnonymousObjectTransformationInfo internal constructor( nameGenerator: NameGenerator ) : this(ownerInternalName, needReification, hashMapOf(), false, alreadyRegenerated, null, isStaticOrigin, nameGenerator) - override fun shouldRegenerate(sameModule: Boolean): Boolean = - !alreadyRegenerated && - (!functionalArguments.isEmpty() || !sameModule || capturedOuterRegenerated || needReification || capturesAnonymousObjectThatMustBeRegenerated) + override fun shouldRegenerate(sameModule: Boolean): Boolean = !alreadyRegenerated && + (!sameModule || capturedOuterRegenerated || needReification || capturesAnonymousObjectThatMustBeRegenerated || + functionalArguments.values.any { it != NonInlineableArgumentForInlineableParameterCalledInSuspend }) override fun canRemoveAfterTransformation(): Boolean { // Note: It is unsafe to remove anonymous class that is referenced by GETSTATIC within lambda diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt index f8680fb8133..d30c289414c 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt @@ -661,7 +661,7 @@ class LocalDeclarationsLowering( localFunctionContext.remapType(p.type), null, isCrossinline = (capturedValue as? IrValueParameterSymbol)?.owner?.isCrossinline == true, - isNoinline = false + isNoinline = (capturedValue as? IrValueParameterSymbol)?.owner?.isNoinline == true ).also { parameterDescriptor.bind(it) it.parent = newDeclaration diff --git a/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation_ir.txt b/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation_ir.txt index 2bfcbabf4b6..49d2c6720c0 100644 --- a/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation_ir.txt @@ -212,28 +212,6 @@ public final class TcoContinuationKt$transform$$inlined$flow$1$1 { public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object } -@kotlin.Metadata -public final class TcoContinuationKt$transform$$inlined$flow$1$lambda$1$1 { - field label: int - synthetic field result: java.lang.Object - synthetic final field this$0: TcoContinuationKt$transform$$inlined$flow$1$lambda$1 - inner class TcoContinuationKt$transform$$inlined$flow$1$lambda$1 - inner class TcoContinuationKt$transform$$inlined$flow$1$lambda$1$1 - public method (p0: TcoContinuationKt$transform$$inlined$flow$1$lambda$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 -} - -@kotlin.Metadata -public final class TcoContinuationKt$transform$$inlined$flow$1$lambda$1 { - synthetic final field $this$inlined: FlowCollector - synthetic final field $transformer$inlined: kotlin.jvm.functions.Function3 - inner class TcoContinuationKt$transform$$inlined$flow$1$lambda$1 - inner class TcoContinuationKt$transform$$inlined$flow$1$lambda$1$1 - public method (p0: kotlin.jvm.functions.Function3, p1: FlowCollector): void - public @org.jetbrains.annotations.Nullable method emit$$forInline(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object - public @org.jetbrains.annotations.Nullable method emit(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object -} - @kotlin.Metadata public final class TcoContinuationKt$transform$$inlined$flow$1 { synthetic final field $this$inlined: Flow @@ -256,28 +234,6 @@ public final class TcoContinuationKt$transform$$inlined$flow$2$1 { public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object } -@kotlin.Metadata -public final class TcoContinuationKt$transform$$inlined$flow$2$lambda$1$1 { - field label: int - synthetic field result: java.lang.Object - synthetic final field this$0: TcoContinuationKt$transform$$inlined$flow$2$lambda$1 - inner class TcoContinuationKt$transform$$inlined$flow$2$lambda$1 - inner class TcoContinuationKt$transform$$inlined$flow$2$lambda$1$1 - public method (p0: TcoContinuationKt$transform$$inlined$flow$2$lambda$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 -} - -@kotlin.Metadata -public final class TcoContinuationKt$transform$$inlined$flow$2$lambda$1 { - synthetic final field $this$inlined: FlowCollector - synthetic final field $transformer$inlined: kotlin.jvm.functions.Function3 - inner class TcoContinuationKt$transform$$inlined$flow$2$lambda$1 - inner class TcoContinuationKt$transform$$inlined$flow$2$lambda$1$1 - public method (p0: kotlin.jvm.functions.Function3, p1: FlowCollector): void - public @org.jetbrains.annotations.Nullable method emit$$forInline(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object - public @org.jetbrains.annotations.Nullable method emit(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object -} - @kotlin.Metadata public final class TcoContinuationKt$transform$$inlined$flow$2 { synthetic final field $this$inlined: Flow @@ -300,28 +256,6 @@ public final class TcoContinuationKt$transform$$inlined$flow$3$1 { public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object } -@kotlin.Metadata -public final class TcoContinuationKt$transform$$inlined$flow$3$lambda$1$1 { - field label: int - synthetic field result: java.lang.Object - synthetic final field this$0: TcoContinuationKt$transform$$inlined$flow$3$lambda$1 - inner class TcoContinuationKt$transform$$inlined$flow$3$lambda$1 - inner class TcoContinuationKt$transform$$inlined$flow$3$lambda$1$1 - public method (p0: TcoContinuationKt$transform$$inlined$flow$3$lambda$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 -} - -@kotlin.Metadata -public final class TcoContinuationKt$transform$$inlined$flow$3$lambda$1 { - synthetic final field $this$inlined: FlowCollector - synthetic final field $transformer$inlined: kotlin.jvm.functions.Function3 - inner class TcoContinuationKt$transform$$inlined$flow$3$lambda$1 - inner class TcoContinuationKt$transform$$inlined$flow$3$lambda$1$1 - public method (p0: kotlin.jvm.functions.Function3, p1: FlowCollector): void - public @org.jetbrains.annotations.Nullable method emit$$forInline(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object - public @org.jetbrains.annotations.Nullable method emit(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object -} - @kotlin.Metadata public final class TcoContinuationKt$transform$$inlined$flow$3 { synthetic final field $this$inlined: Flow @@ -333,6 +267,72 @@ public final class TcoContinuationKt$transform$$inlined$flow$3 { public @org.jetbrains.annotations.Nullable method collect(@org.jetbrains.annotations.NotNull p0: FlowCollector, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object } +@kotlin.Metadata +public final class TcoContinuationKt$transform$lambda-1$$inlined$collect$1$1 { + field label: int + synthetic field result: java.lang.Object + synthetic final field this$0: TcoContinuationKt$transform$lambda-1$$inlined$collect$1 + inner class TcoContinuationKt$transform$lambda-1$$inlined$collect$1 + inner class TcoContinuationKt$transform$lambda-1$$inlined$collect$1$1 + public method (p0: TcoContinuationKt$transform$lambda-1$$inlined$collect$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 +} + +@kotlin.Metadata +public final class TcoContinuationKt$transform$lambda-1$$inlined$collect$1 { + synthetic final field $this$inlined: FlowCollector + synthetic final field $transformer$inlined: kotlin.jvm.functions.Function3 + inner class TcoContinuationKt$transform$lambda-1$$inlined$collect$1 + inner class TcoContinuationKt$transform$lambda-1$$inlined$collect$1$1 + public method (p0: kotlin.jvm.functions.Function3, p1: FlowCollector): void + public @org.jetbrains.annotations.Nullable method emit$$forInline(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object + public @org.jetbrains.annotations.Nullable method emit(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object +} + +@kotlin.Metadata +public final class TcoContinuationKt$transform$lambda-1$$inlined$collect$2$1 { + field label: int + synthetic field result: java.lang.Object + synthetic final field this$0: TcoContinuationKt$transform$lambda-1$$inlined$collect$2 + inner class TcoContinuationKt$transform$lambda-1$$inlined$collect$2 + inner class TcoContinuationKt$transform$lambda-1$$inlined$collect$2$1 + public method (p0: TcoContinuationKt$transform$lambda-1$$inlined$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 +} + +@kotlin.Metadata +public final class TcoContinuationKt$transform$lambda-1$$inlined$collect$2 { + synthetic final field $this$inlined: FlowCollector + synthetic final field $transformer$inlined: kotlin.jvm.functions.Function3 + inner class TcoContinuationKt$transform$lambda-1$$inlined$collect$2 + inner class TcoContinuationKt$transform$lambda-1$$inlined$collect$2$1 + public method (p0: kotlin.jvm.functions.Function3, p1: FlowCollector): void + public @org.jetbrains.annotations.Nullable method emit$$forInline(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object + public @org.jetbrains.annotations.Nullable method emit(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object +} + +@kotlin.Metadata +public final class TcoContinuationKt$transform$lambda-1$$inlined$collect$3$1 { + field label: int + synthetic field result: java.lang.Object + synthetic final field this$0: TcoContinuationKt$transform$lambda-1$$inlined$collect$3 + inner class TcoContinuationKt$transform$lambda-1$$inlined$collect$3 + inner class TcoContinuationKt$transform$lambda-1$$inlined$collect$3$1 + public method (p0: TcoContinuationKt$transform$lambda-1$$inlined$collect$3, p1: kotlin.coroutines.Continuation): void + public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object +} + +@kotlin.Metadata +public final class TcoContinuationKt$transform$lambda-1$$inlined$collect$3 { + synthetic final field $this$inlined: FlowCollector + synthetic final field $transformer$inlined: kotlin.jvm.functions.Function3 + inner class TcoContinuationKt$transform$lambda-1$$inlined$collect$3 + inner class TcoContinuationKt$transform$lambda-1$$inlined$collect$3$1 + public method (p0: kotlin.jvm.functions.Function3, p1: FlowCollector): void + public @org.jetbrains.annotations.Nullable method emit$$forInline(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object + public @org.jetbrains.annotations.Nullable method emit(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object +} + @kotlin.Metadata public final class TcoContinuationKt { inner class TcoContinuationKt$collect$2