diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt index 1efd406221a..4071d66e136 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.backend.common.ir +import org.jetbrains.kotlin.backend.common.CommonBackendContext import org.jetbrains.kotlin.backend.common.DumpIrTreeWithDescriptorsVisitor import org.jetbrains.kotlin.backend.common.deepCopyWithVariables import org.jetbrains.kotlin.backend.common.descriptors.* @@ -112,6 +113,14 @@ val IrSimpleFunction.isOverridable: Boolean val IrSimpleFunction.isOverridableOrOverrides: Boolean get() = isOverridable || overriddenSymbols.isNotEmpty() +fun IrReturnTarget.returnType(context: CommonBackendContext) = + when (this) { + is IrConstructor -> context.irBuiltIns.unitType + is IrFunction -> returnType + is IrReturnableBlock -> type + else -> error("Unknown ReturnTarget: $this") + } + val IrClass.isFinalClass: Boolean get() = modality == Modality.FINAL && kind != ClassKind.ENUM_CLASS diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/FinallyBlocksLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/FinallyBlocksLowering.kt index de258614a99..e87789fed4b 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/FinallyBlocksLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/FinallyBlocksLowering.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.backend.common.lower import org.jetbrains.kotlin.backend.common.* import org.jetbrains.kotlin.backend.common.descriptors.WrappedSimpleFunctionDescriptor import org.jetbrains.kotlin.backend.common.descriptors.WrappedVariableDescriptor +import org.jetbrains.kotlin.backend.common.ir.returnType import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.builders.* @@ -160,14 +161,6 @@ class FinallyBlocksLowering(val context: CommonBackendContext, private val throw return performHighLevelJump(tryScopes, 0, jump, startOffset, endOffset, value) } - private val IrReturnTarget.returnType: IrType - get() = when (this) { - is IrConstructor -> context.irBuiltIns.unitType - is IrFunction -> returnType - is IrReturnableBlock -> type - else -> error("Unknown ReturnTarget: $this") - } - private fun performHighLevelJump(tryScopes: List, index: Int, jump: HighLevelJump, @@ -180,7 +173,7 @@ class FinallyBlocksLowering(val context: CommonBackendContext, private val throw val currentTryScope = tryScopes[index] currentTryScope.jumps.getOrPut(jump) { - val type = (jump as? Return)?.target?.owner?.returnType ?: value.type + val type = (jump as? Return)?.target?.owner?.returnType(context) ?: value.type jump.toString() val symbol = IrReturnableBlockSymbolImpl(WrappedSimpleFunctionDescriptor()) with(currentTryScope) { 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 f25855c1fdf..be0a0caa952 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 @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.backend.jvm.codegen +import org.jetbrains.kotlin.backend.common.ir.returnType import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.intrinsics.IrIntrinsicMethods import org.jetbrains.kotlin.backend.jvm.intrinsics.JavaClassProperty @@ -644,15 +645,6 @@ class ExpressionCodegen( } } - // Copied from FinallyBlocksLowering - private val IrReturnTarget.returnType: IrType - get() = when (this) { - is IrConstructor -> context.irBuiltIns.unitType - is IrFunction -> returnType - is IrReturnableBlock -> type - else -> error("Unknown ReturnTarget: $this") - } - override fun visitReturn(expression: IrReturn, data: BlockInfo): PromisedValue { val owner = expression.returnTargetSymbol.owner //TODO: should be owner != irFunction @@ -670,7 +662,7 @@ class ExpressionCodegen( val target = data.findBlock { it.returnSymbol == expression.returnTargetSymbol } val returnType = typeMapper.mapReturnType(owner) val afterReturnLabel = Label() - expression.value.accept(this, data).coerce(returnType, owner.returnType).materialize() + expression.value.accept(this, data).coerce(returnType, owner.returnType(context)).materialize() generateFinallyBlocksIfNeeded(returnType, afterReturnLabel, data, target) expression.markLineNumber(startOffset = true) if (target != null) {