From 4f171a9eb511823f5f3507d335dc3cb0d2d913c5 Mon Sep 17 00:00:00 2001 From: pyos Date: Fri, 25 Sep 2020 15:34:22 +0200 Subject: [PATCH] JVM_IR: move FunctionReference lowering before PropertyReference so that `$$delegatedProperties` are generated in the lambdas' classes. --- .../org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt | 2 +- .../src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt | 2 +- .../backend/jvm/codegen/DescriptorMetadataSerializer.kt | 2 +- .../kotlin/backend/jvm/lower/FunctionReferenceLowering.kt | 7 +++++-- .../kotlin/backend/jvm/lower/PropertyReferenceLowering.kt | 7 +++++-- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt index 646b4ee03c4..9d7f73a24c3 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt @@ -96,7 +96,7 @@ class JvmBackendContext( internal val classCodegens = mutableMapOf() - val localDelegatedProperties = mutableMapOf>() + val localDelegatedProperties = mutableMapOf>() internal val multifileFacadesToAdd = mutableMapOf>() val multifileFacadeForPart = mutableMapOf() diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt index 4d6ca5f70c9..07bd14eb831 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt @@ -289,6 +289,7 @@ private val jvmFilePhases = listOf( moveOrCopyCompanionObjectFieldsPhase, inlineCallableReferenceToLambdaPhase, + functionReferencePhase, propertyReferencePhase, constPhase, propertiesPhase, @@ -310,7 +311,6 @@ private val jvmFilePhases = listOf( enumWhenPhase, singletonReferencesPhase, - functionReferencePhase, singleAbstractMethodPhase, assertionPhase, returnableBlocksPhase, diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/DescriptorMetadataSerializer.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/DescriptorMetadataSerializer.kt index f15cff12a48..5d05790cce0 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/DescriptorMetadataSerializer.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/DescriptorMetadataSerializer.kt @@ -37,7 +37,7 @@ class DescriptorMetadataSerializer( } override fun serialize(metadata: MetadataSource): Pair? { - val localDelegatedProperties = (irClass.attributeOwnerId as? IrClass)?.let(context.localDelegatedProperties::get) + val localDelegatedProperties = context.localDelegatedProperties[irClass.attributeOwnerId] if (localDelegatedProperties != null && localDelegatedProperties.isNotEmpty()) { context.state.bindingTrace.record( CodegenBinding.DELEGATED_PROPERTIES_WITH_METADATA, diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt index d7e121760d6..217335d48d0 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt @@ -475,8 +475,11 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext) 0, //don't pass receivers otherwise LocalDeclarationLowering will create additional captured parameters IrFunctionReferenceImpl( - UNDEFINED_OFFSET, UNDEFINED_OFFSET, irFunctionReference.type, target, 0, irFunctionReference.reflectionTarget, null - ) + UNDEFINED_OFFSET, UNDEFINED_OFFSET, irFunctionReference.type, target, + irFunctionReference.typeArgumentsCount, irFunctionReference.reflectionTarget, null + ).apply { + copyTypeArgumentsFrom(irFunctionReference) + } ) } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt index f5006fe59fd..a6d62b1011a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt @@ -48,7 +48,10 @@ import org.jetbrains.kotlin.types.Variance internal val propertyReferencePhase = makeIrFilePhase( ::PropertyReferenceLowering, name = "PropertyReference", - description = "Construct KProperty instances returned by expressions such as A::x and A()::x" + description = "Construct KProperty instances returned by expressions such as A::x and A()::x", + // This must be done after contents of functions are extracted into separate classes, or else the `$$delegatedProperties` + // field will end up in the wrong class (not the one that declares the delegated property). + prerequisite = setOf(functionReferencePhase) ) internal class PropertyReferenceLowering(val context: JvmBackendContext) : ClassLoweringPass { @@ -413,7 +416,7 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : Class } }) - context.localDelegatedProperties[irClass.attributeOwnerId as IrClass] = + context.localDelegatedProperties[irClass.attributeOwnerId] = kProperties.keys.filterIsInstance() } }