JVM_IR indy: fix non-null assertions on indy lambda parameters

KT-44278 KT-26060 KT-42621
This commit is contained in:
Dmitry Petrov
2021-02-10 10:10:49 +03:00
parent 43b1711010
commit afeb7e18cd
6 changed files with 57 additions and 1 deletions
@@ -275,7 +275,7 @@ class ExpressionCodegen(
return
if (inlinedInto != null ||
(DescriptorVisibilities.isPrivate(irFunction.visibility) && !(irFunction is IrSimpleFunction && irFunction.isOperator)) ||
(DescriptorVisibilities.isPrivate(irFunction.visibility) && !shouldGenerateNonNullAssertionsForPrivateFun(irFunction)) ||
irFunction.origin.isSynthetic ||
// TODO: refine this condition to not generate nullability assertions on parameters
// corresponding to captured variables and anonymous object super constructor arguments
@@ -310,6 +310,13 @@ class ExpressionCodegen(
}
}
// * Operator functions require non-null assertions on parameters even if they are private.
// * Local function for lambda survives at this stage if it was used in 'invokedynamic'-based code.
// Such functions require non-null assertions on parameters.
private fun shouldGenerateNonNullAssertionsForPrivateFun(irFunction: IrFunction) =
irFunction is IrSimpleFunction && irFunction.isOperator ||
irFunction.origin == IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA
private fun generateNonNullAssertion(param: IrValueParameter) {
val asmType = param.type.asmType
if (!param.type.unboxInlineClass().isNullable() && !isPrimitive(asmType)) {