From 3efca3d8b8230ca74011fece698340e25f6d220b Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Thu, 7 Feb 2019 16:10:37 +0300 Subject: [PATCH] [IrSerializer] Fixed issues with properties/fields --- .../serialization/IrModuleDeserializer.kt | 65 ++++++++----------- .../konan/serialization/IrModuleSerializer.kt | 4 +- .../backend/konan/serialization/KonanIr.proto | 1 + .../KonanIrModuleDeserializer.kt | 2 +- 4 files changed, 32 insertions(+), 40 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrModuleDeserializer.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrModuleDeserializer.kt index 03b7188e41c..c8f2ae896c3 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrModuleDeserializer.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrModuleDeserializer.kt @@ -388,6 +388,8 @@ abstract class IrModuleDeserializer( return IrInstanceInitializerCallImpl(start, end, symbol, builtIns.unitType) } + private val getterToPropertyDescriptorMap = mutableMapOf() + private fun deserializePropertyReference( proto: KonanIr.IrPropertyReference, start: Int, end: Int, type: IrType @@ -396,7 +398,12 @@ abstract class IrModuleDeserializer( val field = if (proto.hasField()) deserializeIrSymbol(proto.field) as IrFieldSymbol else null val getter = if (proto.hasGetter()) deserializeIrSymbol(proto.getter) as IrSimpleFunctionSymbol else null val setter = if (proto.hasSetter()) deserializeIrSymbol(proto.setter) as IrSimpleFunctionSymbol else null - val descriptor = WrappedPropertyDescriptor() + val descriptor = + if (proto.hasDescriptor()) + deserializeDescriptorReference(proto.descriptor) as PropertyDescriptor + else + field?.descriptor as? WrappedPropertyDescriptor // If field's descriptor coincides with property's. + ?: getterToPropertyDescriptorMap.getOrPut(getter!!) { WrappedPropertyDescriptor() } val callable = IrPropertyReferenceImpl( start, end, type, @@ -823,7 +830,7 @@ abstract class IrModuleDeserializer( private fun deserializeIrFunction( proto: KonanIr.IrFunction, - start: Int, end: Int, origin: IrDeclarationOrigin, correspondingProperty: IrProperty? = null + start: Int, end: Int, origin: IrDeclarationOrigin ): IrSimpleFunction { logger.log { "### deserializing IrFunction ${deserializeString(proto.base.name)}" } @@ -848,8 +855,6 @@ abstract class IrModuleDeserializer( val overridden = proto.overriddenList.map { deserializeIrSymbol(it) as IrSimpleFunctionSymbol } function.overriddenSymbols.addAll(overridden) - function.correspondingProperty = correspondingProperty - return function } @@ -999,13 +1004,20 @@ abstract class IrModuleDeserializer( origin: IrDeclarationOrigin ): IrProperty { - val backingField = if (proto.hasBackingField()) { - deserializeIrField(proto.backingField, start, end, origin) - } else null + val backingField = if (proto.hasBackingField()) deserializeIrField(proto.backingField, start, end, origin) else null + val getter = if (proto.hasGetter()) deserializeIrFunction(proto.getter, start, end, origin) else null + val setter = if (proto.hasSetter()) deserializeIrFunction(proto.setter, start, end, origin) else null + + backingField?.let { (it.descriptor as? WrappedFieldDescriptor)?.bind(it) } + getter?.let { (it.descriptor as? WrappedSimpleFunctionDescriptor)?.bind(it) } + setter?.let { (it.descriptor as? WrappedSimpleFunctionDescriptor)?.bind(it) } val descriptor = - if (proto.hasDescriptor()) deserializeDescriptorReference(proto.descriptor) as PropertyDescriptor else null - ?: WrappedPropertyDescriptor() + if (proto.hasDescriptor()) + deserializeDescriptorReference(proto.descriptor) as PropertyDescriptor + else + backingField?.descriptor as? WrappedPropertyDescriptor // If field's descriptor coincides with property's. + ?: getterToPropertyDescriptorMap.getOrPut(getter!!.symbol) { WrappedPropertyDescriptor() } val property = IrPropertyImpl( start, end, origin, @@ -1021,37 +1033,14 @@ abstract class IrModuleDeserializer( ) symbolTable.referenceProperty(descriptor, { property }) -/* - backingField?.descriptor?.let { - symbolTable.declareField(UNDEFINED_OFFSET, - UNDEFINED_OFFSET, - irrelevantOrigin, - it, - builtIns.unitType, - { symbol -> backingField }) - } -*/ + property.backingField = backingField + property.getter = getter + property.setter = setter + backingField?.let { it.correspondingProperty = property } - - property.getter = - if (proto.hasGetter()) deserializeIrFunction(proto.getter, start, end, origin, property) else null - property.setter = - if (proto.hasSetter()) deserializeIrFunction(proto.setter, start, end, origin, property) else null - - property.getter?.let { - val descriptor = it.descriptor - if (descriptor is WrappedSimpleFunctionDescriptor) descriptor.bind(it) - symbolTable.declareSimpleFunction(UNDEFINED_OFFSET, UNDEFINED_OFFSET, irrelevantOrigin, - descriptor, { symbol -> it }) - - } - property.setter?.let { - val descriptor = it.descriptor - if (descriptor is WrappedSimpleFunctionDescriptor) descriptor.bind(it) - symbolTable.declareSimpleFunction(UNDEFINED_OFFSET, UNDEFINED_OFFSET, irrelevantOrigin, - descriptor, { symbol -> it }) - } + getter?.let { it.correspondingProperty = property } + setter?.let { it.correspondingProperty = property } return property } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrModuleSerializer.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrModuleSerializer.kt index 43f075647f6..c06d8ec90e0 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrModuleSerializer.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrModuleSerializer.kt @@ -129,7 +129,7 @@ internal class IrModuleSerializer( is IrReturnableBlockSymbol -> KonanIr.IrSymbolKind.RETURNABLE_BLOCK_SYMBOL is IrFieldSymbol -> - if (symbol.owner.correspondingProperty == null) + if (symbol.owner.correspondingProperty.let { it == null || it.isDelegated }) KonanIr.IrSymbolKind.STANDALONE_FIELD_SYMBOL else KonanIr.IrSymbolKind.FIELD_SYMBOL @@ -430,6 +430,8 @@ internal class IrModuleSerializer( callable.getter?.let { proto.getter = serializeIrSymbol(it) } callable.setter?.let { proto.setter = serializeIrSymbol(it) } callable.origin?.let { proto.origin = serializeIrStatementOrigin(it) } + val property = callable.getter!!.owner.correspondingProperty!! + descriptorReferenceSerializer.serializeDescriptorReference(property)?.let { proto.setDescriptor(it) } return proto.build() } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIr.proto b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIr.proto index 7539b3037a2..dfd2cea0bfa 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIr.proto +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIr.proto @@ -251,6 +251,7 @@ message IrPropertyReference { optional IrSymbol setter = 3; optional IrStatementOrigin origin = 4; required MemberAccessCommon member_access = 5; + optional DescriptorReference descriptor = 6; // IrProperty doesn't have a symbol at all. Preserve this rudiment for now. } message IrComposite { diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrModuleDeserializer.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrModuleDeserializer.kt index 2b7db51ac75..b1169096e5d 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrModuleDeserializer.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrModuleDeserializer.kt @@ -99,7 +99,7 @@ class KonanIrModuleDeserializer( ?: WrappedEnumEntryDescriptor() ) KonanIr.IrSymbolKind.STANDALONE_FIELD_SYMBOL -> - IrFieldSymbolImpl(WrappedFieldDescriptor()) + symbolTable.referenceField(WrappedFieldDescriptor()) KonanIr.IrSymbolKind.FIELD_SYMBOL -> symbolTable.referenceField(