JVM IR: do not copy call in InterfaceObjectCallsLowering

This is just a refactoring/optimization that makes use of the fact that
IrCall.symbol is now mutable.
This commit is contained in:
Alexander Udalov
2023-06-17 00:17:13 +02:00
committed by Space Team
parent 7ae195d9eb
commit 572892dc8a
@@ -254,20 +254,28 @@ internal val interfaceObjectCallsPhase = makeIrFilePhase(
description = "Resolve calls to Object methods on interface types to virtual methods"
)
private class InterfaceObjectCallsLowering(val context: JvmBackendContext) : IrElementTransformerVoid(), FileLoweringPass {
override fun lower(irFile: IrFile) = irFile.transformChildrenVoid(this)
private class InterfaceObjectCallsLowering(val context: JvmBackendContext) : IrElementVisitorVoid, FileLoweringPass {
override fun lower(irFile: IrFile) = irFile.acceptChildren(this, null)
override fun visitElement(element: IrElement) {
element.acceptChildren(this, null)
}
override fun visitCall(expression: IrCall) {
expression.acceptChildren(this, null)
if (expression.superQualifierSymbol != null && !expression.isSuperToAny()) return
override fun visitCall(expression: IrCall): IrExpression {
if (expression.superQualifierSymbol != null && !expression.isSuperToAny())
return super.visitCall(expression)
val callee = expression.symbol.owner
if (!callee.hasInterfaceParent() && expression.dispatchReceiver?.run { type.erasedUpperBound.isJvmInterface } != true)
return super.visitCall(expression)
if (!callee.hasInterfaceParent() && expression.dispatchReceiver?.run { type.erasedUpperBound.isJvmInterface } != true) return
val resolved = callee.resolveFakeOverride()
if (resolved?.isMethodOfAny() != true)
return super.visitCall(expression)
val newSuperQualifierSymbol = context.irBuiltIns.anyClass.takeIf { expression.superQualifierSymbol != null }
return super.visitCall(irCall(expression, resolved, newSuperQualifierSymbol = newSuperQualifierSymbol))
if (resolved?.isMethodOfAny() != true) return
expression.symbol = resolved.symbol
if (expression.superQualifierSymbol != null) {
expression.superQualifierSymbol = context.irBuiltIns.anyClass
}
}
}