From e1d3b21201947d53cbe6d432edd40fd98ab555c4 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Tue, 6 Feb 2018 13:56:24 +0300 Subject: [PATCH] Skip bridge methods generation for inline classes --- .../kotlin/codegen/FunctionCodegen.java | 4 +++- .../noBridgesForErasedInlineClass.kt | 9 +++++++++ .../noBridgesForErasedInlineClass.txt | 20 +++++++++++++++++++ .../codegen/BytecodeListingTestGenerated.java | 6 ++++++ 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.kt create mode 100644 compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.txt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java index 5dba959bde9..2aa7e0b6ede 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java @@ -218,7 +218,9 @@ public class FunctionCodegen { generateParameterAnnotations(functionDescriptor, mv, jvmSignature); GenerateJava8ParameterNamesKt.generateParameterNames(functionDescriptor, mv, jvmSignature, state, (flags & ACC_SYNTHETIC) != 0); - generateBridges(functionDescriptor); + if (contextKind != OwnerKind.ERASED_INLINE_CLASS) { + generateBridges(functionDescriptor); + } if (isJvm8InterfaceWithDefaultsMember(functionDescriptor, state) && contextKind != OwnerKind.DEFAULT_IMPLS && state.getGenerateDefaultImplsForJvm8()) { generateDelegateForDefaultImpl(functionDescriptor, origin.getElement()); diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.kt b/compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.kt new file mode 100644 index 00000000000..7d665432f24 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.kt @@ -0,0 +1,9 @@ +// !LANGUAGE: +InlineClasses + +interface A { + fun foo(a: T) +} + +inline class Foo(val x: Long) : A { + override fun foo(a: Foo) {} +} \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.txt new file mode 100644 index 00000000000..21e4fa431fe --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.txt @@ -0,0 +1,20 @@ +@kotlin.Metadata +public interface A { + public abstract method foo(p0: java.lang.Object): void +} + +@kotlin.Metadata +public final static class Foo$Erased { + public final static @org.jetbrains.annotations.NotNull method box(p0: long): Foo + public static method foo(p0: long, p1: long): void +} + +@kotlin.Metadata +public final class Foo { + private final field x: long + public method (p0: long): void + public synthetic method foo(p0: java.lang.Object): void + public method foo(p0: long): void + public final method getX(): long + public final method unbox(): long +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java index eafba6acaeb..f64db0faf34 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java @@ -267,6 +267,12 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/bytecodeListing/inlineClasses"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("noBridgesForErasedInlineClass.kt") + public void testNoBridgesForErasedInlineClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.kt"); + doTest(fileName); + } + @TestMetadata("shapeOfInlineClassWithPrimitive.kt") public void testShapeOfInlineClassWithPrimitive() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeListing/inlineClasses/shapeOfInlineClassWithPrimitive.kt");