diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java index 359589c6240..870b79101e2 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java @@ -189,7 +189,8 @@ public class FunctionCodegen { return; } - JvmMethodGenericSignature jvmSignature = typeMapper.mapSignatureWithGeneric(functionDescriptor, contextKind); + boolean hasSpecialBridge = hasSpecialBridgeMethod(functionDescriptor); + JvmMethodGenericSignature jvmSignature = typeMapper.mapSignatureWithGeneric(functionDescriptor, contextKind, hasSpecialBridge); Method asmMethod = jvmSignature.getAsmMethod(); int flags = getMethodAsmFlags(functionDescriptor, contextKind, state); @@ -796,6 +797,13 @@ public class FunctionCodegen { return bytecode; } + private boolean hasSpecialBridgeMethod(@NotNull FunctionDescriptor descriptor) { + if (SpecialBuiltinMembers.getOverriddenBuiltinReflectingJvmDescriptor(descriptor) == null) return false; + return !BuiltinSpecialBridgesUtil.generateBridgesForBuiltinSpecial( + descriptor, typeMapper::mapAsmMethod, IS_PURE_INTERFACE_CHECKER + ).isEmpty(); + } + public void generateBridges(@NotNull FunctionDescriptor descriptor) { if (descriptor instanceof ConstructorDescriptor) return; if (owner.getContextKind() == OwnerKind.DEFAULT_IMPLS) return; diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java index 97b76d94ad9..8b15f916330 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java @@ -1029,7 +1029,21 @@ public class KotlinTypeMapper { } @NotNull + public JvmMethodGenericSignature mapSignatureWithGeneric(@NotNull FunctionDescriptor f, @NotNull OwnerKind kind, boolean hasSpecialBridge) { + return mapSignature(f, kind, false, hasSpecialBridge); + } + private JvmMethodGenericSignature mapSignature(@NotNull FunctionDescriptor f, @NotNull OwnerKind kind, boolean skipGenericSignature) { + return mapSignature(f, kind, skipGenericSignature, false); + } + + @NotNull + private JvmMethodGenericSignature mapSignature( + @NotNull FunctionDescriptor f, + @NotNull OwnerKind kind, + boolean skipGenericSignature, + boolean hasSpecialBridge + ) { if (f.getInitialSignatureDescriptor() != null && f != f.getInitialSignatureDescriptor()) { // Overrides of special builtin in Kotlin classes always have special signature if (SpecialBuiltinMembers.getOverriddenBuiltinReflectingJvmDescriptor(f) == null || @@ -1050,7 +1064,7 @@ public class KotlinTypeMapper { return mapSignature(CoroutineCodegenUtilKt.getOrCreateJvmSuspendFunctionView(f), kind, skipGenericSignature); } - return mapSignatureWithCustomParameters(f, kind, f.getValueParameters(), skipGenericSignature); + return mapSignatureWithCustomParameters(f, kind, f.getValueParameters(), skipGenericSignature, hasSpecialBridge); } @NotNull @@ -1059,6 +1073,17 @@ public class KotlinTypeMapper { @NotNull OwnerKind kind, @NotNull List valueParameters, boolean skipGenericSignature + ) { + return mapSignatureWithCustomParameters(f, kind, valueParameters, skipGenericSignature, false); + } + + @NotNull + public JvmMethodGenericSignature mapSignatureWithCustomParameters( + @NotNull FunctionDescriptor f, + @NotNull OwnerKind kind, + @NotNull List valueParameters, + boolean skipGenericSignature, + boolean hasSpecialBridge ) { checkOwnerCompatibility(f); @@ -1121,7 +1146,7 @@ public class KotlinTypeMapper { JvmMethodGenericSignature signature = sw.makeJvmMethodSignature(mapFunctionName(f)); - if (kind != OwnerKind.DEFAULT_IMPLS) { + if (kind != OwnerKind.DEFAULT_IMPLS && !hasSpecialBridge) { SpecialSignatureInfo specialSignatureInfo = BuiltinMethodsWithSpecialGenericSignature.getSpecialSignatureInfo(f); if (specialSignatureInfo != null) { diff --git a/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/partiallySpecializedClass.txt b/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/partiallySpecializedClass.txt index 94b7cd849ef..894ac270ff4 100644 --- a/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/partiallySpecializedClass.txt +++ b/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/partiallySpecializedClass.txt @@ -6,10 +6,10 @@ public abstract class<Ljava/lang/Object;Ljava/util/Map;> method keySet(): java.util.Set public final <()Ljava/util/Set;>;> method entrySet(): java.util.Set public @org.jetbrains.annotations.NotNull <()Ljava/util/Set;>;> method getEntries(): java.util.Set - public @org.jetbrains.annotations.Nullable <(Ljava/lang/Object;)TV;> method get(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.Object public final <(Ljava/lang/Object;)TV;> method get(p0: java.lang.Object): java.lang.Object - public @org.jetbrains.annotations.Nullable <(Ljava/lang/Object;)TV;> method remove(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.Object public final <(Ljava/lang/Object;)TV;> method remove(p0: java.lang.Object): java.lang.Object + public @org.jetbrains.annotations.Nullable <(Ljava/lang/String;)TV;> method get(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.Object + public @org.jetbrains.annotations.Nullable <(Ljava/lang/String;)TV;> method remove(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.Object public @org.jetbrains.annotations.Nullable <(Ljava/lang/String;TV;)TV;> method put(@org.jetbrains.annotations.NotNull p0: java.lang.String, p1: java.lang.Object): java.lang.Object public <(Ljava/util/Map<+Ljava/lang/String;+TV;>;)V> method putAll(@org.jetbrains.annotations.NotNull p0: java.util.Map): void public method (): void @@ -32,10 +32,10 @@ public final class<Ljava/lang/Object;Ljava/util/Map;> method keySet(): java.util.Set public final <()Ljava/util/Set;>;> method entrySet(): java.util.Set public @org.jetbrains.annotations.NotNull <()Ljava/util/Set;>;> method getEntries(): java.util.Set - public @org.jetbrains.annotations.Nullable <(Ljava/lang/Object;)TV;> method get(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.Object public final <(Ljava/lang/Object;)TV;> method get(p0: java.lang.Object): java.lang.Object - public @org.jetbrains.annotations.Nullable <(Ljava/lang/Object;)TV;> method remove(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.Object public final <(Ljava/lang/Object;)TV;> method remove(p0: java.lang.Object): java.lang.Object + public @org.jetbrains.annotations.Nullable <(Ljava/lang/String;)TV;> method get(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.Object + public @org.jetbrains.annotations.Nullable <(Ljava/lang/String;)TV;> method remove(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.Object public @org.jetbrains.annotations.Nullable <(Ljava/lang/String;TV;)TV;> method put(@org.jetbrains.annotations.NotNull p0: java.lang.String, p1: java.lang.Object): java.lang.Object public <(Ljava/util/Map<+Ljava/lang/String;+TV;>;)V> method putAll(@org.jetbrains.annotations.NotNull p0: java.util.Map): void public method (): void