JVM treat all variable loads as "initialized" in stack normalization

This commit is contained in:
Dmitry Petrov
2021-07-20 07:16:16 +03:00
committed by teamcityserver
parent c8b705fd2d
commit 35b4a9d4cc
2 changed files with 29 additions and 24 deletions
@@ -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 {
@@ -32,28 +32,26 @@ open class FixStackInterpreter : Interpreter<FixStackValue>(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<FixStackValue>(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) {