JVM Minor: move uninitialized value check to stack recovery
This commit is contained in:
committed by
teamcityserver
parent
e72d24960d
commit
46d2e52543
+3
-5
@@ -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 {
|
||||
|
||||
+4
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user