JVM Minor: move uninitialized value check to stack recovery

This commit is contained in:
Dmitry Petrov
2021-07-20 14:44:18 +03:00
committed by teamcityserver
parent e72d24960d
commit 46d2e52543
2 changed files with 7 additions and 5 deletions
@@ -26,7 +26,6 @@ import org.jetbrains.org.objectweb.asm.tree.AbstractInsnNode
import org.jetbrains.org.objectweb.asm.tree.JumpInsnNode
import org.jetbrains.org.objectweb.asm.tree.LabelNode
import org.jetbrains.org.objectweb.asm.tree.MethodNode
import org.jetbrains.org.objectweb.asm.tree.analysis.AnalyzerException
import org.jetbrains.org.objectweb.asm.tree.analysis.Frame
import org.jetbrains.org.objectweb.asm.tree.analysis.Interpreter
import kotlin.math.max
@@ -142,15 +141,14 @@ internal class FixStackAnalyzer(
fun getStackContent(): List<FixStackValue> {
val savedStack = ArrayList<FixStackValue>()
IntRange(0, super.getStackSize() - 1).mapTo(savedStack) { super.getStack(it) }
for (i in 0 until super.getStackSize()) {
savedStack.add(super.getStack(i))
}
savedStack.addAll(extraStack)
return savedStack
}
override fun push(value: FixStackValue) {
if (value == FixStackValue.UNINITIALIZED) {
throw AnalyzerException(null, "Uninitialized value on stack")
}
if (super.getStackSize() < maxStackSize) {
super.push(value)
} else {
@@ -51,6 +51,10 @@ internal class LocalVariablesManager(val context: FixStackContext, val methodNod
saveStackMarker: AbstractInsnNode,
savedStackValues: List<FixStackValue>
): SavedStackDescriptor {
if (savedStackValues.any { it == FixStackValue.UNINITIALIZED }) {
throw AssertionError("Uninitialized value on stack at ${methodNode.instructions.indexOf(saveStackMarker)}: $savedStackValues")
}
val firstUnusedLocalVarIndex = getFirstUnusedLocalVariableIndex()
val savedStackDescriptor = SavedStackDescriptor(savedStackValues, firstUnusedLocalVarIndex)
updateMaxLocals(savedStackDescriptor.firstUnusedLocalVarIndex)