From 28940256e35042ee0b8ac62b35a5d5b9d71f2715 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 7 Apr 2014 20:15:00 +0400 Subject: [PATCH] Minor, add bytecode text test on bridges for fake overrides --- .../bytecodeText/bridgeForFakeOverride.kt | 20 +++++++++++++++++++ .../codegen/BytecodeTextTestGenerated.java | 5 +++++ 2 files changed, 25 insertions(+) create mode 100644 compiler/testData/codegen/bytecodeText/bridgeForFakeOverride.kt diff --git a/compiler/testData/codegen/bytecodeText/bridgeForFakeOverride.kt b/compiler/testData/codegen/bytecodeText/bridgeForFakeOverride.kt new file mode 100644 index 00000000000..afa807eb43e --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/bridgeForFakeOverride.kt @@ -0,0 +1,20 @@ +trait A { + fun foo(): Object +} + +open class B { + fun foo(): String = "hello" +} + +open class C : B() + +class D : A, C() { + // There's a fake override for 'foo' in class D, and, since there are declarations with different signatures in the supertypes, + // a bridge is generated with the signature foo()Ljava/lang/Object; which invokes foo()Ljava/lang/String; + // This test checks that the generated bridge calls D.foo() instead of B.foo(). That way when an implementation of + // foo()Ljava/lang/String is added to C later, D won't need to be recompiled. + // Note that invokevirtual/invokespecial of C.foo() would also be fine (invokespecial is javac's behavior). +} + +// 1 INVOKEVIRTUAL D.foo +// 0 INVOKEVIRTUAL B.foo diff --git a/compiler/tests/org/jetbrains/jet/codegen/BytecodeTextTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/BytecodeTextTestGenerated.java index 47aa95ba354..3a143a94c73 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/BytecodeTextTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/BytecodeTextTestGenerated.java @@ -57,6 +57,11 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest { doTest("compiler/testData/codegen/bytecodeText/annotationRetentionPolicySource.kt"); } + @TestMetadata("bridgeForFakeOverride.kt") + public void testBridgeForFakeOverride() throws Exception { + doTest("compiler/testData/codegen/bytecodeText/bridgeForFakeOverride.kt"); + } + @TestMetadata("componentEvaluatesOnlyOnce.kt") public void testComponentEvaluatesOnlyOnce() throws Exception { doTest("compiler/testData/codegen/bytecodeText/componentEvaluatesOnlyOnce.kt");