JVM_IR: remove an unnecessary hack from BridgeLowering

Correct IR is more important than whether some inaccessible members
precisely match what was generated by the old backend.
This commit is contained in:
pyos
2021-06-02 14:56:11 +02:00
committed by teamcityserver
parent 6f54e9fd5c
commit 288451db4d
4 changed files with 135 additions and 12 deletions
@@ -228,17 +228,6 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass
for (member in potentialBridgeTargets) {
val parent = member.parentAsClass
createBridges(parent, member)
// For lambda classes, we move overrides from the `invoke` function to its bridge. This will allow us to avoid boxing
// the return type of `invoke` in codegen for lambdas with primitive return type. This does not apply to lambdas returning
// inline class types erasing to Any, which we need to box.
if (member.name == OperatorNameConventions.INVOKE
&& (parent.origin == JvmLoweredDeclarationOrigin.LAMBDA_IMPL ||
parent.origin == JvmLoweredDeclarationOrigin.FUNCTION_REFERENCE_IMPL)
&& !member.returnType.isInlineClassErasingToAny
) {
member.overriddenSymbols = emptyList()
}
}
}
@@ -436,6 +425,7 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass
returnType = bridge.overridden.returnType.eraseTypeParameters()
isSuspend = bridge.overridden.isSuspend
}.apply {
copyAttributes(target)
copyParametersWithErasure(this@addBridge, bridge.overridden)
body = context.createIrBuilder(symbol, startOffset, endOffset).run { irExprBody(delegatingCall(this@apply, target)) }
@@ -0,0 +1,50 @@
@java.lang.annotation.Retention
@kotlin.Metadata
public annotation class Ann {
// source: 'kt9320.kt'
}
@kotlin.annotation.Target
@kotlin.annotation.Retention
@java.lang.annotation.Retention
@java.lang.annotation.Target
@kotlin.Metadata
public annotation class AnnExpr {
// source: 'kt9320.kt'
}
@Ann
@kotlin.Metadata
public final class Kt9320Kt$foo$v$1 {
// source: 'kt9320.kt'
enclosing method Kt9320Kt.foo()V
inner (anonymous) class Kt9320Kt$foo$v$1
method <init>(): void
}
@kotlin.Metadata
final class Kt9320Kt$foo$w$1 {
// source: 'kt9320.kt'
enclosing method Kt9320Kt.foo()V
public final static field INSTANCE: Kt9320Kt$foo$w$1
inner (anonymous) class Kt9320Kt$foo$w$1
static method <clinit>(): void
method <init>(): void
public final @Ann @org.jetbrains.annotations.NotNull method invoke(@org.jetbrains.annotations.NotNull p0: My): java.lang.Integer
public synthetic bridge method invoke(p0: java.lang.Object): java.lang.Object
}
@kotlin.Metadata
public final class Kt9320Kt {
// source: 'kt9320.kt'
inner (anonymous) class Kt9320Kt$foo$v$1
inner (anonymous) class Kt9320Kt$foo$w$1
public final static method foo(): void
}
@Ann
@kotlin.Metadata
public class My {
// source: 'kt9320.kt'
public method <init>(): void
}
@@ -0,0 +1,83 @@
@kotlin.annotation.Target
@java.lang.annotation.Retention
@java.lang.annotation.Target
@kotlin.Metadata
public annotation class ClsAnn {
// source: 'literals.kt'
}
@kotlin.annotation.Target
@kotlin.annotation.Retention
@java.lang.annotation.Retention
@java.lang.annotation.Target
@kotlin.Metadata
public annotation class ExprAnn {
// source: 'literals.kt'
}
@kotlin.annotation.Target
@java.lang.annotation.Retention
@java.lang.annotation.Target
@kotlin.Metadata
public annotation class FunAnn {
// source: 'literals.kt'
}
@kotlin.Metadata
final class LiteralsKt$foo$1 {
// source: 'literals.kt'
enclosing method LiteralsKt.foo(I)LMy;
synthetic final field $arg: int
inner (anonymous) class LiteralsKt$foo$1
method <init>(p0: int): void
public final @FunAnn @org.jetbrains.annotations.NotNull method invoke(): java.lang.Integer
public synthetic bridge method invoke(): java.lang.Object
}
@kotlin.Metadata
final class LiteralsKt$foo$2 {
// source: 'literals.kt'
enclosing method LiteralsKt.foo(I)LMy;
synthetic final field $arg: int
inner (anonymous) class LiteralsKt$foo$2
method <init>(p0: int): void
public final @org.jetbrains.annotations.NotNull method invoke(): java.lang.Integer
public synthetic bridge method invoke(): java.lang.Object
}
@ClsAnn
@kotlin.Metadata
public final class LiteralsKt$foo$3 {
// source: 'literals.kt'
enclosing method LiteralsKt.foo(I)LMy;
inner (anonymous) class LiteralsKt$foo$3
method <init>(): void
}
@kotlin.Metadata
final class LiteralsKt$foo$x$1 {
// source: 'literals.kt'
enclosing method LiteralsKt.foo(I)LMy;
synthetic final field $arg: int
inner (anonymous) class LiteralsKt$foo$x$1
method <init>(p0: int): void
public final @FunAnn @org.jetbrains.annotations.NotNull method invoke(): java.lang.Integer
public synthetic bridge method invoke(): java.lang.Object
}
@kotlin.Metadata
public final class LiteralsKt {
// source: 'literals.kt'
inner (anonymous) class LiteralsKt$foo$1
inner (anonymous) class LiteralsKt$foo$2
inner (anonymous) class LiteralsKt$foo$3
inner (anonymous) class LiteralsKt$foo$x$1
public final static method bar(@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function0): int
public final static @org.jetbrains.annotations.NotNull method foo(p0: int): My
}
@kotlin.Metadata
public class My {
// source: 'literals.kt'
public method <init>(): void
}
@@ -3,4 +3,4 @@ fun test() {
1.fn()
}
// 1 invoke \(I\)I
// 1 invoke \(Ljava/lang/Object;\)Ljava/lang/Object;