From 8a71cf7bf76c1d65822a258c913890ef31b947e6 Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Thu, 30 Aug 2012 15:35:37 +0300 Subject: [PATCH] fix for KT=2702 - wrong bridges on super call --- .../src/org/jetbrains/jet/codegen/CodegenUtil.java | 8 ++++++++ .../jetbrains/jet/codegen/ExpressionCodegen.java | 6 +++--- .../jetbrains/jet/codegen/state/JetTypeMapper.java | 4 +--- compiler/testData/codegen/regressions/kt2702.kt | 14 ++++++++++++++ .../jetbrains/jet/codegen/BridgeMethodGenTest.java | 5 +++++ 5 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt2702.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java index 98565643126..e673cc084e5 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java @@ -370,4 +370,12 @@ public class CodegenUtil { } return JetStandardClasses.getAnyType(); } + + public static T unwrapFakeOverride(T member) { + while (member.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { + //noinspection unchecked + member = (T) member.getOverriddenDescriptors().iterator().next(); + } + return member; + } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index aeb0d31d6db..1753748f97c 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1317,9 +1317,8 @@ public class ExpressionCodegen extends JetVisitor implem IntrinsicMethod intrinsic = null; if (descriptor instanceof CallableMemberDescriptor) { CallableMemberDescriptor memberDescriptor = (CallableMemberDescriptor) descriptor; - while (memberDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { - memberDescriptor = memberDescriptor.getOverriddenDescriptors().iterator().next(); - } + memberDescriptor = unwrapFakeOverride(memberDescriptor); + intrinsic = state.getIntrinsics().getIntrinsic(memberDescriptor); } if (intrinsic != null) { @@ -1696,6 +1695,7 @@ public class ExpressionCodegen extends JetVisitor implem c = c.getParentContext(); assert c != null; } + fd = unwrapFakeOverride(fd); fd = (FunctionDescriptor) c.getAccessor(fd); superCall = false; receiver = StackValue.thisOrOuter(this, enclosed); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java index 1a18062107e..3581d2b0f4a 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java @@ -357,9 +357,7 @@ public class JetTypeMapper extends BindingTraceAware { public CallableMethod mapToCallableMethod(@NotNull FunctionDescriptor functionDescriptor, boolean superCall, OwnerKind kind) { final DeclarationDescriptor functionParent = functionDescriptor.getOriginal().getContainingDeclaration(); - while (functionDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { - functionDescriptor = functionDescriptor.getOverriddenDescriptors().iterator().next(); - } + functionDescriptor = unwrapFakeOverride(functionDescriptor); JvmMethodSignature descriptor = mapSignature(functionDescriptor.getOriginal(), true, kind); JvmClassName owner; diff --git a/compiler/testData/codegen/regressions/kt2702.kt b/compiler/testData/codegen/regressions/kt2702.kt new file mode 100644 index 00000000000..cbf5eebee68 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt2702.kt @@ -0,0 +1,14 @@ +open class A { + open fun foo(r: R): R {return r} +} + +open class B : A() { +} + +open class C : B() { + override fun foo(r: String): String { + return super.foo(r) + "K" + } +} + +fun box() = C().foo("O") diff --git a/compiler/tests/org/jetbrains/jet/codegen/BridgeMethodGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/BridgeMethodGenTest.java index bc528b3aba6..0777d4afc29 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/BridgeMethodGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/BridgeMethodGenTest.java @@ -144,4 +144,9 @@ public class BridgeMethodGenTest extends CodegenTestCase { createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); blackBoxFile("regressions/kt1939.kt"); } + + public void testKt2702() { + createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); + blackBoxFile("regressions/kt2702.kt"); + } }