IR: make DefaultArgumentStubGenerator a few lines shorter

This commit is contained in:
pyos
2019-11-13 11:19:40 +01:00
committed by Georgy Bronnikov
parent 2b2dd097a3
commit 70f09a7531
@@ -43,8 +43,6 @@ open class DefaultArgumentStubGenerator(
} }
} }
private val symbols get() = context.ir.symbols
private fun lower(irFunction: IrFunction): List<IrFunction> { private fun lower(irFunction: IrFunction): List<IrFunction> {
val newIrFunction = irFunction.generateDefaultsFunction(context, skipInlineMethods, skipExternalMethods) val newIrFunction = irFunction.generateDefaultsFunction(context, skipInlineMethods, skipExternalMethods)
?: return listOf(irFunction) ?: return listOf(irFunction)
@@ -84,11 +82,9 @@ 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 remapped = if (valueParameter.defaultValue != null) {
val kIntAnd = symbols.intAnd.owner val mask = irGet(newIrFunction.valueParameters[irFunction.valueParameters.size + valueParameter.index / 32])
val condition = irNotEquals(irCall(kIntAnd).apply { val bit = irInt(1 shl (valueParameter.index % 32))
dispatchReceiver = irGet(maskParameter(newIrFunction, valueParameter.index / 32)) val test = irCallOp(this@DefaultArgumentStubGenerator.context.ir.symbols.intAnd, context.irBuiltIns.intType, mask, bit)
putValueArgument(0, irInt(1 shl (valueParameter.index % 32)))
}, irInt(0))
val expressionBody = valueParameter.defaultValue!! val expressionBody = valueParameter.defaultValue!!
expressionBody.patchDeclarationParents(newIrFunction) expressionBody.patchDeclarationParents(newIrFunction)
@@ -100,7 +96,7 @@ open class DefaultArgumentStubGenerator(
} }
}) })
selectArgumentOrDefault(condition, parameter, expressionBody.expression) selectArgumentOrDefault(irNotEquals(test, irInt(0)), parameter, expressionBody.expression)
} else { } else {
parameter parameter
} }
@@ -109,15 +105,12 @@ open class DefaultArgumentStubGenerator(
} }
when (irFunction) { when (irFunction) {
is IrConstructor -> +IrDelegatingConstructorCallImpl( is IrConstructor -> +irDelegatingConstructorCall(irFunction).apply {
startOffset = irFunction.startOffset,
endOffset = irFunction.endOffset,
type = context.irBuiltIns.unitType,
symbol = irFunction.symbol,
typeArgumentsCount = newIrFunction.parentAsClass.typeParameters.size + newIrFunction.typeParameters.size
).apply {
passTypeArgumentsFrom(newIrFunction.parentAsClass) passTypeArgumentsFrom(newIrFunction.parentAsClass)
passTypeArgumentsFrom(newIrFunction) // This is for Kotlin/Native, which differs from the other backends in that constructors
// apparently do have dispatch receivers (though *probably* not type arguments, but copy
// those as well just in case):
passTypeArgumentsFrom(newIrFunction, offset = newIrFunction.parentAsClass.typeParameters.size)
dispatchReceiver = newIrFunction.dispatchReceiverParameter?.let { irGet(it) } dispatchReceiver = newIrFunction.dispatchReceiverParameter?.let { irGet(it) }
params.forEachIndexed { i, variable -> putValueArgument(i, irGet(variable)) } params.forEachIndexed { i, variable -> putValueArgument(i, irGet(variable)) }
} }
@@ -181,9 +174,6 @@ open class DefaultArgumentStubGenerator(
private fun log(msg: () -> String) = context.log { "DEFAULT-REPLACER: ${msg()}" } private fun log(msg: () -> String) = context.log { "DEFAULT-REPLACER: ${msg()}" }
} }
private fun maskParameter(function: IrFunction, number: Int) =
function.valueParameters.single { it.name == parameterMaskName(number) }
val DEFAULT_DISPATCH_CALL = object : IrStatementOriginImpl("DEFAULT_DISPATCH_CALL") {} val DEFAULT_DISPATCH_CALL = object : IrStatementOriginImpl("DEFAULT_DISPATCH_CALL") {}
open class DefaultParameterInjector( open class DefaultParameterInjector(
@@ -378,7 +368,7 @@ private fun IrFunction.generateDefaultsFunctionImpl(context: CommonBackendContex
} }
for (i in 0 until (valueParameters.size + 31) / 32) { for (i in 0 until (valueParameters.size + 31) / 32) {
newFunction.addValueParameter(parameterMaskName(i).asString(), context.irBuiltIns.intType) newFunction.addValueParameter("mask$i".synthesizedString, context.irBuiltIns.intType)
} }
if (this is IrConstructor) { if (this is IrConstructor) {
val markerType = context.ir.symbols.defaultConstructorMarker.owner.defaultType.makeNullable() val markerType = context.ir.symbols.defaultConstructorMarker.owner.defaultType.makeNullable()
@@ -391,5 +381,3 @@ private fun IrFunction.generateDefaultsFunctionImpl(context: CommonBackendContex
annotations.mapTo(newFunction.annotations) { it.deepCopyWithSymbols() } annotations.mapTo(newFunction.annotations) { it.deepCopyWithSymbols() }
newFunction newFunction
} }
private fun parameterMaskName(number: Int) = "mask$number".synthesizedName