JVM IR: Fix dispatch receiver types in FunctionNVarargBridgeLowering and ReplaceKFunctionInvokeWithFunctionInvoke
This commit is contained in:
committed by
Georgy Bronnikov
parent
66cbe3b1a8
commit
30166b20b7
+6
-3
@@ -49,13 +49,16 @@ private class FunctionNVarargBridgeLowering(val context: JvmBackendContext) :
|
||||
override fun visitFunctionAccess(expression: IrFunctionAccessExpression): IrExpression {
|
||||
if (expression.valueArgumentsCount < FunctionInvokeDescriptor.BIG_ARITY ||
|
||||
!expression.symbol.owner.parentAsClass.defaultType.isFunctionOrKFunction() ||
|
||||
expression.symbol.owner.name.asString() != "invoke")
|
||||
return super.visitFunctionAccess(expression)
|
||||
expression.symbol.owner.name.asString() != "invoke"
|
||||
) return super.visitFunctionAccess(expression)
|
||||
|
||||
return context.createJvmIrBuilder(currentScope!!.scope.scopeOwnerSymbol).run {
|
||||
at(expression)
|
||||
irCall(functionNInvokeFun).apply {
|
||||
dispatchReceiver = expression.dispatchReceiver
|
||||
dispatchReceiver = irImplicitCast(
|
||||
expression.dispatchReceiver!!,
|
||||
this@FunctionNVarargBridgeLowering.context.ir.symbols.functionN.defaultType
|
||||
)
|
||||
putValueArgument(0, irArray(irSymbols.array.typeWith(context.irBuiltIns.anyNType)) {
|
||||
(0 until expression.valueArgumentsCount).forEach { +expression.getValueArgument(it)!! }
|
||||
})
|
||||
|
||||
+7
-1
@@ -13,11 +13,14 @@ import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||
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.copyTypeArgumentsFrom
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl
|
||||
import org.jetbrains.kotlin.ir.util.defaultType
|
||||
import org.jetbrains.kotlin.ir.util.isKFunction
|
||||
import org.jetbrains.kotlin.ir.util.isKSuspendFunction
|
||||
import org.jetbrains.kotlin.ir.util.parentAsClass
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
@@ -50,7 +53,10 @@ private class ReplaceKFunctionInvokeWithFunctionInvoke : FileLoweringPass, IrEle
|
||||
return expression.run {
|
||||
IrCallImpl(startOffset, endOffset, type, newCallee).apply {
|
||||
copyTypeArgumentsFrom(expression)
|
||||
dispatchReceiver = expression.dispatchReceiver?.transform(this@ReplaceKFunctionInvokeWithFunctionInvoke, null)
|
||||
dispatchReceiver = expression.dispatchReceiver?.transform(this@ReplaceKFunctionInvokeWithFunctionInvoke, null)?.let {
|
||||
val newType = newCallee.owner.parentAsClass.defaultType
|
||||
IrTypeOperatorCallImpl(startOffset, endOffset, newType, IrTypeOperator.IMPLICIT_CAST, newType, it)
|
||||
}
|
||||
extensionReceiver = expression.extensionReceiver?.transform(this@ReplaceKFunctionInvokeWithFunctionInvoke, null)
|
||||
for (i in 0 until valueArgumentsCount) {
|
||||
putValueArgument(i, expression.getValueArgument(i)?.transform(this@ReplaceKFunctionInvokeWithFunctionInvoke, null))
|
||||
|
||||
Reference in New Issue
Block a user