Don't use labels for caching

Avoid new objects creation
This commit is contained in:
Mikhail Bogdanov
2020-06-15 10:23:43 +02:00
parent db50afeafe
commit fe4bb24a3e
@@ -30,7 +30,7 @@ class LabelNormalizationMethodTransformer : MethodTransformer() {
private class TransformerForMethod(val methodNode: MethodNode) { private class TransformerForMethod(val methodNode: MethodNode) {
val instructions = methodNode.instructions val instructions = methodNode.instructions
val newLabelNodes = SmartIdentityTable<Label, LabelNode>() val newLabelNodes = SmartIdentityTable<LabelNode, LabelNode>()
fun transform() { fun transform() {
if (rewriteLabelInstructions()) { if (rewriteLabelInstructions()) {
@@ -48,11 +48,11 @@ class LabelNormalizationMethodTransformer : MethodTransformer() {
if (thisNode is LabelNode) { if (thisNode is LabelNode) {
val prevNode = thisNode.previous val prevNode = thisNode.previous
if (prevNode is LabelNode) { if (prevNode is LabelNode) {
newLabelNodes[thisNode.label] = prevNode newLabelNodes[thisNode] = prevNode
removedAnyLabels = true removedAnyLabels = true
thisNode = instructions.removeNodeGetNext(thisNode) thisNode = instructions.removeNodeGetNext(thisNode)
} else { } else {
newLabelNodes[thisNode.label] = thisNode newLabelNodes[thisNode] = thisNode
thisNode = thisNode.next thisNode = thisNode.next
} }
} else { } else {
@@ -145,12 +145,12 @@ class LabelNormalizationMethodTransformer : MethodTransformer() {
} }
private fun getNew(oldLabelNode: LabelNode): LabelNode { private fun getNew(oldLabelNode: LabelNode): LabelNode {
return newLabelNodes[oldLabelNode.label] return newLabelNodes[oldLabelNode]
?: throw IllegalStateException("Label wasn't found during iterating through instructions") ?: throw IllegalStateException("Label wasn't found during iterating through instructions")
} }
private fun getNewOrOld(oldLabelNode: LabelNode): LabelNode = private fun getNewOrOld(oldLabelNode: LabelNode): LabelNode =
newLabelNodes[oldLabelNode.label] ?: oldLabelNode newLabelNodes[oldLabelNode] ?: oldLabelNode
} }
} }