From 35b4a9d4cc1b6e5376687ec921d472256608cde6 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Tue, 20 Jul 2021 07:16:16 +0300 Subject: [PATCH] JVM treat all variable loads as "initialized" in stack normalization --- .../optimization/fixStack/FixStackAnalyzer.kt | 4 +- .../fixStack/FixStackInterpreter.kt | 49 ++++++++++--------- 2 files changed, 29 insertions(+), 24 deletions(-) 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 d1c9d875a23..eb0823ac091 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 @@ -150,7 +150,7 @@ internal class FixStackAnalyzer( return savedStack } - override fun push(value: FixStackValue?) { + override fun push(value: FixStackValue) { if (super.getStackSize() < maxStackSize) { super.push(value) } else { @@ -163,7 +163,7 @@ internal class FixStackAnalyzer( values.forEach { push(it) } } - override fun pop(): FixStackValue? = + override fun pop(): FixStackValue = if (extraStack.isNotEmpty()) { extraStack.pop() } 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 80951f0b917..4ba5c455272 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 @@ -32,28 +32,26 @@ open class FixStackInterpreter : Interpreter(API_VERSION) { BIPUSH, SIPUSH -> FixStackValue.INT LDC -> { - val cst = (insn as LdcInsnNode).cst - if (cst is Int) { - FixStackValue.INT - } else if (cst is Float) { - FixStackValue.FLOAT - } else if (cst is Long) { - FixStackValue.LONG - } else if (cst is Double) { - FixStackValue.DOUBLE - } else if (cst is String) { - FixStackValue.OBJECT - } else if (cst is Type) { - val sort = cst.sort - if (sort == Type.OBJECT || sort == Type.ARRAY || sort == Type.METHOD) { + when (val cst = (insn as LdcInsnNode).cst) { + is Int -> + FixStackValue.INT + is Float -> + FixStackValue.FLOAT + is Long -> + FixStackValue.LONG + is Double -> + FixStackValue.DOUBLE + is String, is Handle -> FixStackValue.OBJECT - } else { - throw IllegalArgumentException("Illegal LDC constant $cst") + is Type -> { + val sort = cst.sort + if (sort == Type.OBJECT || sort == Type.ARRAY || sort == Type.METHOD) + FixStackValue.OBJECT + else + throw IllegalArgumentException("Illegal LDC constant $cst") } - } else if (cst is Handle) { - FixStackValue.OBJECT - } else { - throw IllegalArgumentException("Illegal LDC constant $cst") + else -> + throw IllegalArgumentException("Illegal LDC constant $cst") } } GETSTATIC -> @@ -64,8 +62,15 @@ open class FixStackInterpreter : Interpreter(API_VERSION) { throw IllegalArgumentException("Unexpected instruction: " + insn.insnOpcodeText) } - override fun copyOperation(insn: AbstractInsnNode, value: FixStackValue?): FixStackValue? = - value + override fun copyOperation(insn: AbstractInsnNode, value: FixStackValue?): FixStackValue = + when (insn.opcode) { + ILOAD -> FixStackValue.INT + LLOAD -> FixStackValue.LONG + FLOAD -> FixStackValue.FLOAT + DLOAD -> FixStackValue.DOUBLE + ALOAD -> FixStackValue.OBJECT + else -> value!! + } override fun binaryOperation(insn: AbstractInsnNode, value1: FixStackValue?, value2: FixStackValue?): FixStackValue? = when (insn.opcode) {