Do not patch generic signature for methods with special bridges

Somewhat awkward solution for KT-18189.
This commit is contained in:
Dmitry Petrov
2017-05-30 16:41:37 +03:00
parent fd00a6fbe8
commit 17d2472511
3 changed files with 40 additions and 7 deletions
@@ -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;
@@ -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<ValueParameterDescriptor> valueParameters,
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);
@@ -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) {