KT-37050 don't generate redundant special bridges
Loosely based on https://github.com/JetBrains/kotlin/pull/3662
This commit is contained in:
+10
-4
@@ -20,8 +20,8 @@ import org.jetbrains.kotlin.backend.jvm.ir.eraseTypeParameters
|
|||||||
import org.jetbrains.kotlin.backend.jvm.ir.isJvmAbstract
|
import org.jetbrains.kotlin.backend.jvm.ir.isJvmAbstract
|
||||||
import org.jetbrains.kotlin.backend.jvm.lower.inlineclasses.unboxInlineClass
|
import org.jetbrains.kotlin.backend.jvm.lower.inlineclasses.unboxInlineClass
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil
|
import org.jetbrains.kotlin.codegen.AsmUtil
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||||
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.builders.*
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.addFunction
|
import org.jetbrains.kotlin.ir.builders.declarations.addFunction
|
||||||
@@ -261,11 +261,17 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass
|
|||||||
methodInfo = specialBridge.methodInfo?.copy(argumentsToCheck = 0), // For potential argument boxing
|
methodInfo = specialBridge.methodInfo?.copy(argumentsToCheck = 0), // For potential argument boxing
|
||||||
isFinal = false,
|
isFinal = false,
|
||||||
)
|
)
|
||||||
// The part after ?: is needed for methods with default implementations in collection interfaces:
|
// The part after '?:' is needed for methods with default implementations in collection interfaces:
|
||||||
// MutableMap.remove() and getOrDefault().
|
// MutableMap.remove() and getOrDefault().
|
||||||
val superTarget = overriddenFromClass.takeIf { !it.isFakeOverride } ?: specialBridge.overridden
|
val superTarget = overriddenFromClass.takeIf { !it.isFakeOverride } ?: specialBridge.overridden
|
||||||
irClass.declarations.remove(irFunction)
|
if (superBridge.signature == superTarget.jvmMethod) {
|
||||||
irClass.addSpecialBridge(superBridge, superTarget)
|
// If the resulting bridge to a super member matches the signature of the bridge callee,
|
||||||
|
// bridge is not needed.
|
||||||
|
irFunction
|
||||||
|
} else {
|
||||||
|
irClass.declarations.remove(irFunction)
|
||||||
|
irClass.addSpecialBridge(superBridge, superTarget)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else -> irFunction
|
else -> irFunction
|
||||||
}
|
}
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
open class A1 {
|
open class A1 {
|
||||||
open val size: Int = 56
|
open val size: Int = 56
|
||||||
}
|
}
|
||||||
|
|||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
@kotlin.Metadata
|
||||||
|
public class A1 {
|
||||||
|
// source: 'redundantStubForSize.kt'
|
||||||
|
private final field size: int
|
||||||
|
public method <init>(): void
|
||||||
|
public method getSize(): int
|
||||||
|
}
|
||||||
|
|
||||||
|
@kotlin.Metadata
|
||||||
|
public final class A2 {
|
||||||
|
// source: 'redundantStubForSize.kt'
|
||||||
|
public method <init>(): void
|
||||||
|
public synthetic bridge method add(p0: java.lang.Object): boolean
|
||||||
|
public method add(p0: java.lang.String): boolean
|
||||||
|
public method addAll(p0: java.util.Collection): boolean
|
||||||
|
public method clear(): void
|
||||||
|
public method contains(@org.jetbrains.annotations.NotNull p0: java.lang.String): boolean
|
||||||
|
public bridge final method contains(p0: java.lang.Object): boolean
|
||||||
|
public method containsAll(@org.jetbrains.annotations.NotNull p0: java.util.Collection): boolean
|
||||||
|
public method isEmpty(): boolean
|
||||||
|
public @org.jetbrains.annotations.NotNull method iterator(): java.util.Iterator
|
||||||
|
public bridge final method remove(p0: java.lang.Object): boolean
|
||||||
|
public method remove(p0: java.lang.String): boolean
|
||||||
|
public method removeAll(p0: java.util.Collection): boolean
|
||||||
|
public method retainAll(p0: java.util.Collection): boolean
|
||||||
|
public bridge final method size(): int
|
||||||
|
public method toArray(): java.lang.Object[]
|
||||||
|
public method toArray(p0: java.lang.Object[]): java.lang.Object[]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user