From 035cc57cf47054383a44e668612927dd793f9d22 Mon Sep 17 00:00:00 2001 From: pyos Date: Thu, 27 Feb 2020 12:11:54 +0100 Subject: [PATCH] JVM_IR: don't remap current method signature when detecting clashes TODO: don't repeatedly map signatures of inherited functions either. --- .../kotlin/backend/jvm/codegen/ClassCodegen.kt | 8 +++++--- .../jvm/codegen/JvmSignatureClashDetector.kt | 14 +++++++------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt index bbfcfafe2e6..7f5a1179203 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt @@ -376,11 +376,13 @@ open class ClassCodegen protected constructor( } private fun generateMethod(method: IrFunction) { - jvmSignatureClashDetector.trackMethod(method) + if (method.origin == IrDeclarationOrigin.FAKE_OVERRIDE) { + jvmSignatureClashDetector.trackFakeOverrideMethod(method) + return + } - if (method.origin == IrDeclarationOrigin.FAKE_OVERRIDE) return val signature = FunctionCodegen(method, this).generate().asmMethod - + jvmSignatureClashDetector.trackMethod(method, RawSignature(signature.name, signature.descriptor, MemberKind.METHOD)) when (val metadata = method.metadata) { is MetadataSource.Property -> { // We can't check for JvmLoweredDeclarationOrigin.SYNTHETIC_METHOD_FOR_PROPERTY_ANNOTATIONS because for interface methods diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/JvmSignatureClashDetector.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/JvmSignatureClashDetector.kt index a3b7b978912..f788b465aeb 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/JvmSignatureClashDetector.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/JvmSignatureClashDetector.kt @@ -27,9 +27,13 @@ class JvmSignatureClashDetector( fieldsBySignature.getOrPut(rawSignature) { SmartSet.create() }.add(irField) } - fun trackMethod(irFunction: IrFunction) { - if (irFunction is IrSimpleFunction && irFunction.isFakeOverride && irFunction.dispatchReceiverParameter != null) { - for (overriddenFunction in getOverriddenFunctions(irFunction)) { + fun trackMethod(irFunction: IrFunction, rawSignature: RawSignature) { + methodsBySignature.getOrPut(rawSignature) { SmartSet.create() }.add(irFunction) + } + + fun trackFakeOverrideMethod(irFunction: IrFunction) { + if (irFunction.dispatchReceiverParameter != null) { + for (overriddenFunction in getOverriddenFunctions(irFunction as IrSimpleFunction)) { trackMethod(irFunction, mapRawSignature(overriddenFunction)) } } else { @@ -42,10 +46,6 @@ class JvmSignatureClashDetector( return RawSignature(jvmSignature.asmMethod.name, jvmSignature.asmMethod.descriptor, MemberKind.METHOD) } - private fun trackMethod(irFunction: IrFunction, rawSignature: RawSignature) { - methodsBySignature.getOrPut(rawSignature) { SmartSet.create() }.add(irFunction) - } - private fun getOverriddenFunctions(irFunction: IrSimpleFunction): Set { val result = HashSet() collectOverridesOf(irFunction, result)