From 0b327d29bc510c3df1fb93e6077df60fdcf8050c Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Sat, 28 Jul 2012 14:17:42 +0300 Subject: [PATCH] fix KT-2481: no bridge for supercall --- .../org/jetbrains/jet/codegen/CodegenContext.java | 15 ++++++++++++++- .../jetbrains/jet/codegen/ExpressionCodegen.java | 7 +++++-- compiler/testData/codegen/regressions/kt2481.kt | 14 ++++++++++++++ .../jetbrains/jet/codegen/FunctionGenTest.java | 4 ++++ 4 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt2481.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java index daf41cf0437..f75b01621fc 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java @@ -27,6 +27,7 @@ import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.asm4.Type; import org.jetbrains.asm4.commons.InstructionAdapter; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; @@ -212,7 +213,7 @@ public abstract class CodegenContext { if (descriptor instanceof SimpleFunctionDescriptor) { SimpleFunctionDescriptorImpl myAccessor = new SimpleFunctionDescriptorImpl(contextDescriptor, Collections.emptyList(), - Name.identifier(descriptor.getName() + "$bridge$" + accessors.size()), + Name.identifier(descriptor.getName() + "$b$" + getHierarchyCount() + "$" + accessors.size()), CallableMemberDescriptor.Kind.DECLARATION); FunctionDescriptor fd = (SimpleFunctionDescriptor) descriptor; myAccessor.initialize(fd.getReceiverParameter().exists() ? fd.getReceiverParameter().getType() : null, @@ -259,6 +260,18 @@ public abstract class CodegenContext { return accessor; } + private int getHierarchyCount() { + ClassifierDescriptor descriptor = getThisDescriptor(); + int c = 0; + while(true) { + Collection supertypes = descriptor.getDefaultType().getConstructor().getSupertypes(); + if(supertypes.isEmpty()) + return c; + c++; + descriptor = supertypes.iterator().next().getConstructor().getDeclarationDescriptor(); + } + } + public StackValue getReceiverExpression(JetTypeMapper typeMapper) { assert getReceiverDescriptor() != null; Type asmType = typeMapper.mapType(getReceiverDescriptor().getReceiverParameter().getType(), MapTypeMode.VALUE); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 46aa04545fa..dc5bc7c00ea 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1363,9 +1363,12 @@ public class ExpressionCodegen extends JetVisitor { PsiElement enclosingElement = bindingContext.get(BindingContext.LABEL_TARGET, superExpression.getTargetLabel()); ClassDescriptor enclosed = (ClassDescriptor) bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, enclosingElement); if (!CodegenUtil.isInterface(fd.getContainingDeclaration())) { - if (enclosed != null && enclosed != context.getThisDescriptor()) { + if(enclosed == null) { + enclosed = (ClassDescriptor) fd.getContainingDeclaration(); + } + if (enclosed != context.getThisDescriptor()) { CodegenContext c = context; - while(c.getContextDescriptor() != enclosed) { + while(!(c instanceof CodegenContexts.ClassContext) || !DescriptorUtils.isSubclass(c.getThisDescriptor(), enclosed)) { c = c.getParentContext(); } fd = (FunctionDescriptor) c.getAccessor(fd); diff --git a/compiler/testData/codegen/regressions/kt2481.kt b/compiler/testData/codegen/regressions/kt2481.kt new file mode 100644 index 00000000000..ea353c41cb1 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt2481.kt @@ -0,0 +1,14 @@ +fun box() = + B().method() + +public open class A(){ + public open fun method() : String = "OK" +} + +public class B(): A(){ + public override fun method() : String { + return ({ + super.method() + })() + } +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/FunctionGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/FunctionGenTest.java index 26c9d48f861..0d1fbf7aed5 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/FunctionGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/FunctionGenTest.java @@ -121,6 +121,10 @@ public class FunctionGenTest extends CodegenTestCase { blackBoxFile("functions/invoke.kt"); } + public void test2481() { + blackBoxFile("regressions/kt2481.kt"); + } + public static class WithJavaFunctionGenTest extends CodegenTestCase { private void blackBoxFileWithJava(@NotNull String ktFile) throws Exception { File javaClassesTempDirectory = new File(FileUtil.getTempDirectory(), "java-classes");