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())
|
||||
}
|
||||
|
||||
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()
|
||||
|
||||
Reference in New Issue
Block a user