From c5ffbfd33c4c65fdd088df12f09db380739276b9 Mon Sep 17 00:00:00 2001 From: pyos Date: Thu, 20 Feb 2020 12:33:25 +0100 Subject: [PATCH] JVM_IR: mark origins of capture fields in suspend lambdas --- .../backend/jvm/lower/AddContinuationLowering.kt | 13 ++++++++++++- .../bridges/lambdaWithLongReceiver_ir.txt | 2 +- .../bridges/lambdaWithMultipleParameters_ir.txt | 14 +++++++------- .../tailCallOptimizations/crossinline_ir.txt | 2 +- .../inlineWithoutStateMachine_ir.txt | 2 +- ...eSuspendLambdaInsideCrossinlineSuspendLambda.kt | 2 -- 6 files changed, 22 insertions(+), 13 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt index 8f5e8a3feca..7aada0d655c 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt @@ -178,7 +178,18 @@ private class AddContinuationLowering(private val context: JvmBackendContext) : addField("p\$", it.type) } - val parametersFields = info.function.valueParameters.map { addField(it.name, it.type) } + val parametersFields = info.function.valueParameters.map { + addField { + name = it.name + type = it.type + origin = if (it.isCrossinline) + LocalDeclarationsLowering.DECLARATION_ORIGIN_FIELD_FOR_CROSSINLINE_CAPTURED_VALUE + else + LocalDeclarationsLowering.DECLARATION_ORIGIN_FIELD_FOR_CAPTURED_VALUE + isFinal = true + visibility = JavaVisibilities.PACKAGE_VISIBILITY + } + } val parametersWithoutArguments = parametersFields.withIndex() .mapNotNull { (i, field) -> if (info.reference.getValueArgument(i) == null) field else null } val parametersWithArguments = parametersFields.withIndex() diff --git a/compiler/testData/codegen/box/coroutines/bridges/lambdaWithLongReceiver_ir.txt b/compiler/testData/codegen/box/coroutines/bridges/lambdaWithLongReceiver_ir.txt index 8bc554b8b3b..f2b06345f4d 100644 --- a/compiler/testData/codegen/box/coroutines/bridges/lambdaWithLongReceiver_ir.txt +++ b/compiler/testData/codegen/box/coroutines/bridges/lambdaWithLongReceiver_ir.txt @@ -14,7 +14,7 @@ final class LambdaWithLongReceiverKt$box$1$1 { @kotlin.coroutines.jvm.internal.DebugMetadata @kotlin.Metadata final class LambdaWithLongReceiverKt$box$1 { - private field $res: kotlin.jvm.internal.Ref$ObjectRef + synthetic final @org.jetbrains.annotations.NotNull field $res: kotlin.jvm.internal.Ref$ObjectRef field L$0: java.lang.Object private field label: int inner class LambdaWithLongReceiverKt$box$1 diff --git a/compiler/testData/codegen/box/coroutines/bridges/lambdaWithMultipleParameters_ir.txt b/compiler/testData/codegen/box/coroutines/bridges/lambdaWithMultipleParameters_ir.txt index 4763af0e576..0f616ac3279 100644 --- a/compiler/testData/codegen/box/coroutines/bridges/lambdaWithMultipleParameters_ir.txt +++ b/compiler/testData/codegen/box/coroutines/bridges/lambdaWithMultipleParameters_ir.txt @@ -1,12 +1,12 @@ @kotlin.coroutines.jvm.internal.DebugMetadata @kotlin.Metadata final class LambdaWithMultipleParametersKt$box$1$1 { - private field a: java.lang.String - private field b: long - private field c: long - private field d: long - private field e: long - private field f: long + synthetic final @org.jetbrains.annotations.NotNull field a: java.lang.String + synthetic final field b: long + synthetic final field c: long + synthetic final field d: long + synthetic final field e: long + synthetic final field f: long private field label: int inner class LambdaWithMultipleParametersKt$box$1 inner class LambdaWithMultipleParametersKt$box$1$1 @@ -18,7 +18,7 @@ final class LambdaWithMultipleParametersKt$box$1$1 { @kotlin.coroutines.jvm.internal.DebugMetadata @kotlin.Metadata final class LambdaWithMultipleParametersKt$box$1 { - private field $res: kotlin.jvm.internal.Ref$ObjectRef + synthetic final @org.jetbrains.annotations.NotNull field $res: kotlin.jvm.internal.Ref$ObjectRef field L$0: java.lang.Object private field label: int inner class LambdaWithMultipleParametersKt$box$1 diff --git a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline_ir.txt b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline_ir.txt index c1609cb539a..055036c55e2 100644 --- a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline_ir.txt +++ b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline_ir.txt @@ -56,7 +56,7 @@ public final class CrossinlineKt$box$1$invokeSuspend$$inlined$fold$1 { @kotlin.coroutines.jvm.internal.DebugMetadata @kotlin.Metadata final class CrossinlineKt$box$1 { - private field $res: kotlin.jvm.internal.Ref$IntRef + synthetic final @org.jetbrains.annotations.NotNull field $res: kotlin.jvm.internal.Ref$IntRef field L$0: java.lang.Object field L$1: java.lang.Object field L$2: java.lang.Object diff --git a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/inlineWithoutStateMachine_ir.txt b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/inlineWithoutStateMachine_ir.txt index d5dde4a8723..44134fbf1d5 100644 --- a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/inlineWithoutStateMachine_ir.txt +++ b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/inlineWithoutStateMachine_ir.txt @@ -1,7 +1,7 @@ @kotlin.coroutines.jvm.internal.DebugMetadata @kotlin.Metadata final class InlineWithoutStateMachineKt$box$1 { - private field $result: kotlin.jvm.internal.Ref$ObjectRef + synthetic final @org.jetbrains.annotations.NotNull field $result: kotlin.jvm.internal.Ref$ObjectRef field L$0: java.lang.Object field L$1: java.lang.Object private field label: int diff --git a/compiler/testData/codegen/boxInline/suspend/crossinlineSuspendLambdaInsideCrossinlineSuspendLambda.kt b/compiler/testData/codegen/boxInline/suspend/crossinlineSuspendLambdaInsideCrossinlineSuspendLambda.kt index 83d15d96c40..a5075cb2728 100644 --- a/compiler/testData/codegen/boxInline/suspend/crossinlineSuspendLambdaInsideCrossinlineSuspendLambda.kt +++ b/compiler/testData/codegen/boxInline/suspend/crossinlineSuspendLambdaInsideCrossinlineSuspendLambda.kt @@ -2,8 +2,6 @@ // COMMON_COROUTINES_TEST // WITH_RUNTIME // WITH_COROUTINES -// IGNORE_BACKEND: JVM_IR -// IGNORE_BACKEND_MULTI_MODULE: JVM_IR import COROUTINES_PACKAGE.* import helpers.*