From 2e9bf499214ffc09860598cdc4c615ab6cd31674 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Thu, 17 May 2018 18:11:00 +0200 Subject: [PATCH] Don't skip coercion to nullable Unit in codegen --- .../backend/jvm/codegen/ExpressionCodegen.kt | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt index 9410f419334..f098fec2a5b 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt @@ -160,7 +160,7 @@ class ExpressionCodegen( //coerceNotToUnit(r.type, Type.VOID_TYPE) exp.accept(this, data) } - return coerceNotToUnit(result.type, expression.asmType) + return coerceNotToUnit(result.type, expression.type) } override fun visitMemberAccess(expression: IrMemberAccessExpression, data: BlockInfo): StackValue { @@ -279,8 +279,7 @@ class ExpressionCodegen( mv.aconst(null) mv.athrow() } else if (expression.descriptor !is ConstructorDescriptor) { - val expectedTypeOnStack = returnType?.let { typeMapper.mapType(it) } ?: callable.returnType - return coerceNotToUnit(callable.returnType, expectedTypeOnStack) + return returnType?.run { coerceNotToUnit(callable.returnType, this) } ?: onStack(callable.returnType) } return expression.onStack @@ -534,10 +533,10 @@ class ExpressionCodegen( override fun visitWhen(expression: IrWhen, data: BlockInfo): StackValue = - genIfWithBranches(expression.branches[0], data, expression.asmType, expression.branches.drop(1)) + genIfWithBranches(expression.branches[0], data, expression.type, expression.branches.drop(1)) - private fun genIfWithBranches(branch: IrBranch, data: BlockInfo, type: Type, otherBranches: List): StackValue { + private fun genIfWithBranches(branch: IrBranch, data: BlockInfo, type: KotlinType, otherBranches: List): StackValue { val elseLabel = Label() val condition = branch.condition val thenBranch = branch.result @@ -933,10 +932,11 @@ class ExpressionCodegen( } - private fun coerceNotToUnit(fromType: Type, toType: Type): StackValue { - if (toType != AsmTypes.UNIT_TYPE) { - coerce(fromType, toType, mv) - return onStack(toType) + private fun coerceNotToUnit(fromType: Type, toType: KotlinType): StackValue { + val asmType = toType.asmType + if (asmType != AsmTypes.UNIT_TYPE || TypeUtils.isNullableType(toType)) { + coerce(fromType, asmType, mv) + return onStack(asmType) } return onStack(fromType) } @@ -1091,4 +1091,4 @@ fun DefaultCallArgs.generateOnStackIfNeeded(callGenerator: IrCallGenerator, isCo ) } return toInts.isNotEmpty() -} \ No newline at end of file +}