From 2a156fe90c06c6ef2aa8bc1a9ad8e8c9b1a73bb9 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 11 Jan 2019 14:05:56 +0300 Subject: [PATCH] Do not check target when generating bridges with default impl In many other places, e.g. org.jetbrains.kotlin.codegen.ClassBodyCodegen#generateDelegatesToDefaultImpl we implicitly assume that whenever we use a default interface method our target is 1.8 But here, we don't and it might lead to exception in org.jetbrains.kotlin.backend.common.bridges.BridgesKt#findConcreteSuperDeclaration when actual target is 1.6 and we extend some AbstractMap implementation with JDK8 (i.e., with @PlatformDependent getOrDefault) --- .../src/org/jetbrains/kotlin/codegen/FunctionCodegen.java | 2 +- .../src/org/jetbrains/kotlin/codegen/JvmBridgesImpl.kt | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java index 284cc9c88cf..2824a052eac 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java @@ -1064,7 +1064,7 @@ public class FunctionCodegen { public void generateBridges(@NotNull FunctionDescriptor descriptor) { if (descriptor instanceof ConstructorDescriptor) return; if (owner.getContextKind() == OwnerKind.DEFAULT_IMPLS) return; - if (JvmBridgesImplKt.isAbstractOnJvmIgnoringActualModality(state, descriptor)) return; + if (JvmBridgesImplKt.isAbstractOnJvmIgnoringActualModality(descriptor)) return; // equals(Any?), hashCode(), toString() never need bridges if (isMethodOfAny(descriptor)) return; diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmBridgesImpl.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmBridgesImpl.kt index f027639a518..7aeec2c6b91 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmBridgesImpl.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmBridgesImpl.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.codegen import org.jetbrains.kotlin.backend.common.bridges.* import org.jetbrains.kotlin.codegen.state.GenerationState -import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.resolve.DescriptorUtils @@ -27,7 +26,7 @@ class DescriptorBasedFunctionHandleForJvm( For non-@JvmDefault interfaces function, its body is generated in a separate place (DefaultImpls) and the method in the interface is abstract so we must not generate bridges for such cases. */ - override val isAbstract: Boolean = super.isAbstract || isAbstractOnJvmIgnoringActualModality(state, descriptor) + override val isAbstract: Boolean = super.isAbstract || isAbstractOnJvmIgnoringActualModality(descriptor) override val mayBeUsedAsSuperImplementation: Boolean = super.mayBeUsedAsSuperImplementation || descriptor.isJvmDefaultOrPlatformDependent() @@ -52,9 +51,8 @@ private fun needToGenerateDelegationToDefaultImpls(descriptor: FunctionDescripto /** * @return return true for interface method not annotated with @JvmDefault or @PlatformDependent */ -fun isAbstractOnJvmIgnoringActualModality(state: GenerationState, descriptor: FunctionDescriptor): Boolean { +fun isAbstractOnJvmIgnoringActualModality(descriptor: FunctionDescriptor): Boolean { if (!DescriptorUtils.isInterface(descriptor.containingDeclaration)) return false - if (state.target == JvmTarget.JVM_1_6) return true return !descriptor.isJvmDefaultOrPlatformDependent() }