Do not patch generic signature for methods with special bridges
Somewhat awkward solution for KT-18189.
This commit is contained in:
@@ -189,7 +189,8 @@ public class FunctionCodegen {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
JvmMethodGenericSignature jvmSignature = typeMapper.mapSignatureWithGeneric(functionDescriptor, contextKind);
|
boolean hasSpecialBridge = hasSpecialBridgeMethod(functionDescriptor);
|
||||||
|
JvmMethodGenericSignature jvmSignature = typeMapper.mapSignatureWithGeneric(functionDescriptor, contextKind, hasSpecialBridge);
|
||||||
Method asmMethod = jvmSignature.getAsmMethod();
|
Method asmMethod = jvmSignature.getAsmMethod();
|
||||||
|
|
||||||
int flags = getMethodAsmFlags(functionDescriptor, contextKind, state);
|
int flags = getMethodAsmFlags(functionDescriptor, contextKind, state);
|
||||||
@@ -796,6 +797,13 @@ public class FunctionCodegen {
|
|||||||
return bytecode;
|
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) {
|
public void generateBridges(@NotNull FunctionDescriptor descriptor) {
|
||||||
if (descriptor instanceof ConstructorDescriptor) return;
|
if (descriptor instanceof ConstructorDescriptor) return;
|
||||||
if (owner.getContextKind() == OwnerKind.DEFAULT_IMPLS) return;
|
if (owner.getContextKind() == OwnerKind.DEFAULT_IMPLS) return;
|
||||||
|
|||||||
@@ -1029,7 +1029,21 @@ public class KotlinTypeMapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@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) {
|
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()) {
|
if (f.getInitialSignatureDescriptor() != null && f != f.getInitialSignatureDescriptor()) {
|
||||||
// Overrides of special builtin in Kotlin classes always have special signature
|
// Overrides of special builtin in Kotlin classes always have special signature
|
||||||
if (SpecialBuiltinMembers.getOverriddenBuiltinReflectingJvmDescriptor(f) == null ||
|
if (SpecialBuiltinMembers.getOverriddenBuiltinReflectingJvmDescriptor(f) == null ||
|
||||||
@@ -1050,7 +1064,7 @@ public class KotlinTypeMapper {
|
|||||||
return mapSignature(CoroutineCodegenUtilKt.getOrCreateJvmSuspendFunctionView(f), kind, skipGenericSignature);
|
return mapSignature(CoroutineCodegenUtilKt.getOrCreateJvmSuspendFunctionView(f), kind, skipGenericSignature);
|
||||||
}
|
}
|
||||||
|
|
||||||
return mapSignatureWithCustomParameters(f, kind, f.getValueParameters(), skipGenericSignature);
|
return mapSignatureWithCustomParameters(f, kind, f.getValueParameters(), skipGenericSignature, hasSpecialBridge);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -1059,6 +1073,17 @@ public class KotlinTypeMapper {
|
|||||||
@NotNull OwnerKind kind,
|
@NotNull OwnerKind kind,
|
||||||
@NotNull List<ValueParameterDescriptor> valueParameters,
|
@NotNull List<ValueParameterDescriptor> valueParameters,
|
||||||
boolean skipGenericSignature
|
boolean skipGenericSignature
|
||||||
|
) {
|
||||||
|
return mapSignatureWithCustomParameters(f, kind, valueParameters, skipGenericSignature, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public JvmMethodGenericSignature mapSignatureWithCustomParameters(
|
||||||
|
@NotNull FunctionDescriptor f,
|
||||||
|
@NotNull OwnerKind kind,
|
||||||
|
@NotNull List<ValueParameterDescriptor> valueParameters,
|
||||||
|
boolean skipGenericSignature,
|
||||||
|
boolean hasSpecialBridge
|
||||||
) {
|
) {
|
||||||
checkOwnerCompatibility(f);
|
checkOwnerCompatibility(f);
|
||||||
|
|
||||||
@@ -1121,7 +1146,7 @@ public class KotlinTypeMapper {
|
|||||||
|
|
||||||
JvmMethodGenericSignature signature = sw.makeJvmMethodSignature(mapFunctionName(f));
|
JvmMethodGenericSignature signature = sw.makeJvmMethodSignature(mapFunctionName(f));
|
||||||
|
|
||||||
if (kind != OwnerKind.DEFAULT_IMPLS) {
|
if (kind != OwnerKind.DEFAULT_IMPLS && !hasSpecialBridge) {
|
||||||
SpecialSignatureInfo specialSignatureInfo = BuiltinMethodsWithSpecialGenericSignature.getSpecialSignatureInfo(f);
|
SpecialSignatureInfo specialSignatureInfo = BuiltinMethodsWithSpecialGenericSignature.getSpecialSignatureInfo(f);
|
||||||
|
|
||||||
if (specialSignatureInfo != null) {
|
if (specialSignatureInfo != null) {
|
||||||
|
|||||||
Vendored
+4
-4
@@ -6,10 +6,10 @@ public abstract class<<V:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Map<Lja
|
|||||||
public final <()Ljava/util/Set<Ljava/lang/String;>;> method keySet(): java.util.Set
|
public final <()Ljava/util/Set<Ljava/lang/String;>;> method keySet(): java.util.Set
|
||||||
public final <()Ljava/util/Set<Ljava/util/Map$Entry<Ljava/lang/String;TV;>;>;> method entrySet(): java.util.Set
|
public final <()Ljava/util/Set<Ljava/util/Map$Entry<Ljava/lang/String;TV;>;>;> method entrySet(): java.util.Set
|
||||||
public @org.jetbrains.annotations.NotNull <()Ljava/util/Set<Ljava/util/Map$Entry<Ljava/lang/String;TV;>;>;> method getEntries(): java.util.Set
|
public @org.jetbrains.annotations.NotNull <()Ljava/util/Set<Ljava/util/Map$Entry<Ljava/lang/String;TV;>;>;> 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 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 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 @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 <(Ljava/util/Map<+Ljava/lang/String;+TV;>;)V> method putAll(@org.jetbrains.annotations.NotNull p0: java.util.Map): void
|
||||||
public <null> method <init>(): void
|
public <null> method <init>(): void
|
||||||
@@ -32,10 +32,10 @@ public final class<<V:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Map<Ljava/
|
|||||||
public final <()Ljava/util/Set<Ljava/lang/String;>;> method keySet(): java.util.Set
|
public final <()Ljava/util/Set<Ljava/lang/String;>;> method keySet(): java.util.Set
|
||||||
public final <()Ljava/util/Set<Ljava/util/Map$Entry<Ljava/lang/String;TV;>;>;> method entrySet(): java.util.Set
|
public final <()Ljava/util/Set<Ljava/util/Map$Entry<Ljava/lang/String;TV;>;>;> method entrySet(): java.util.Set
|
||||||
public @org.jetbrains.annotations.NotNull <()Ljava/util/Set<Ljava/util/Map$Entry<Ljava/lang/String;TV;>;>;> method getEntries(): java.util.Set
|
public @org.jetbrains.annotations.NotNull <()Ljava/util/Set<Ljava/util/Map$Entry<Ljava/lang/String;TV;>;>;> 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 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 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 @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 <(Ljava/util/Map<+Ljava/lang/String;+TV;>;)V> method putAll(@org.jetbrains.annotations.NotNull p0: java.util.Map): void
|
||||||
public <null> method <init>(): void
|
public <null> method <init>(): void
|
||||||
|
|||||||
Reference in New Issue
Block a user