1 21 package proguard.obfuscate; 22 23 import proguard.classfile.*; 24 import proguard.classfile.attribute.*; 25 import proguard.classfile.attribute.visitor.AttributeVisitor; 26 import proguard.classfile.attribute.annotation.*; 27 import proguard.classfile.visitor.*; 28 import proguard.classfile.util.SimplifiedVisitor; 29 30 38 public class AttributeShrinker 39 extends SimplifiedVisitor 40 implements ClassVisitor, 41 MemberVisitor, 42 AttributeVisitor 43 { 44 46 public void visitProgramClass(ProgramClass programClass) 47 { 48 programClass.u2attributesCount = 50 shrinkArray(programClass.attributes, 51 programClass.u2attributesCount); 52 53 programClass.fieldsAccept(this); 55 programClass.methodsAccept(this); 56 programClass.attributesAccept(this); 57 } 58 59 60 public void visitLibraryClass(LibraryClass libraryClass) 61 { 62 } 64 65 66 68 public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) 69 { 70 programMember.u2attributesCount = 72 shrinkArray(programMember.attributes, 73 programMember.u2attributesCount); 74 75 programMember.attributesAccept(programClass, this); 77 } 78 79 80 82 public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} 83 84 85 public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) 86 { 87 codeAttribute.u2attributesCount = 89 shrinkArray(codeAttribute.attributes, 90 codeAttribute.u2attributesCount); 91 } 92 93 94 96 101 private static int shrinkArray(VisitorAccepter[] array, int length) 102 { 103 int counter = 0; 104 105 for (int index = 0; index < length; index++) 107 { 108 if (AttributeUsageMarker.isUsed(array[index])) 109 { 110 array[counter++] = array[index]; 111 } 112 } 113 114 for (int index = counter; index < length; index++) 116 { 117 array[index] = null; 118 } 119 120 return counter; 121 } 122 } 123 | Popular Tags |