From 429bc31b82fa98f28ceeecc2d2d09962df5c3080 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Tue, 4 Apr 2017 01:29:42 +0300 Subject: [PATCH] No serialization for "external public inline" functions. --- .../kotlin/backend/konan/descriptors/DescriptorUtils.kt | 5 +++++ .../jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt | 3 ++- .../backend/konan/serialization/KonanSerializerExtension.kt | 4 ++-- .../kotlin/backend/konan/serialization/SerializerVisitor.kt | 3 ++- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DescriptorUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DescriptorUtils.kt index ea6547f9166..1367ff44129 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DescriptorUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DescriptorUtils.kt @@ -295,4 +295,9 @@ internal fun DeclarationDescriptor.getMemberScope(): MemberScope { return containingScope } +// It is possible to declare "external inline fun", +// but it doesn't have much sence for native, +// since externals don't have IR bodies. +internal val FunctionDescriptor.needsInlining: Boolean + get() = (this.isInline && !this.isExternal) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt index 09d874004ba..16f11295d04 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.backend.konan.lower import org.jetbrains.kotlin.backend.common.DeepCopyIrTreeWithDescriptors import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.descriptors.isFunctionInvoke +import org.jetbrains.kotlin.backend.konan.descriptors.needsInlining import org.jetbrains.kotlin.backend.konan.ir.DeserializerDriver import org.jetbrains.kotlin.backend.konan.ir.IrInlineFunctionBody import org.jetbrains.kotlin.descriptors.FunctionDescriptor @@ -89,7 +90,7 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoid( val irCall = super.visitCall(expression) as IrCall val functionDescriptor = irCall.descriptor as FunctionDescriptor - if (functionDescriptor.isInline) return inlineFunction(irCall) // Return newly created IrInlineBody instead of IrCall. + if (functionDescriptor.needsInlining) return inlineFunction(irCall) // Return newly created IrInlineBody instead of IrCall. return irCall } 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 671ab53e3d6..c03ea70f6e9 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 @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.backend.konan.serialization import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.descriptors.getKonanInternalClass +import org.jetbrains.kotlin.backend.konan.descriptors.needsInlining import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptorImpl @@ -107,8 +108,7 @@ internal class KonanSerializerExtension(val context: Context, val util: KonanSer val parentIndex = descriptor.parentFqNameIndex() proto.setExtension(KonanLinkData.functionParent, parentIndex) - if (descriptor.isInline()) { - + if (descriptor.needsInlining) { val encodedIR: String = IrSerializer( context, inlineDescriptorTable, stringTable, util, descriptor) .serializeInlineBody() diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/SerializerVisitor.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/SerializerVisitor.kt index c4ead3c9825..ba337fd58ff 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/SerializerVisitor.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/SerializerVisitor.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.backend.konan.descriptors.EmptyDescriptorVisitorVoid import org.jetbrains.kotlin.backend.konan.descriptors.DeepVisitor +import org.jetbrains.kotlin.backend.konan.descriptors.needsInlining import org.jetbrains.kotlin.backend.konan.serialization.* import org.jetbrains.kotlin.backend.konan.llvm.base64Encode import org.jetbrains.kotlin.backend.konan.llvm.base64Decode @@ -43,7 +44,7 @@ internal class DeserializerDriver(val context: Context) { val descriptorIndex = IrDeserializationDescriptorIndex(context.irBuiltIns) internal fun deserializeInlineBody(descriptor: FunctionDescriptor): IrDeclaration? { - if (!descriptor.isInline()) return null + if (!descriptor.needsInlining) return null if (descriptor !is DeserializedSimpleFunctionDescriptor) { return null