JVM_IR: Do not unbox Result argument inside SAM adapters

#KT-45259 Fixed
This commit is contained in:
Ilmir Usmanov
2021-03-12 19:25:12 +01:00
parent 6fab1305e9
commit 4099dfc7e0
11 changed files with 223 additions and 1 deletions
@@ -658,12 +658,14 @@ class ExpressionCodegen(
val genericOrAnyOverride = irFunction.overriddenSymbols.any {
val overriddenParam = if (index < 0) it.owner.dispatchReceiverParameter!! else it.owner.valueParameters[index]
overriddenParam.type.erasedUpperBound.fqNameWhenAvailable != StandardNames.RESULT_FQ_NAME
} || irFunction.parentAsClass.origin == JvmLoweredDeclarationOrigin.LAMBDA_IMPL
} || irFunction.parentAsClass.let { it.origin == JvmLoweredDeclarationOrigin.LAMBDA_IMPL && !it.isSamAdapter() }
if (!genericOrAnyOverride) return
StackValue.unboxInlineClass(OBJECT_TYPE, arg.type.erasedUpperBound.defaultType.toIrBasedKotlinType(), mv)
}
private fun IrClass.isSamAdapter(): Boolean = this.superTypes.any { it.getClass()?.isFun == true }
private fun onlyResultInlineClassParameters(): Boolean = irFunction.valueParameters.all {
!it.type.erasedUpperBound.isInline || it.type.erasedUpperBound.fqNameWhenAvailable == StandardNames.RESULT_FQ_NAME
}