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.JvmBackendContext
|
||||||
import org.jetbrains.kotlin.backend.jvm.ir.isInlineFunctionCall
|
import org.jetbrains.kotlin.backend.jvm.ir.isInlineFunctionCall
|
||||||
import org.jetbrains.kotlin.backend.jvm.isMultifileBridge
|
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.IrFile
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
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.IrTypeOperator
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl
|
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.defaultType
|
||||||
import org.jetbrains.kotlin.ir.util.parentAsClass
|
import org.jetbrains.kotlin.ir.util.parentAsClass
|
||||||
import org.jetbrains.kotlin.ir.util.resolveFakeOverride
|
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(
|
internal val resolveInlineCallsPhase = makeIrModulePhase(
|
||||||
::ResolveInlineCalls,
|
::ResolveInlineCalls,
|
||||||
@@ -30,42 +28,34 @@ internal val resolveInlineCallsPhase = makeIrModulePhase(
|
|||||||
description = "Statically resolve calls to inline methods to particular implementations"
|
description = "Statically resolve calls to inline methods to particular implementations"
|
||||||
)
|
)
|
||||||
|
|
||||||
class ResolveInlineCalls(val context: JvmBackendContext) : IrElementTransformerVoid(), FileLoweringPass {
|
class ResolveInlineCalls(val context: JvmBackendContext) : IrElementVisitorVoid, FileLoweringPass {
|
||||||
override fun lower(irFile: IrFile) = irFile.transformChildrenVoid()
|
override fun lower(irFile: IrFile) = irFile.acceptChildren(this, null)
|
||||||
|
|
||||||
override fun visitCall(expression: IrCall): IrExpression {
|
override fun visitElement(element: IrElement) {
|
||||||
if (!expression.symbol.owner.isInlineFunctionCall(context))
|
element.acceptChildren(this, null)
|
||||||
return super.visitCall(expression)
|
}
|
||||||
val maybeFakeOverrideOfMultiFileBridge = expression.symbol.owner as? IrSimpleFunction
|
|
||||||
?: return super.visitCall(expression)
|
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 =
|
val resolved =
|
||||||
maybeFakeOverrideOfMultiFileBridge.resolveMultiFileFacadeMember() ?: maybeFakeOverrideOfMultiFileBridge.resolveFakeOverride()
|
maybeFakeOverrideOfMultiFileBridge.resolveMultiFileFacadeMember() ?: maybeFakeOverrideOfMultiFileBridge.resolveFakeOverride()
|
||||||
?: return super.visitCall(expression)
|
?: return
|
||||||
return super.visitCall(with(expression) {
|
|
||||||
IrCallImpl(
|
expression.symbol = resolved.symbol
|
||||||
startOffset,
|
expression.dispatchReceiver?.let { receiver ->
|
||||||
endOffset,
|
val receiverType = resolved.parentAsClass.defaultType
|
||||||
type,
|
expression.dispatchReceiver = IrTypeOperatorCallImpl(
|
||||||
resolved.symbol,
|
receiver.startOffset,
|
||||||
expression.typeArgumentsCount,
|
receiver.endOffset,
|
||||||
expression.valueArgumentsCount,
|
receiverType,
|
||||||
expression.origin,
|
IrTypeOperator.IMPLICIT_CAST,
|
||||||
superQualifierSymbol
|
receiverType,
|
||||||
).apply {
|
receiver
|
||||||
copyTypeAndValueArgumentsFrom(expression)
|
)
|
||||||
dispatchReceiver?.let { receiver ->
|
}
|
||||||
val receiverType = resolved.parentAsClass.defaultType
|
|
||||||
dispatchReceiver = IrTypeOperatorCallImpl(
|
|
||||||
receiver.startOffset,
|
|
||||||
receiver.endOffset,
|
|
||||||
receiverType,
|
|
||||||
IrTypeOperator.IMPLICIT_CAST,
|
|
||||||
receiverType,
|
|
||||||
receiver
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun IrFunction.resolveMultiFileFacadeMember(): IrSimpleFunction? =
|
private fun IrFunction.resolveMultiFileFacadeMember(): IrSimpleFunction? =
|
||||||
|
|||||||
Reference in New Issue
Block a user