Generate bridges for super-calls only when needed

#KT-2887 Fixed
This commit is contained in:
Alexander Udalov
2012-11-07 16:29:30 +04:00
parent 89b8bbec57
commit 415b6f8efe
4 changed files with 40 additions and 8 deletions
@@ -1747,8 +1747,13 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
boolean superCall = isSuperCall(call);
if (superCall && !isInterface(fd.getContainingDeclaration())) {
CodegenContext c = getParentContextSubclassOf((ClassDescriptor) fd.getContainingDeclaration());
fd = (FunctionDescriptor) c.getAccessor(unwrapFakeOverride(fd));
JetSuperExpression expression = getSuperCallExpression(call);
ClassDescriptor owner = getSuperCallLabelTarget(expression);
CodegenContext c = context.findParentContextWithDescriptor(owner);
assert c != null : "Couldn't find a context for a super-call: " + fd;
if (c != context.getParentContext()) {
fd = (FunctionDescriptor) c.getAccessor(unwrapFakeOverride(fd));
}
}
fd = accessableFunctionDescriptor(fd);
@@ -217,6 +217,16 @@ public abstract class CodegenContext {
return cur == null ? null : (ClassDescriptor) cur.getContextDescriptor();
}
@Nullable
public CodegenContext findParentContextWithDescriptor(DeclarationDescriptor descriptor) {
CodegenContext c = this;
while (c != null) {
if (c.getContextDescriptor() == descriptor) break;
c = c.getParentContext();
}
return c;
}
public DeclarationDescriptor getAccessor(DeclarationDescriptor descriptor) {
if (accessors == null) {
accessors = new HashMap<DeclarationDescriptor, DeclarationDescriptor>();
+16
View File
@@ -0,0 +1,16 @@
open class Base<T> {
public open fun foo(t: T): T = t
public open fun bar() {}
}
class Child: Base<String>() {
override fun foo(t: String): String {
return super<Base>.foo(t)
}
override fun bar() {
super.bar()
}
}
@@ -16,6 +16,7 @@
package org.jetbrains.jet.codegen;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.jet.ConfigurationKind;
public class SuperGenTest extends CodegenTestCase {
@@ -28,22 +29,18 @@ public class SuperGenTest extends CodegenTestCase {
public void testBasicProperty () {
blackBoxFile("/super/basicproperty.jet");
// System.out.println(generateToText());
}
public void testTraitProperty () {
blackBoxFile("/super/traitproperty.jet");
// System.out.println(generateToText());
}
public void testBasicMethodSuperTrait () {
blackBoxFile("/super/basicmethodSuperTrait.jet");
// System.out.println(generateToText());
}
public void testBasicMethodSuperClass () {
blackBoxFile("/super/basicmethodSuperClass.jet");
// System.out.println(generateToText());
}
public void testInnerClassLabeledSuper() {
@@ -60,12 +57,16 @@ public class SuperGenTest extends CodegenTestCase {
public void testEnclosedFun () {
blackBoxFile("/super/enclosedFun.jet");
// System.out.println(generateToText());
}
public void testEnclosedVar () {
blackBoxFile("/super/enclosedVar.jet");
// System.out.println(generateToText());
}
public void testKt2887() {
loadFile("super/kt2887.kt");
String text = generateToText();
// There should be exactly one bridge in this example
assertEquals(1, StringUtils.countMatches(text, "bridge"));
}
}