Support inlining of implicitly casted lambda parameter
This commit is contained in:
+13
-2
@@ -167,11 +167,22 @@ class ExpressionCodegen(
|
|||||||
return StackValue.onStack(type, irType.toKotlinType())
|
return StackValue.onStack(type, irType.toKotlinType())
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun genOrGetLocal(expression: IrExpression, data: BlockInfo): StackValue =
|
internal fun genOrGetLocal(expression: IrExpression, data: BlockInfo): StackValue {
|
||||||
if (expression is IrGetValue)
|
if (irFunction.origin == IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER) {
|
||||||
|
if (expression is IrTypeOperatorCall && expression.operator == IrTypeOperator.IMPLICIT_CAST) {
|
||||||
|
// inline lambda parameters are passed from `foo$default` to `foo` call with implicit cast,
|
||||||
|
// we need return pure StackValue.local value to be able proper inline this parameter later
|
||||||
|
if (expression.type.makeNullable() == expression.argument.type) {
|
||||||
|
return genOrGetLocal(expression.argument, data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return if (expression is IrGetValue)
|
||||||
StackValue.local(findLocalIndex(expression.symbol), frameMap.typeOf(expression.symbol), expression.type.toKotlinType())
|
StackValue.local(findLocalIndex(expression.symbol), frameMap.typeOf(expression.symbol), expression.type.toKotlinType())
|
||||||
else
|
else
|
||||||
gen(expression, typeMapper.mapType(expression.type), expression.type, data)
|
gen(expression, typeMapper.mapType(expression.type), expression.type, data)
|
||||||
|
}
|
||||||
|
|
||||||
fun generate() {
|
fun generate() {
|
||||||
mv.visitCode()
|
mv.visitCode()
|
||||||
|
|||||||
Reference in New Issue
Block a user