diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/fixStack/FixStackAnalyzer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/fixStack/FixStackAnalyzer.kt index eb0823ac091..85a45ce1261 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/fixStack/FixStackAnalyzer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/fixStack/FixStackAnalyzer.kt @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.codegen.optimization.fixStack import com.intellij.util.containers.Stack import org.jetbrains.kotlin.codegen.inline.isAfterInlineMarker import org.jetbrains.kotlin.codegen.inline.isBeforeInlineMarker -import org.jetbrains.kotlin.codegen.inline.isMarkedReturn import org.jetbrains.kotlin.codegen.pseudoInsns.PseudoInsn import org.jetbrains.kotlin.utils.SmartList import org.jetbrains.org.objectweb.asm.Opcodes @@ -132,10 +131,8 @@ internal class FixStackAnalyzer( executeBeforeInlineCallMarker(insn) isAfterInlineMarker(insn) -> executeAfterInlineCallMarker(insn) - isMarkedReturn(insn) -> { - // KT-9644: might throw "Incompatible return type" on non-local return, in fact we don't care. - if (insn.opcode == Opcodes.RETURN) return - } + insn.opcode == Opcodes.RETURN -> + return } super.execute(insn, interpreter) @@ -151,6 +148,9 @@ internal class FixStackAnalyzer( } override fun push(value: FixStackValue) { + if (value == FixStackValue.UNINITIALIZED) { + throw AnalyzerException(null, "Uninitialized value on stack") + } if (super.getStackSize() < maxStackSize) { super.push(value) } else { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/fixStack/FixStackInterpreter.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/fixStack/FixStackInterpreter.kt index 4ba5c455272..30e69f257c1 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/fixStack/FixStackInterpreter.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/fixStack/FixStackInterpreter.kt @@ -14,8 +14,9 @@ import org.jetbrains.org.objectweb.asm.tree.analysis.Interpreter open class FixStackInterpreter : Interpreter(API_VERSION) { - override fun newValue(type: Type?): FixStackValue? = + override fun newValue(type: Type?): FixStackValue = type?.toFixStackValue() + ?: FixStackValue.UNINITIALIZED override fun newOperation(insn: AbstractInsnNode): FixStackValue? = when (insn.opcode) { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/fixStack/FixStackValue.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/fixStack/FixStackValue.kt index 589cd661dee..e9e2f04a747 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/fixStack/FixStackValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/fixStack/FixStackValue.kt @@ -19,7 +19,8 @@ enum class FixStackValue( LONG(2, Opcodes.LLOAD, Opcodes.LSTORE, Opcodes.POP2), FLOAT(1, Opcodes.FLOAD, Opcodes.FSTORE, Opcodes.POP), DOUBLE(2, Opcodes.DLOAD, Opcodes.DSTORE, Opcodes.POP2), - OBJECT(1, Opcodes.ALOAD, Opcodes.ASTORE, Opcodes.POP) + OBJECT(1, Opcodes.ALOAD, Opcodes.ASTORE, Opcodes.POP), + UNINITIALIZED(1, -1, -1, -1) ; override fun getSize(): Int = _size