1 21 package proguard.optimize.peephole; 22 23 import proguard.classfile.*; 24 import proguard.classfile.attribute.CodeAttribute; 25 import proguard.classfile.editor.CodeAttributeEditor; 26 import proguard.classfile.instruction.*; 27 import proguard.classfile.instruction.visitor.InstructionVisitor; 28 import proguard.classfile.util.SimplifiedVisitor; 29 30 35 public class NopRemover 36 extends SimplifiedVisitor 37 implements InstructionVisitor 38 { 39 private CodeAttributeEditor codeAttributeEditor; 40 private InstructionVisitor extraInstructionVisitor; 41 42 43 48 public NopRemover(CodeAttributeEditor codeAttributeEditor) 49 { 50 this(codeAttributeEditor, null); 51 } 52 53 54 61 public NopRemover(CodeAttributeEditor codeAttributeEditor, 62 InstructionVisitor extraInstructionVisitor) 63 { 64 this.codeAttributeEditor = codeAttributeEditor; 65 this.extraInstructionVisitor = extraInstructionVisitor; 66 } 67 68 69 71 public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} 72 73 74 public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) 75 { 76 if (simpleInstruction.opcode == InstructionConstants.OP_NOP && 78 !codeAttributeEditor.isModified(offset)) 79 { 80 codeAttributeEditor.deleteInstruction(offset); 81 82 if (extraInstructionVisitor != null) 84 { 85 extraInstructionVisitor.visitSimpleInstruction(clazz, method, codeAttribute, offset, simpleInstruction); 86 } 87 } 88 } 89 } 90 | Popular Tags |