[JVM] Store VarInsnNode in StoreData instead of AbstractInsnNode
This way we can avoid some casts.
This commit is contained in:
+6
-10
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user