JVM KT-41150: Fix backward compatibility for inline vals in inline class

In 1.3.x, for inline class member inline vals 'getFoo-impl' method was
generated in corresponding inline class.
Since 1.4.0, getters for properties returning inline class values are
mangled (so corresponding getters are named 'getFoo-<mangling_hash>'.
However, to maintain backward compatibility with libraries compiled with
1.3.x, inliner should be able to find 'getFoo-impl' method in the
bytecode.
This commit is contained in:
Dmitry Petrov
2020-08-24 11:54:59 +03:00
parent 27a22fc1e9
commit a2dabe11c5
9 changed files with 59 additions and 0 deletions
@@ -658,6 +658,10 @@ abstract class InlineCodegen<out T : BaseExpressionCodegen>(
if (nameWithoutManglingSuffix != null) {
methodNode = getMethodNode(bytes, nameWithoutManglingSuffix, asmMethod.descriptor, classType)
}
if (methodNode == null) {
val nameWithImplSuffix = "$nameWithoutManglingSuffix-impl"
methodNode = getMethodNode(bytes, nameWithImplSuffix, asmMethod.descriptor, classType)
}
}
return methodNode
}
@@ -0,0 +1,20 @@
// !LANGUAGE: +InlineClasses
// FILE: 1.kt
package test
inline class IC1(val x: String) {
inline val test get() = IC2(x)
}
inline class IC2(val x: String)
// FILE: 2.kt
// NO_CHECK_LAMBDA_INLINING
import test.*
fun box() : String =
IC1("OK").test.x
@@ -1891,6 +1891,11 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/boxInline/inlineClasses"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true);
}
@TestMetadata("inlineClassWithInlineValReturningInlineClass.kt")
public void testInlineClassWithInlineValReturningInlineClass() throws Exception {
runTest("compiler/testData/codegen/boxInline/inlineClasses/inlineClassWithInlineValReturningInlineClass.kt");
}
@TestMetadata("inlineFunctionInsideInlineClassesBox.kt")
public void testInlineFunctionInsideInlineClassesBox() throws Exception {
runTest("compiler/testData/codegen/boxInline/inlineClasses/inlineFunctionInsideInlineClassesBox.kt");
@@ -1891,6 +1891,11 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/boxInline/inlineClasses"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true);
}
@TestMetadata("inlineClassWithInlineValReturningInlineClass.kt")
public void testInlineClassWithInlineValReturningInlineClass() throws Exception {
runTest("compiler/testData/codegen/boxInline/inlineClasses/inlineClassWithInlineValReturningInlineClass.kt");
}
@TestMetadata("inlineFunctionInsideInlineClassesBox.kt")
public void testInlineFunctionInsideInlineClassesBox() throws Exception {
runTest("compiler/testData/codegen/boxInline/inlineClasses/inlineFunctionInsideInlineClassesBox.kt");
@@ -1891,6 +1891,11 @@ public class IrBlackBoxInlineCodegenTestGenerated extends AbstractIrBlackBoxInli
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/boxInline/inlineClasses"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true);
}
@TestMetadata("inlineClassWithInlineValReturningInlineClass.kt")
public void testInlineClassWithInlineValReturningInlineClass() throws Exception {
runTest("compiler/testData/codegen/boxInline/inlineClasses/inlineClassWithInlineValReturningInlineClass.kt");
}
@TestMetadata("inlineFunctionInsideInlineClassesBox.kt")
public void testInlineFunctionInsideInlineClassesBox() throws Exception {
runTest("compiler/testData/codegen/boxInline/inlineClasses/inlineFunctionInsideInlineClassesBox.kt");
@@ -1891,6 +1891,11 @@ public class IrCompileKotlinAgainstInlineKotlinTestGenerated extends AbstractIrC
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/boxInline/inlineClasses"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true);
}
@TestMetadata("inlineClassWithInlineValReturningInlineClass.kt")
public void testInlineClassWithInlineValReturningInlineClass() throws Exception {
runTest("compiler/testData/codegen/boxInline/inlineClasses/inlineClassWithInlineValReturningInlineClass.kt");
}
@TestMetadata("inlineFunctionInsideInlineClassesBox.kt")
public void testInlineFunctionInsideInlineClassesBox() throws Exception {
runTest("compiler/testData/codegen/boxInline/inlineClasses/inlineFunctionInsideInlineClassesBox.kt");
@@ -1691,6 +1691,11 @@ public class IrJsCodegenInlineES6TestGenerated extends AbstractIrJsCodegenInline
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/boxInline/inlineClasses"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
}
@TestMetadata("inlineClassWithInlineValReturningInlineClass.kt")
public void testInlineClassWithInlineValReturningInlineClass() throws Exception {
runTest("compiler/testData/codegen/boxInline/inlineClasses/inlineClassWithInlineValReturningInlineClass.kt");
}
@TestMetadata("inlineFunctionInsideInlineClassesBox.kt")
public void testInlineFunctionInsideInlineClassesBox() throws Exception {
runTest("compiler/testData/codegen/boxInline/inlineClasses/inlineFunctionInsideInlineClassesBox.kt");
@@ -1691,6 +1691,11 @@ public class IrJsCodegenInlineTestGenerated extends AbstractIrJsCodegenInlineTes
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/boxInline/inlineClasses"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR, true);
}
@TestMetadata("inlineClassWithInlineValReturningInlineClass.kt")
public void testInlineClassWithInlineValReturningInlineClass() throws Exception {
runTest("compiler/testData/codegen/boxInline/inlineClasses/inlineClassWithInlineValReturningInlineClass.kt");
}
@TestMetadata("inlineFunctionInsideInlineClassesBox.kt")
public void testInlineFunctionInsideInlineClassesBox() throws Exception {
runTest("compiler/testData/codegen/boxInline/inlineClasses/inlineFunctionInsideInlineClassesBox.kt");
@@ -1691,6 +1691,11 @@ public class JsCodegenInlineTestGenerated extends AbstractJsCodegenInlineTest {
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/boxInline/inlineClasses"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS, true);
}
@TestMetadata("inlineClassWithInlineValReturningInlineClass.kt")
public void testInlineClassWithInlineValReturningInlineClass() throws Exception {
runTest("compiler/testData/codegen/boxInline/inlineClasses/inlineClassWithInlineValReturningInlineClass.kt");
}
@TestMetadata("inlineFunctionInsideInlineClassesBox.kt")
public void testInlineFunctionInsideInlineClassesBox() throws Exception {
runTest("compiler/testData/codegen/boxInline/inlineClasses/inlineFunctionInsideInlineClassesBox.kt");