JVM IR: Add all relevant overridden symbols to generated bridge methods
This commit is contained in:
committed by
Georgy Bronnikov
parent
951b2fa770
commit
304700cf7b
+14
-4
@@ -119,7 +119,11 @@ internal val bridgePhase = makeIrFilePhase(
|
|||||||
|
|
||||||
private class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass, IrElementTransformerVoid() {
|
private class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass, IrElementTransformerVoid() {
|
||||||
// Represents a synthetic bridge to `overridden` with a precomputed signature
|
// Represents a synthetic bridge to `overridden` with a precomputed signature
|
||||||
private class Bridge(val overridden: IrSimpleFunction, val signature: Method)
|
private class Bridge(
|
||||||
|
val overridden: IrSimpleFunction,
|
||||||
|
val signature: Method,
|
||||||
|
val overriddenSymbols: MutableList<IrSimpleFunctionSymbol> = mutableListOf()
|
||||||
|
)
|
||||||
|
|
||||||
// Represents a special bridge to `overridden`. Special bridges are always public and non-synthetic.
|
// Represents a special bridge to `overridden`. Special bridges are always public and non-synthetic.
|
||||||
// There are ten type-safe wrappers for different collection methods, which have an additional `methodInfo`
|
// There are ten type-safe wrappers for different collection methods, which have an additional `methodInfo`
|
||||||
@@ -257,8 +261,10 @@ private class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass,
|
|||||||
|
|
||||||
irFunction.allOverridden().filter { !it.isFakeOverride }.forEach { override ->
|
irFunction.allOverridden().filter { !it.isFakeOverride }.forEach { override ->
|
||||||
val signature = override.jvmMethod
|
val signature = override.jvmMethod
|
||||||
if (targetMethod != signature && signature !in generated && signature !in blacklist) {
|
if (targetMethod != signature && signature !in blacklist) {
|
||||||
generated[signature] = Bridge(override, signature)
|
generated.getOrPut(signature) {
|
||||||
|
Bridge(override, signature)
|
||||||
|
}.overriddenSymbols += override.symbol
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -351,7 +357,11 @@ private class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass,
|
|||||||
}.apply {
|
}.apply {
|
||||||
copyParametersWithErasure(this@addBridge, bridge.overridden)
|
copyParametersWithErasure(this@addBridge, bridge.overridden)
|
||||||
body = context.createIrBuilder(symbol).run { irExprBody(delegatingCall(this@apply, target)) }
|
body = context.createIrBuilder(symbol).run { irExprBody(delegatingCall(this@apply, target)) }
|
||||||
overriddenSymbols += bridge.overridden.symbol
|
|
||||||
|
val redundantOverrides = bridge.overriddenSymbols.flatMapTo(mutableSetOf()) {
|
||||||
|
it.owner.allOverridden().map { override -> override.symbol }.asIterable()
|
||||||
|
}
|
||||||
|
overriddenSymbols = bridge.overriddenSymbols.filter { it !in redundantOverrides }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun IrClass.addSpecialBridge(specialBridge: SpecialBridge, target: IrSimpleFunction): IrSimpleFunction =
|
private fun IrClass.addSpecialBridge(specialBridge: SpecialBridge, target: IrSimpleFunction): IrSimpleFunction =
|
||||||
|
|||||||
Reference in New Issue
Block a user