1 21 package proguard.optimize.peephole; 22 23 import proguard.optimize.*; 24 import proguard.optimize.info.*; 25 import proguard.classfile.util.*; 26 import proguard.classfile.attribute.visitor.AttributeVisitor; 27 import proguard.classfile.attribute.*; 28 import proguard.classfile.visitor.MemberVisitor; 29 import proguard.classfile.editor.VariableEditor; 30 import proguard.classfile.*; 31 32 41 public class VariableShrinker 42 extends SimplifiedVisitor 43 implements AttributeVisitor 44 { 45 private static final boolean DEBUG = false; 46 47 48 private MemberVisitor extraVariableMemberVisitor; 49 50 private VariableUsageMarker variableUsageMarker = new VariableUsageMarker(); 51 private VariableEditor variableEditor = new VariableEditor(); 52 53 54 57 public VariableShrinker() 58 { 59 this(null); 60 } 61 62 63 68 public VariableShrinker(MemberVisitor extraVariableMemberVisitor) 69 { 70 this.extraVariableMemberVisitor = extraVariableMemberVisitor; 71 } 72 73 74 76 public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} 77 78 79 public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) 80 { 81 if ((method.getAccessFlags() & ClassConstants.INTERNAL_ACC_ABSTRACT) == 0) 82 { 83 variableUsageMarker.visitCodeAttribute(clazz, method, codeAttribute); 85 86 int variablesSize = variableUsageMarker.getVariablesSize(); 88 89 int parameterSize = ClassUtil.internalMethodParameterSize(method.getDescriptor(clazz)); 92 93 if (DEBUG) 94 { 95 System.out.println("VariableShrinker: "+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)); 96 System.out.println(" parameter size = " + parameterSize); 97 System.out.println(" variables size = " + variablesSize); 98 } 99 100 codeAttribute.u2maxLocals = variablesSize; 102 103 variableEditor.reset(variablesSize); 105 106 for (int variableIndex = parameterSize+1; variableIndex < variablesSize; variableIndex++) 107 { 108 if (!variableUsageMarker.isVariableUsed(variableIndex)) 110 { 111 if (DEBUG) 112 { 113 System.out.println(" Deleting local variable #"+variableIndex); 114 } 115 116 variableEditor.deleteVariable(variableIndex); 118 119 if (extraVariableMemberVisitor != null) 121 { 122 method.accept(clazz, extraVariableMemberVisitor); 123 } 124 } 125 } 126 127 variableEditor.visitCodeAttribute(clazz, method, codeAttribute); 129 } 130 } 131 } 132 | Popular Tags |