JVM IR: Always produce stubs for interface methods in inline classes

This matches the behavior of the JVM backend, with the exception of
@JvmDefault methods, which are currently broken on the JVM backend.
This commit is contained in:
Steven Schäfer
2020-02-17 17:44:05 +01:00
committed by Alexander Udalov
parent 8c9ebc1bf9
commit 465e9f2d68
7 changed files with 141 additions and 43 deletions
@@ -0,0 +1,29 @@
// !LANGUAGE: +InlineClasses
// FILE: test.kt
fun box(): String {
val b = B(0)
return b.f() + b.g()
}
interface A {
fun f() = "O"
fun g() = "K"
}
inline class B(val x: Int) : A
// 1 public static f-impl\(I\)Ljava/lang/String;
// 1 public f\(\)Ljava/lang/String;
// 1 public static g-impl\(I\)Ljava/lang/String;
// 1 public g\(\)Ljava/lang/String;
// JVM_TEMPLATES:
// The JVM backend calls f-impl, g-impl from f, g, respectively, in addition to the call from box.
// 2 INVOKESTATIC B.g-impl \(I\)Ljava/lang/String;
// 2 INVOKESTATIC B.f-impl \(I\)Ljava/lang/String;
// JVM_IR_TEMPLATES:
// 1 INVOKESTATIC B.g-impl \(I\)Ljava/lang/String;
// 1 INVOKESTATIC B.f-impl \(I\)Ljava/lang/String;
@@ -0,0 +1,36 @@
// !LANGUAGE: +InlineClasses
// IGNORE_BACKEND: JVM
// The JVM backend does not generate the g-impl method, but ends up calling it from box.
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// FILE: test.kt
fun box(): String {
val b = B(0)
return b.f() + b.g()
}
interface A {
fun f() = "O"
@JvmDefault
fun g() = "K"
}
inline class B(val x: Int) : A
// 1 public static f-impl\(I\)Ljava/lang/String;
// 1 public f\(\)Ljava/lang/String;
// 1 public static g-impl\(I\)Ljava/lang/String;
// 0 public g\(\)Ljava/lang/String;
// 1 INVOKESTATIC B.g-impl \(I\)Ljava/lang/String;
// JVM_TEMPLATES:
// 2 INVOKESTATIC B.f-impl \(I\)Ljava/lang/String;
// JVM_IR_TEMPLATES:
// 1 INVOKESTATIC B.f-impl \(I\)Ljava/lang/String;