[JVM] Store VarInsnNode in StoreData instead of AbstractInsnNode

This way we can avoid some casts.
This commit is contained in:
Ivan Kylchik
2023-08-25 15:35:49 +02:00
committed by Space Team
parent 140ccccae3
commit 617e7d1a36
@@ -32,7 +32,7 @@ class TemporaryValsAnalyzer {
val insnList = methodNode.instructions val insnList = methodNode.instructions
val insnArray = insnList.toArray() val insnArray = insnList.toArray()
val potentiallyTemporaryStores = insnList.filterTo(LinkedHashSet()) { it.isStoreOperation() } val potentiallyTemporaryStores = insnList.filterIsInstance<VarInsnNode>().filterTo(LinkedHashSet()) { it.isStoreOperation() }
for (lv in methodNode.localVariables) { for (lv in methodNode.localVariables) {
// Exclude stores within LVT entry liveness ranges. // Exclude stores within LVT entry liveness ranges.
@@ -116,20 +116,16 @@ class TemporaryValsAnalyzer {
return storeInsnToStoreData.values return storeInsnToStoreData.values
.filterNot { it.isDirty } .filterNot { it.isDirty }
.map { .map { TemporaryVal(it.storeInsn.`var`, it.storeInsn, it.loads.toList()) }
val storeInsn = it.storeInsn as VarInsnNode
val loadInsns = it.loads.map { load -> load as VarInsnNode }
TemporaryVal(storeInsn.`var`, storeInsn, loadInsns)
}
.sortedBy { insnList.indexOf(it.storeInsn) } .sortedBy { insnList.indexOf(it.storeInsn) }
} }
private class StoreData(val storeInsn: AbstractInsnNode) { private class StoreData(val storeInsn: VarInsnNode) {
var isDirty = false var isDirty = false
val value = StoredValue.Store(this) val value = StoredValue.Store(this)
val loads = LinkedHashSet<AbstractInsnNode>() val loads = LinkedHashSet<VarInsnNode>()
} }
private sealed class StoredValue : StoreLoadValue { private sealed class StoredValue : StoreLoadValue {
@@ -157,7 +153,7 @@ class TemporaryValsAnalyzer {
} }
private class StoreTrackingInterpreter( private class StoreTrackingInterpreter(
private val storeInsnToStoreData: Map<AbstractInsnNode, StoreData> private val storeInsnToStoreData: Map<VarInsnNode, StoreData>
) : StoreLoadInterpreter<StoredValue>() { ) : StoreLoadInterpreter<StoredValue>() {
override fun newEmptyValue(local: Int): StoredValue = StoredValue.Unknown override fun newEmptyValue(local: Int): StoredValue = StoredValue.Unknown
@@ -175,7 +171,7 @@ class TemporaryValsAnalyzer {
value.temporaryVals.forEach { it.isDirty = true } value.temporaryVals.forEach { it.isDirty = true }
} else if (value is StoredValue.Store) { } else if (value is StoredValue.Store) {
// Keep track of a load instruction // Keep track of a load instruction
value.temporaryVal.loads.add(insn) value.temporaryVal.loads.add(insn as VarInsnNode)
} }
return StoredValue.Unknown return StoredValue.Unknown
} }