Don't create redundant copies in DefaultArgumentStubGenerator
This commit is contained in:
+10
-13
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.common.ir.*
|
|||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
import org.jetbrains.kotlin.ir.builders.*
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
|
import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
||||||
@@ -72,7 +73,7 @@ open class DefaultArgumentStubGenerator(
|
|||||||
val builder = context.createIrBuilder(newIrFunction.symbol)
|
val builder = context.createIrBuilder(newIrFunction.symbol)
|
||||||
|
|
||||||
newIrFunction.body = builder.irBlockBody(newIrFunction) {
|
newIrFunction.body = builder.irBlockBody(newIrFunction) {
|
||||||
val params = mutableListOf<IrVariable>()
|
val params = mutableListOf<IrValueDeclaration>()
|
||||||
val variables = mutableMapOf<IrValueDeclaration, IrValueDeclaration>()
|
val variables = mutableMapOf<IrValueDeclaration, IrValueDeclaration>()
|
||||||
|
|
||||||
irFunction.dispatchReceiverParameter?.let {
|
irFunction.dispatchReceiverParameter?.let {
|
||||||
@@ -85,8 +86,7 @@ open class DefaultArgumentStubGenerator(
|
|||||||
|
|
||||||
for (valueParameter in irFunction.valueParameters) {
|
for (valueParameter in irFunction.valueParameters) {
|
||||||
val parameter = newIrFunction.valueParameters[valueParameter.index]
|
val parameter = newIrFunction.valueParameters[valueParameter.index]
|
||||||
|
val remapped = if (valueParameter.defaultValue != null) {
|
||||||
val argument = if (valueParameter.defaultValue != null) {
|
|
||||||
val kIntAnd = symbols.intAnd.owner
|
val kIntAnd = symbols.intAnd.owner
|
||||||
val condition = irNotEquals(irCall(kIntAnd).apply {
|
val condition = irNotEquals(irCall(kIntAnd).apply {
|
||||||
dispatchReceiver = irGet(maskParameter(newIrFunction, valueParameter.index / 32))
|
dispatchReceiver = irGet(maskParameter(newIrFunction, valueParameter.index / 32))
|
||||||
@@ -104,21 +104,18 @@ open class DefaultArgumentStubGenerator(
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
irIfThenElse(
|
val argument = irIfThenElse(
|
||||||
type = parameter.type,
|
type = parameter.type,
|
||||||
condition = condition,
|
condition = condition,
|
||||||
thenPart = expressionBody.expression,
|
thenPart = expressionBody.expression,
|
||||||
elsePart = irGet(parameter)
|
elsePart = irGet(parameter)
|
||||||
)
|
)
|
||||||
|
createTmpVariable(argument, nameHint = parameter.name.asString())
|
||||||
} else {
|
} else {
|
||||||
irGet(parameter)
|
parameter
|
||||||
}
|
}
|
||||||
|
params.add(remapped)
|
||||||
val temporaryVariable = createTmpVariable(argument, nameHint = parameter.name.asString())
|
variables[valueParameter] = remapped
|
||||||
temporaryVariable.parent = newIrFunction
|
|
||||||
|
|
||||||
params.add(temporaryVariable)
|
|
||||||
variables[valueParameter] = temporaryVariable
|
|
||||||
}
|
}
|
||||||
|
|
||||||
when (irFunction) {
|
when (irFunction) {
|
||||||
@@ -151,7 +148,7 @@ open class DefaultArgumentStubGenerator(
|
|||||||
private fun IrBlockBodyBuilder.dispatchToImplementation(
|
private fun IrBlockBodyBuilder.dispatchToImplementation(
|
||||||
irFunction: IrSimpleFunction,
|
irFunction: IrSimpleFunction,
|
||||||
newIrFunction: IrFunction,
|
newIrFunction: IrFunction,
|
||||||
params: MutableList<IrVariable>
|
params: MutableList<IrValueDeclaration>
|
||||||
): IrExpression {
|
): IrExpression {
|
||||||
val dispatchCall = irCall(irFunction.symbol).apply {
|
val dispatchCall = irCall(irFunction.symbol).apply {
|
||||||
passTypeArgumentsFrom(newIrFunction)
|
passTypeArgumentsFrom(newIrFunction)
|
||||||
@@ -177,7 +174,7 @@ open class DefaultArgumentStubGenerator(
|
|||||||
handlerDeclaration: IrValueParameter,
|
handlerDeclaration: IrValueParameter,
|
||||||
oldIrFunction: IrFunction,
|
oldIrFunction: IrFunction,
|
||||||
newIrFunction: IrFunction,
|
newIrFunction: IrFunction,
|
||||||
params: MutableList<IrVariable>
|
params: MutableList<IrValueDeclaration>
|
||||||
): IrExpression {
|
): IrExpression {
|
||||||
assert(needSpecialDispatch(oldIrFunction as IrSimpleFunction))
|
assert(needSpecialDispatch(oldIrFunction as IrSimpleFunction))
|
||||||
error("This method should be overridden")
|
error("This method should be overridden")
|
||||||
|
|||||||
+2
-6
@@ -14,17 +14,13 @@ import org.jetbrains.kotlin.ir.builders.IrBlockBodyBuilder
|
|||||||
import org.jetbrains.kotlin.ir.builders.irCall
|
import org.jetbrains.kotlin.ir.builders.irCall
|
||||||
import org.jetbrains.kotlin.ir.builders.irGet
|
import org.jetbrains.kotlin.ir.builders.irGet
|
||||||
import org.jetbrains.kotlin.ir.builders.irImplicitCast
|
import org.jetbrains.kotlin.ir.builders.irImplicitCast
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrFunctionReferenceImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrFunctionReferenceImpl
|
||||||
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
|
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||||
import org.jetbrains.kotlin.name.FqName
|
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
class JsDefaultArgumentStubGenerator(override val context: JsIrBackendContext) : DefaultArgumentStubGenerator(context, true, true) {
|
class JsDefaultArgumentStubGenerator(override val context: JsIrBackendContext) : DefaultArgumentStubGenerator(context, true, true) {
|
||||||
@@ -35,7 +31,7 @@ class JsDefaultArgumentStubGenerator(override val context: JsIrBackendContext) :
|
|||||||
handlerDeclaration: IrValueParameter,
|
handlerDeclaration: IrValueParameter,
|
||||||
oldIrFunction: IrFunction,
|
oldIrFunction: IrFunction,
|
||||||
newIrFunction: IrFunction,
|
newIrFunction: IrFunction,
|
||||||
params: MutableList<IrVariable>
|
params: MutableList<IrValueDeclaration>
|
||||||
): IrExpression {
|
): IrExpression {
|
||||||
val paramCount = oldIrFunction.valueParameters.size
|
val paramCount = oldIrFunction.valueParameters.size
|
||||||
val invokeFunctionN = resolveInvoke(paramCount)
|
val invokeFunctionN = resolveInvoke(paramCount)
|
||||||
|
|||||||
Reference in New Issue
Block a user