1 21 package proguard.optimize.peephole; 22 23 import proguard.classfile.*; 24 import proguard.classfile.attribute.*; 25 import proguard.classfile.attribute.visitor.AttributeVisitor; 26 import proguard.classfile.editor.CodeAttributeEditor; 27 import proguard.classfile.instruction.visitor.InstructionVisitor; 28 import proguard.classfile.util.SimplifiedVisitor; 29 30 37 public class PeepholeOptimizer 38 extends SimplifiedVisitor 39 implements AttributeVisitor 40 { 41 private BranchTargetFinder branchTargetFinder; 42 private CodeAttributeEditor codeAttributeEditor; 43 private InstructionVisitor instructionVisitor; 44 45 46 54 public PeepholeOptimizer(CodeAttributeEditor codeAttributeEditor, 55 InstructionVisitor instructionVisitor) 56 { 57 this(null, codeAttributeEditor, instructionVisitor); 58 } 59 60 61 71 public PeepholeOptimizer(BranchTargetFinder branchTargetFinder, 72 CodeAttributeEditor codeAttributeEditor, 73 InstructionVisitor instructionVisitor) 74 { 75 this.branchTargetFinder = branchTargetFinder; 76 this.codeAttributeEditor = codeAttributeEditor; 77 this.instructionVisitor = instructionVisitor; 78 } 79 80 81 83 public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} 84 85 86 public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) 87 { 88 if (branchTargetFinder != null) 89 { 90 branchTargetFinder.visitCodeAttribute(clazz, method, codeAttribute); 92 } 93 94 codeAttributeEditor.reset(codeAttribute.u4codeLength); 96 97 codeAttribute.instructionsAccept(clazz, method, instructionVisitor); 99 100 codeAttributeEditor.visitCodeAttribute(clazz, method, codeAttribute); 102 } 103 } 104 | Popular Tags |