[K/N][IR] Fixed wrong IrCall type (to fix IR validation)

This commit is contained in:
Igor Chevdar
2023-02-09 13:28:54 +02:00
committed by Space Team
parent 0655b02097
commit 95c4ded9d0
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi2ir.generators.implicitCastTo
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
@@ -1401,14 +1402,13 @@ internal object DevirtualizationAnalysis {
} }
} }
fun IrBuilderWithScope.irDevirtualizedCall(callSite: IrCall, fun irDevirtualizedCall(callSite: IrCall,
actualType: IrType, actualType: IrType,
devirtualizedCallee: DevirtualizedCallee, actualCallee: IrSimpleFunction,
arguments: List<IrExpression>): IrCall { arguments: List<IrExpression>): IrExpression {
val actualCallee = devirtualizedCallee.callee.irFunction as IrSimpleFunction
val call = IrCallImpl( val call = IrCallImpl(
callSite.startOffset, callSite.endOffset, callSite.startOffset, callSite.endOffset,
actualType, actualCallee.returnType,
actualCallee.symbol, actualCallee.symbol,
actualCallee.typeParameters.size, actualCallee.typeParameters.size,
actualCallee.valueParameters.size, actualCallee.valueParameters.size,
@@ -1420,21 +1420,22 @@ internal object DevirtualizationAnalysis {
actualCallee.dump() actualCallee.dump()
} }
arguments.forEachIndexed { index, argument -> call.putArgument(index, argument) } arguments.forEachIndexed { index, argument -> call.putArgument(index, argument) }
return call return call.implicitCastIfNeededTo(actualType)
} }
fun IrBuilderWithScope.irDevirtualizedCall(callee: IrCall, actualType: IrType, fun IrBuilderWithScope.irDevirtualizedCall(callSite: IrCall, actualType: IrType,
devirtualizedCallee: DevirtualizedCallee, devirtualizedCallee: DevirtualizedCallee,
arguments: List<PossiblyCoercedValue>): IrExpression { arguments: List<PossiblyCoercedValue>): IrExpression {
val actualCallee = devirtualizedCallee.callee as DataFlowIR.FunctionSymbol.Declared val actualCallee = devirtualizedCallee.callee as DataFlowIR.FunctionSymbol.Declared
return actualCallee.bridgeTarget.let { bridgeTarget -> return actualCallee.bridgeTarget.let { bridgeTarget ->
if (bridgeTarget == null) if (bridgeTarget == null)
irDevirtualizedCall(callee, actualType, irDevirtualizedCall(callSite, actualType,
devirtualizedCallee, actualCallee.irFunction as IrSimpleFunction,
arguments.map { it.getFullValue(this@irDevirtualizedCall) }) arguments.map { it.getFullValue(this@irDevirtualizedCall) }
)
else { else {
val callResult = irDevirtualizedCall(callee, actualType, val callResult = irDevirtualizedCall(callSite, actualType,
DevirtualizedCallee(devirtualizedCallee.receiverType, bridgeTarget), bridgeTarget.irFunction as IrSimpleFunction,
arguments.mapIndexed { index, value -> arguments.mapIndexed { index, value ->
val coercion = getTypeConversion(actualCallee.parameters[index], bridgeTarget.parameters[index]) val coercion = getTypeConversion(actualCallee.parameters[index], bridgeTarget.parameters[index])
val fullValue = value.getFullValue(this@irDevirtualizedCall) val fullValue = value.getFullValue(this@irDevirtualizedCall)