Prepare default arguments IR lowering for inline classes support

Allow `nullConst` to be customized by backend
This commit is contained in:
Svyatoslav Scherbina
2018-08-01 11:12:19 +03:00
parent d57099088e
commit 1aac1c2d69
@@ -174,19 +174,10 @@ private fun maskParameter(function: IrFunction, number: Int) =
private fun markerParameterDescriptor(descriptor: FunctionDescriptor) = private fun markerParameterDescriptor(descriptor: FunctionDescriptor) =
descriptor.valueParameters.single { it.name == kConstructorMarkerName } descriptor.valueParameters.single { it.name == kConstructorMarkerName }
private fun nullConst(expression: IrElement, type: IrType, context: CommonBackendContext) = when { open class DefaultParameterInjector constructor(
type.isFloat() -> IrConstImpl.float(expression.startOffset, expression.endOffset, type, 0.0F) val context: CommonBackendContext,
type.isDouble() -> IrConstImpl.double(expression.startOffset, expression.endOffset, type, 0.0) private val skipInline: Boolean = true
type.isBoolean() -> IrConstImpl.boolean(expression.startOffset, expression.endOffset, type, false) ) : BodyLoweringPass {
type.isByte() -> IrConstImpl.byte(expression.startOffset, expression.endOffset, type, 0)
type.isChar() -> IrConstImpl.char(expression.startOffset, expression.endOffset, type, 0.toChar())
type.isShort() -> IrConstImpl.short(expression.startOffset, expression.endOffset, type, 0)
type.isInt() -> IrConstImpl.int(expression.startOffset, expression.endOffset, type, 0)
type.isLong() -> IrConstImpl.long(expression.startOffset, expression.endOffset, type, 0)
else -> IrConstImpl.constNull(expression.startOffset, expression.endOffset, context.irBuiltIns.nothingNType)
}
class DefaultParameterInjector constructor(val context: CommonBackendContext, private val skipInline: Boolean = true) : BodyLoweringPass {
override fun lower(irBody: IrBody) { override fun lower(irBody: IrBody) {
irBody.transformChildrenVoid(object : IrElementTransformerVoid() { irBody.transformChildrenVoid(object : IrElementTransformerVoid() {
@@ -290,7 +281,7 @@ class DefaultParameterInjector constructor(val context: CommonBackendContext, pr
val defaultValueArgument = if (valueParameterDescriptor.isVararg) { val defaultValueArgument = if (valueParameterDescriptor.isVararg) {
null null
} else { } else {
nullConst(expression, realFunction.valueParameters[i].type, context) nullConst(expression, realFunction.valueParameters[i].type)
} }
valueParameterDescriptor to (valueArgument ?: defaultValueArgument) valueParameterDescriptor to (valueArgument ?: defaultValueArgument)
}) })
@@ -325,6 +316,18 @@ class DefaultParameterInjector constructor(val context: CommonBackendContext, pr
}) })
} }
protected open fun nullConst(expression: IrElement, type: IrType) = when {
type.isFloat() -> IrConstImpl.float(expression.startOffset, expression.endOffset, type, 0.0F)
type.isDouble() -> IrConstImpl.double(expression.startOffset, expression.endOffset, type, 0.0)
type.isBoolean() -> IrConstImpl.boolean(expression.startOffset, expression.endOffset, type, false)
type.isByte() -> IrConstImpl.byte(expression.startOffset, expression.endOffset, type, 0)
type.isChar() -> IrConstImpl.char(expression.startOffset, expression.endOffset, type, 0.toChar())
type.isShort() -> IrConstImpl.short(expression.startOffset, expression.endOffset, type, 0)
type.isInt() -> IrConstImpl.int(expression.startOffset, expression.endOffset, type, 0)
type.isLong() -> IrConstImpl.long(expression.startOffset, expression.endOffset, type, 0)
else -> IrConstImpl.constNull(expression.startOffset, expression.endOffset, context.irBuiltIns.nothingNType)
}
private fun log(msg: () -> String) = context.log { "DEFAULT-INJECTOR: ${msg()}" } private fun log(msg: () -> String) = context.log { "DEFAULT-INJECTOR: ${msg()}" }
} }