1 21 package proguard.optimize.info; 22 23 import proguard.classfile.*; 24 import proguard.classfile.attribute.*; 25 import proguard.classfile.attribute.visitor.AttributeVisitor; 26 import proguard.classfile.instruction.*; 27 import proguard.classfile.instruction.visitor.InstructionVisitor; 28 import proguard.classfile.util.SimplifiedVisitor; 29 30 36 public class VariableUsageMarker 37 extends SimplifiedVisitor 38 implements AttributeVisitor, 39 InstructionVisitor 40 { 41 private int variablesSize; 42 private boolean[] variableUsed = new boolean[ClassConstants.TYPICAL_VARIABLES_SIZE]; 43 44 45 49 public int getVariablesSize() 50 { 51 return variablesSize; 52 } 53 54 55 58 public boolean isVariableUsed(int variableIndex) 59 { 60 return variableUsed[variableIndex]; 61 } 62 63 64 66 public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} 67 68 69 public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) 70 { 71 int maxLocals = codeAttribute.u2maxLocals; 72 73 if (variableUsed.length < maxLocals) 75 { 76 variableUsed = new boolean[maxLocals]; 77 } 78 else 79 { 80 for (int index = 0; index < maxLocals; index++) 81 { 82 variableUsed[index] = false; 83 } 84 } 85 86 variablesSize = maxLocals; 87 88 codeAttribute.instructionsAccept(clazz, method, this); 89 } 90 91 92 94 public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} 95 96 97 public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) 98 { 99 variableUsed[variableInstruction.variableIndex] = true; 101 102 if (variableInstruction.isCategory2()) 104 { 105 variableUsed[variableInstruction.variableIndex + 1] = true; 106 } 107 } 108 } 109 | Popular Tags |