JVM IR: Fix dispatch receiver types in FunctionNVarargBridgeLowering and ReplaceKFunctionInvokeWithFunctionInvoke

This commit is contained in:
Steven Schäfer
2020-01-27 13:33:47 +01:00
committed by Georgy Bronnikov
parent 66cbe3b1a8
commit 30166b20b7
2 changed files with 13 additions and 4 deletions
@@ -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)!! }
})
@@ -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))