JVM IR: do not copy call in ResolveInlineCalls
This is just a refactoring/optimization that makes use of the fact that IrCall.symbol is now mutable.
This commit is contained in:
committed by
Space Team
parent
c8862f3aa8
commit
994d61a360
+27
-37
@@ -10,19 +10,17 @@ import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase
|
||||
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
||||
import org.jetbrains.kotlin.backend.jvm.ir.isInlineFunctionCall
|
||||
import org.jetbrains.kotlin.backend.jvm.isMultifileBridge
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||
import org.jetbrains.kotlin.ir.expressions.IrTypeOperator
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl
|
||||
import org.jetbrains.kotlin.ir.util.copyTypeAndValueArgumentsFrom
|
||||
import org.jetbrains.kotlin.ir.util.defaultType
|
||||
import org.jetbrains.kotlin.ir.util.parentAsClass
|
||||
import org.jetbrains.kotlin.ir.util.resolveFakeOverride
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
||||
|
||||
internal val resolveInlineCallsPhase = makeIrModulePhase(
|
||||
::ResolveInlineCalls,
|
||||
@@ -30,42 +28,34 @@ internal val resolveInlineCallsPhase = makeIrModulePhase(
|
||||
description = "Statically resolve calls to inline methods to particular implementations"
|
||||
)
|
||||
|
||||
class ResolveInlineCalls(val context: JvmBackendContext) : IrElementTransformerVoid(), FileLoweringPass {
|
||||
override fun lower(irFile: IrFile) = irFile.transformChildrenVoid()
|
||||
class ResolveInlineCalls(val context: JvmBackendContext) : IrElementVisitorVoid, FileLoweringPass {
|
||||
override fun lower(irFile: IrFile) = irFile.acceptChildren(this, null)
|
||||
|
||||
override fun visitCall(expression: IrCall): IrExpression {
|
||||
if (!expression.symbol.owner.isInlineFunctionCall(context))
|
||||
return super.visitCall(expression)
|
||||
val maybeFakeOverrideOfMultiFileBridge = expression.symbol.owner as? IrSimpleFunction
|
||||
?: return super.visitCall(expression)
|
||||
override fun visitElement(element: IrElement) {
|
||||
element.acceptChildren(this, null)
|
||||
}
|
||||
|
||||
override fun visitCall(expression: IrCall) {
|
||||
expression.acceptChildren(this, null)
|
||||
|
||||
if (!expression.symbol.owner.isInlineFunctionCall(context)) return
|
||||
val maybeFakeOverrideOfMultiFileBridge = expression.symbol.owner as? IrSimpleFunction ?: return
|
||||
val resolved =
|
||||
maybeFakeOverrideOfMultiFileBridge.resolveMultiFileFacadeMember() ?: maybeFakeOverrideOfMultiFileBridge.resolveFakeOverride()
|
||||
?: return super.visitCall(expression)
|
||||
return super.visitCall(with(expression) {
|
||||
IrCallImpl(
|
||||
startOffset,
|
||||
endOffset,
|
||||
type,
|
||||
resolved.symbol,
|
||||
expression.typeArgumentsCount,
|
||||
expression.valueArgumentsCount,
|
||||
expression.origin,
|
||||
superQualifierSymbol
|
||||
).apply {
|
||||
copyTypeAndValueArgumentsFrom(expression)
|
||||
dispatchReceiver?.let { receiver ->
|
||||
val receiverType = resolved.parentAsClass.defaultType
|
||||
dispatchReceiver = IrTypeOperatorCallImpl(
|
||||
receiver.startOffset,
|
||||
receiver.endOffset,
|
||||
receiverType,
|
||||
IrTypeOperator.IMPLICIT_CAST,
|
||||
receiverType,
|
||||
receiver
|
||||
)
|
||||
}
|
||||
}
|
||||
})
|
||||
?: return
|
||||
|
||||
expression.symbol = resolved.symbol
|
||||
expression.dispatchReceiver?.let { receiver ->
|
||||
val receiverType = resolved.parentAsClass.defaultType
|
||||
expression.dispatchReceiver = IrTypeOperatorCallImpl(
|
||||
receiver.startOffset,
|
||||
receiver.endOffset,
|
||||
receiverType,
|
||||
IrTypeOperator.IMPLICIT_CAST,
|
||||
receiverType,
|
||||
receiver
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun IrFunction.resolveMultiFileFacadeMember(): IrSimpleFunction? =
|
||||
|
||||
Reference in New Issue
Block a user