From 0859abbb9d4b8e30e8ea2ff5183f5b07a78835f7 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Wed, 26 Apr 2017 23:31:33 +0300 Subject: [PATCH] Somewhat simplified descriptor management for IR serialization. The public descriptors don't need to keep their containing declaration index. KonanIr.KotlinDescriptor already has this index, so use it instead. That allows to remove some more clutter from KonanLinkData. --- .../serialization/IrDescriptorDeserializer.kt | 20 ++++++------ .../backend/konan/serialization/KonanIr.proto | 4 ++- .../konan/serialization/KonanLinkData.proto | 3 -- .../serialization/KonanSerializerExtension.kt | 18 ----------- .../LocalDeclarationDeserializer.kt | 22 +++++++------ .../konan/serialization/ProtobufUtil.kt | 32 ------------------- 6 files changed, 25 insertions(+), 74 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrDescriptorDeserializer.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrDescriptorDeserializer.kt index b1f7bc6b1de..0cf20d5b910 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrDescriptorDeserializer.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrDescriptorDeserializer.kt @@ -79,25 +79,26 @@ internal class IrDescriptorDeserializer(val context: Context, context.log{"### deserialized Kotlin Type index=$index, text=$text:\t$realType"} return realType } - fun deserializeLocalDeclaration(irProto: KonanIr.KotlinDescriptor, proto: KonanIr.DeclarationDescriptor): DeclarationDescriptor { + fun deserializeLocalDeclaration(irProto: KonanIr.KotlinDescriptor): DeclarationDescriptor { + val localDeclarationProto = irProto.irLocalDeclaration.descriptor when { - proto.hasFunction() -> { - val functionProto = proto.function + localDeclarationProto.hasFunction() -> { + val functionProto = localDeclarationProto.function val index = irProto.index - val descriptor = localDeserializer.deserializeFunction(functionProto) + val descriptor = localDeserializer.deserializeFunction(irProto) descriptorIndex.put(index, descriptor) return descriptor } - proto.hasProperty() -> { - val propertyProto = proto.property + localDeclarationProto.hasProperty() -> { + val propertyProto = localDeclarationProto.property val index = irProto.index - val descriptor = localDeserializer.deserializeProperty(propertyProto) + val descriptor = localDeserializer.deserializeProperty(irProto) descriptorIndex.put(index, descriptor) return descriptor } // TODO - // proto.hasClazz() -> + // localDclarationProto.hasClazz() -> else -> TODO("Unexpected descriptor kind") } } @@ -135,8 +136,7 @@ internal class IrDescriptorDeserializer(val context: Context, context.log{"### deserializeDescriptor ${proto.kind} ${proto.index}"} val descriptor = if (proto.hasIrLocalDeclaration()) { - val realDescriptor = proto.irLocalDeclaration.descriptor - deserializeLocalDeclaration(proto, realDescriptor) + deserializeLocalDeclaration(proto) } else deserializeKnownDescriptor(proto) 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 ebf80e19bb7..22d70932516 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 @@ -3,7 +3,6 @@ syntax = "proto2"; package org.jetbrains.kotlin.serialization; import "org/jetbrains/kotlin/backend/konan/serialization/descriptors.proto1"; -import "org/jetbrains/kotlin/backend/konan/serialization/KonanLinkData.proto"; option java_outer_classname = "KonanIr"; option optimize_for = LITE_RUNTIME; @@ -28,7 +27,10 @@ message KotlinDescriptor { required UniqId original_uniq_id = 4; // index in fq name table optional int32 class_or_package = 5; + // Descriptor kind specific fields. + // TODO: consider introducing specific messages + // for functions, variables etc. optional KotlinType type = 6; repeated KotlinDescriptor value_parameter = 7; repeated KotlinDescriptor type_parameter = 8; diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanLinkData.proto b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanLinkData.proto index b27f769a6cb..1da90e59156 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanLinkData.proto +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanLinkData.proto @@ -25,18 +25,15 @@ extend Class { extend Constructor { repeated Annotation constructor_annotation = 170; - optional int32 constructor_parent = 172; } extend Function { repeated Annotation function_annotation = 170; - optional int32 function_parent = 172; optional InlineIrBody inline_ir_body = 174; } extend Property { repeated Annotation property_annotation = 170; - optional int32 property_parent = 172; optional bool used_as_variable = 173; optional Annotation.Argument.Value compile_time_value = 174; optional InlineIrBody inline_getter_ir_body = 175; diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializerExtension.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializerExtension.kt index e3e12b3e5b3..aad10bb273f 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializerExtension.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializerExtension.kt @@ -53,22 +53,8 @@ internal class KonanSerializerExtension(val context: Context, val util: KonanSer super.serializeEnumEntry(descriptor, proto) } - fun DeclarationDescriptor.parentFqNameIndex(): Int? { - - if (this.containingDeclaration is ClassOrPackageFragmentDescriptor) { - val parentIndex = stringTable.getClassOrPackageFqNameIndex( - this.containingDeclaration as ClassOrPackageFragmentDescriptor) - return parentIndex - } else { - return null - } - } - override fun serializeConstructor(descriptor: ConstructorDescriptor, proto: ProtoBuf.Constructor.Builder) { - val parentIndex = descriptor.parentFqNameIndex() - if (parentIndex != null) proto.setExtension(KonanLinkData.constructorParent, parentIndex) - super.serializeConstructor(descriptor, proto) } @@ -79,8 +65,6 @@ internal class KonanSerializerExtension(val context: Context, val util: KonanSer override fun serializeFunction(descriptor: FunctionDescriptor, proto: ProtoBuf.Function.Builder) { - val parentIndex = descriptor.parentFqNameIndex() - if (parentIndex != null) proto.setExtension(KonanLinkData.functionParent, parentIndex) super.serializeFunction(descriptor, proto) } @@ -91,8 +75,6 @@ internal class KonanSerializerExtension(val context: Context, val util: KonanSer backingFieldClass, emptyMap(), SourceElement.NO_SOURCE) override fun serializeProperty(descriptor: PropertyDescriptor, proto: ProtoBuf.Property.Builder) { - val parentIndex = descriptor.parentFqNameIndex() - if (parentIndex != null) proto.setExtension(KonanLinkData.propertyParent, parentIndex) val variable = originalVariables[descriptor] if (variable != null) { proto.setExtension(KonanLinkData.usedAsVariable, true) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/LocalDeclarationDeserializer.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/LocalDeclarationDeserializer.kt index 299f1b73766..d576881ef60 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/LocalDeclarationDeserializer.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/LocalDeclarationDeserializer.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.backend.konan.serialization import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor import org.jetbrains.kotlin.serialization.Flags +import org.jetbrains.kotlin.serialization.KonanIr import org.jetbrains.kotlin.serialization.KonanLinkData import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable.QualifiedName @@ -29,7 +30,6 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.* import org.jetbrains.kotlin.serialization.deserialization.descriptors.SinceKotlinInfoTable import org.jetbrains.kotlin.serialization.deserialization.findClassAcrossModuleDependencies import org.jetbrains.kotlin.types.KotlinType -import org.jetbrains.kotlin.protobuf.GeneratedMessageLite // This class knows how to construct contexts for // MemberDeserializer to deserialize descriptors declared in IR. @@ -97,29 +97,31 @@ class LocalDeclarationDeserializer(val rootDescriptor: DeserializedCallableMembe } - private fun memberDeserializer(proto: GeneratedMessageLite): MemberDeserializer { - val containingFqName = proto.parent + private fun memberDeserializer(irProto: KonanIr.KotlinDescriptor): MemberDeserializer { + val containingFqName = irProto.classOrPackage return if (containingFqName != null) { memberDeserializerByParentFqNameIndex(containingFqName) // TODO: learn to take the containing IR declaration } else this.memberDeserializer } - fun deserializeFunction(proto: ProtoBuf.Function): FunctionDescriptor = - memberDeserializer(proto).loadFunction(proto) + fun deserializeFunction(irProto: KonanIr.KotlinDescriptor): FunctionDescriptor = + memberDeserializer(irProto).loadFunction(irProto.irLocalDeclaration.descriptor.function) - fun deserializeConstructor(proto: ProtoBuf.Constructor): ConstructorDescriptor { + fun deserializeConstructor(irProto: KonanIr.KotlinDescriptor): ConstructorDescriptor { - val containingFqName = proto.getExtension(KonanLinkData.constructorParent) - val memberDeserializer = memberDeserializerByParentFqNameIndex(containingFqName) + val proto = irProto.irLocalDeclaration.descriptor.constructor + val memberDeserializer = memberDeserializerByParentFqNameIndex(irProto.classOrPackage) val isPrimary = !Flags.IS_SECONDARY.get(proto.flags) val constructor = memberDeserializer.loadConstructor(proto, isPrimary) return constructor } - fun deserializeProperty(proto: ProtoBuf.Property): VariableDescriptor { - val property = memberDeserializer(proto).loadProperty(proto) + fun deserializeProperty(irProto: KonanIr.KotlinDescriptor): VariableDescriptor { + + val proto = irProto.irLocalDeclaration.descriptor.property + val property = memberDeserializer(irProto).loadProperty(proto) return if (proto.getExtension(KonanLinkData.usedAsVariable)) { propertyToVariable(property) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/ProtobufUtil.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/ProtobufUtil.kt index 5bed09ba876..88324894f9e 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/ProtobufUtil.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/ProtobufUtil.kt @@ -4,7 +4,6 @@ import org.jetbrains.kotlin.serialization.KonanIr import org.jetbrains.kotlin.serialization.KonanLinkData import org.jetbrains.kotlin.serialization.KonanLinkData.* import org.jetbrains.kotlin.serialization.ProtoBuf -import org.jetbrains.kotlin.protobuf.GeneratedMessageLite fun newUniqId(index: Long): KonanIr.UniqId = KonanIr.UniqId.newBuilder().setIndex(index).build() @@ -63,37 +62,6 @@ fun inlineBody(encodedIR: String) .setEncodedIr(encodedIR) .build() -// ----------------------------------------------------------- - -val ProtoBuf.Function.parent: Int? - get() = if (this.hasExtension(KonanLinkData.functionParent)) - this.getExtension(KonanLinkData.functionParent) - else null - -val ProtoBuf.Property.parent: Int? - get() = if (this.hasExtension(KonanLinkData.propertyParent)) - this.getExtension(KonanLinkData.propertyParent) - else null - - -val ProtoBuf.Constructor.parent: Int? - get() = if (this.hasExtension(KonanLinkData.constructorParent)) - this.getExtension(KonanLinkData.constructorParent) - else null - -val GeneratedMessageLite.parent: Int? - get() = when (this) { - is ProtoBuf.Function - -> this.parent - is ProtoBuf.Property - -> this.parent - is ProtoBuf.Constructor - -> this.parent - else - -> error("Unexpected protobuf message") -} - - // ----------------------------------------------------------- internal fun printType(proto: ProtoBuf.Type) {