Support inlining of implicitly casted lambda parameter

This commit is contained in:
Mikhael Bogdanov
2019-11-20 08:38:19 +01:00
parent d28ec1d449
commit 9066614cb9
@@ -167,11 +167,22 @@ class ExpressionCodegen(
return StackValue.onStack(type, irType.toKotlinType())
}
internal fun genOrGetLocal(expression: IrExpression, data: BlockInfo): StackValue =
if (expression is IrGetValue)
internal fun genOrGetLocal(expression: IrExpression, data: BlockInfo): StackValue {
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())
else
gen(expression, typeMapper.mapType(expression.type), expression.type, data)
}
fun generate() {
mv.visitCode()