[K/N][IR] Fixed wrong IrCall type (to fix IR validation)
This commit is contained in:
+14
-13
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user