From 97fe5c6b468f0d28e14d0b966a64c22ad54ccea2 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Wed, 10 May 2017 14:18:51 +0300 Subject: [PATCH] Abstract methods can also have bridges --- .../konan/descriptors/ClassVtablesBuilder.kt | 13 ++++--------- .../backend/konan/descriptors/DescriptorUtils.kt | 4 +--- .../kotlin/backend/konan/lower/BridgesBuilding.kt | 6 +++--- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassVtablesBuilder.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassVtablesBuilder.kt index b37c24fb8f0..b74cb748f8c 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassVtablesBuilder.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassVtablesBuilder.kt @@ -29,10 +29,7 @@ internal class OverriddenFunctionDescriptor(val descriptor: FunctionDescriptor, val overriddenDescriptor = overriddenDescriptor.original val needBridge: Boolean - get() { - if (descriptor.modality == Modality.ABSTRACT) return false - return descriptor.target.needBridgeTo(overriddenDescriptor) - } + get() = descriptor.target.needBridgeTo(overriddenDescriptor) val bridgeDirections: BridgeDirections get() = descriptor.target.bridgeDirectionsTo(overriddenDescriptor) @@ -43,11 +40,9 @@ internal class OverriddenFunctionDescriptor(val descriptor: FunctionDescriptor, || DescriptorUtils.getAllOverriddenDeclarations(overriddenDescriptor).any { it.isOverridable } val inheritsBridge: Boolean - get() { - return !descriptor.kind.isReal - && OverridingUtil.overrides(descriptor.target, overriddenDescriptor) - && descriptor.bridgeDirectionsTo(overriddenDescriptor).allNotNeeded() - } + get() = !descriptor.kind.isReal + && OverridingUtil.overrides(descriptor.target, overriddenDescriptor) + && descriptor.bridgeDirectionsTo(overriddenDescriptor).allNotNeeded() override fun toString(): String { return "(descriptor=$descriptor, overriddenDescriptor=$overriddenDescriptor)" 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 2cad3e24d8b..c5751b0e0c9 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 @@ -283,13 +283,11 @@ internal class BridgeDirections(val array: Array) { internal fun FunctionDescriptor.bridgeDirectionsTo(overriddenDescriptor: FunctionDescriptor): BridgeDirections { val ourDirections = BridgeDirections(this.valueParameters.size) - if (modality == Modality.ABSTRACT) - return ourDirections for (index in ourDirections.array.indices) ourDirections.array[index] = this.bridgeDirectionToAt(overriddenDescriptor, index) val target = this.target - if (!kind.isReal + if (!kind.isReal && modality != Modality.ABSTRACT && OverridingUtil.overrides(target, overriddenDescriptor) && ourDirections == target.bridgeDirectionsTo(overriddenDescriptor)) { // Bridge is inherited from superclass. diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BridgesBuilding.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BridgesBuilding.kt index e46b9927cff..3455be37ea7 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BridgesBuilding.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BridgesBuilding.kt @@ -93,8 +93,9 @@ internal class BridgesBuilding(val context: Context) : ClassLoweringPass { irClass.descriptor.contributedMethods.forEach { functions.add(it) } - functions.forEach { - it?.let { function -> + functions.filterNotNull() + .filterNot { it.modality == Modality.ABSTRACT } + .forEach { function -> function.allOverriddenDescriptors .map { OverriddenFunctionDescriptor(function, it) } .filter { !it.bridgeDirections.allNotNeeded() } @@ -104,7 +105,6 @@ internal class BridgesBuilding(val context: Context) : ClassLoweringPass { .forEach { buildBridge(it, irClass) } - } } }