From 572892dc8ac8b8dc9183dc0bd46e2c5726838bc8 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Sat, 17 Jun 2023 00:17:13 +0200 Subject: [PATCH] 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. --- ...nheritedDefaultMethodsOnClassesLowering.kt | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/InheritedDefaultMethodsOnClassesLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/InheritedDefaultMethodsOnClassesLowering.kt index a052b0e8e19..b72a4fb8406 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/InheritedDefaultMethodsOnClassesLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/InheritedDefaultMethodsOnClassesLowering.kt @@ -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 + } } }