Prepare default arguments IR lowering for inline classes support
Allow `nullConst` to be customized by backend
This commit is contained in:
+17
-14
@@ -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()}" }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user