JVM_IR KT-43610 keep track of "special bridges" for interface funs
This commit is contained in:
+10
-2
@@ -188,8 +188,16 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass
|
|||||||
return false
|
return false
|
||||||
|
|
||||||
// We don't produce bridges for abstract functions in interfaces.
|
// We don't produce bridges for abstract functions in interfaces.
|
||||||
if (irFunction.isJvmAbstract(context.state.jvmDefaultMode))
|
if (irFunction.isJvmAbstract(context.state.jvmDefaultMode)) {
|
||||||
return !irFunction.parentAsClass.isJvmInterface
|
if (irFunction.parentAsClass.isJvmInterface) {
|
||||||
|
// If function requires a special bridge, we should record it for generic signatures generation.
|
||||||
|
if (irFunction.specialBridgeOrNull != null) {
|
||||||
|
context.functionsWithSpecialBridges.add(irFunction)
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
// Finally, the JVM backend also ignores concrete fake overrides whose implementation is directly inherited from an interface.
|
// Finally, the JVM backend also ignores concrete fake overrides whose implementation is directly inherited from an interface.
|
||||||
// This is sound, since we do not generate type-specialized versions of fake overrides and if the method
|
// This is sound, since we do not generate type-specialized versions of fake overrides and if the method
|
||||||
|
|||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// WITH_SIGNATURES
|
||||||
|
|
||||||
|
class B<T>(val a: T)
|
||||||
|
|
||||||
|
interface IColl : Collection<B<Int>> {
|
||||||
|
override fun contains(element: B<Int>): kotlin.Boolean
|
||||||
|
}
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
@kotlin.Metadata
|
||||||
|
public final class<<T:Ljava/lang/Object;>Ljava/lang/Object;> B {
|
||||||
|
// source: 'kt43610.kt'
|
||||||
|
public final <()TT;> method getA(): java.lang.Object
|
||||||
|
public <(TT;)V> method <init>(p0: java.lang.Object): void
|
||||||
|
private final field <TT;> a: java.lang.Object
|
||||||
|
}
|
||||||
|
|
||||||
|
@kotlin.Metadata
|
||||||
|
public interface<Ljava/lang/Object;Ljava/util/Collection<LB<Ljava/lang/Integer;>;>;Lkotlin/jvm/internal/markers/KMappedMarker;> IColl {
|
||||||
|
// source: 'kt43610.kt'
|
||||||
|
public abstract <(LB<Ljava/lang/Integer;>;)Z> method contains(@org.jetbrains.annotations.NotNull p0: B): boolean
|
||||||
|
}
|
||||||
+5
@@ -1552,6 +1552,11 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest {
|
|||||||
runTest("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/implementsSortedMap.kt");
|
runTest("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/implementsSortedMap.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt43610.kt")
|
||||||
|
public void testKt43610() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/kt43610.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("nonGenericClass.kt")
|
@TestMetadata("nonGenericClass.kt")
|
||||||
public void testNonGenericClass() throws Exception {
|
public void testNonGenericClass() throws Exception {
|
||||||
runTest("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/nonGenericClass.kt");
|
runTest("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/nonGenericClass.kt");
|
||||||
|
|||||||
+5
@@ -1522,6 +1522,11 @@ public class IrBytecodeListingTestGenerated extends AbstractIrBytecodeListingTes
|
|||||||
runTest("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/implementsSortedMap.kt");
|
runTest("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/implementsSortedMap.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt43610.kt")
|
||||||
|
public void testKt43610() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/kt43610.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("nonGenericClass.kt")
|
@TestMetadata("nonGenericClass.kt")
|
||||||
public void testNonGenericClass() throws Exception {
|
public void testNonGenericClass() throws Exception {
|
||||||
runTest("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/nonGenericClass.kt");
|
runTest("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/nonGenericClass.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user