1 21 package proguard.optimize; 22 23 import proguard.classfile.*; 24 import proguard.classfile.visitor.MemberVisitor; 25 import proguard.classfile.util.SimplifiedVisitor; 26 import proguard.classfile.constant.*; 27 import proguard.classfile.constant.visitor.ConstantVisitor; 28 import proguard.classfile.instruction.*; 29 import proguard.classfile.attribute.CodeAttribute; 30 import proguard.evaluation.*; 31 import proguard.evaluation.value.*; 32 import proguard.optimize.info.ParameterUsageMarker; 33 34 41 public class UnusedParameterInvocationUnit 42 extends SimplifiedVisitor 43 implements InvocationUnit, 44 ConstantVisitor, 45 MemberVisitor 46 { 47 private static final boolean DEBUG = false; 48 49 50 private InvocationUnit invocationUnit; 51 52 private Stack stack; 53 54 55 public UnusedParameterInvocationUnit(InvocationUnit invocationUnit) 56 { 57 this.invocationUnit = invocationUnit; 58 } 59 60 61 63 64 public void enterMethod(Clazz clazz, Method method, Variables variables) 65 { 66 invocationUnit.enterMethod(clazz, method, variables); 67 } 68 69 70 public void exitMethod(Clazz clazz, Method method, Value returnValue) 71 { 72 invocationUnit.exitMethod(clazz, method, returnValue); 73 } 74 75 76 public void invokeMember(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction, Stack stack) 77 { 78 this.stack = stack; 81 clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); 82 83 invocationUnit.invokeMember(clazz, 84 method, 85 codeAttribute, 86 offset, 87 constantInstruction, 88 stack); 89 } 90 91 92 94 public void visitAnyConstant(Clazz clazz, Constant constant) {} 95 96 97 public void visitAnyMethodrefConstant(Clazz clazz, RefConstant refConstant) 98 { 99 refConstant.referencedMemberAccept(this); 100 } 101 102 103 105 public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) 106 { 107 if (DEBUG) 108 { 109 System.out.println("UnusedParameterInvocationUnit: "+programMethod.getName(programClass)+programMethod.getDescriptor(programClass)); 110 } 111 112 int parameterSize = ParameterUsageMarker.getParameterSize(programMethod); 114 115 for (int index = 0; index < parameterSize; index++) 117 { 118 if (!ParameterUsageMarker.isParameterUsed(programMethod, index)) 119 { 120 if (DEBUG) 121 { 122 System.out.println(" removing stack entry #"+(parameterSize - index - 1)+" ("+stack.getTop(parameterSize - index - 1)+")"); 123 } 124 125 stack.removeTop(parameterSize - index - 1); 126 } 127 } 128 } 129 130 131 public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) {} 132 } 133 | Popular Tags |