1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/* 2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification 3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * of Java bytecode. 4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 5b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) 6b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 7b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is free software; you can redistribute it and/or modify it 8b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * under the terms of the GNU General Public License as published by the Free 9b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Software Foundation; either version 2 of the License, or (at your option) 10b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * any later version. 11b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 12b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is distributed in the hope that it will be useful, but WITHOUT 13b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * more details. 16b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 17b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * You should have received a copy of the GNU General Public License along 18b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * with this program; if not, write to the Free Software Foundation, Inc., 19b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 21b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangpackage proguard.classfile.editor; 22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.*; 24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.*; 25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.annotation.*; 26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.annotation.visitor.*; 27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.preverification.*; 28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.visitor.*; 29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.*; 30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.visitor.ConstantVisitor; 31b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport proguard.classfile.editor.ConstantPoolRemapper; 32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.util.SimplifiedVisitor; 33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.visitor.*; 34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 35b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport java.util.Arrays; 36b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 37b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/** 39b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * This ClassVisitor removes UTF-8 constant pool entries that are not used. 40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune 42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 43b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangpublic class Utf8Shrinker 44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoextends SimplifiedVisitor 45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimplements ClassVisitor, 46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato MemberVisitor, 47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConstantVisitor, 48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato AttributeVisitor, 49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato InnerClassesInfoVisitor, 50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato LocalVariableInfoVisitor, 51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato LocalVariableTypeInfoVisitor, 52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato AnnotationVisitor, 53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ElementValueVisitor 54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // A visitor info flag to indicate the UTF-8 constant pool entry is being used. 56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static final Object USED = new Object(); 57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 58b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang private int[] constantIndexMap = new int[ClassConstants.TYPICAL_CONSTANT_POOL_SIZE]; 59b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang private final ConstantPoolRemapper constantPoolRemapper = new ConstantPoolRemapper(); 60b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for ClassVisitor. 63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitProgramClass(ProgramClass programClass) 65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Mark the UTF-8 entries referenced by the other constant pool entries. 67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programClass.constantPoolEntriesAccept(this); 68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Mark the UTF-8 entries referenced by the fields and methods. 70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programClass.fieldsAccept(this); 71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programClass.methodsAccept(this); 72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Mark the UTF-8 entries referenced by the attributes. 74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programClass.attributesAccept(this); 75b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 76b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Shift the used constant pool entries together, filling out the 77b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // index map. 78b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int newConstantPoolCount = 79b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang shrinkConstantPool(programClass.constantPool, 80b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang programClass.u2constantPoolCount); 81b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 82b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Remap the references to the constant pool if it has shrunk. 83b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (newConstantPoolCount < programClass.u2constantPoolCount) 84b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 85b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang programClass.u2constantPoolCount = newConstantPoolCount; 86b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 87b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Remap all constant pool references. 88b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang constantPoolRemapper.setConstantIndexMap(constantIndexMap); 89b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang constantPoolRemapper.visitProgramClass(programClass); 90b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for MemberVisitor. 95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) 97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Mark the name and descriptor UTF-8 entries. 99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(programClass, programMember.u2nameIndex); 100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(programClass, programMember.u2descriptorIndex); 101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Mark the UTF-8 entries referenced by the attributes. 103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programMember.attributesAccept(programClass, this); 104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for ConstantVisitor. 108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitAnyConstant(Clazz clazz, Constant constant) {} 110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitStringConstant(Clazz clazz, StringConstant stringConstant) 113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, stringConstant.u2stringIndex); 115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitClassConstant(Clazz clazz, ClassConstant classConstant) 119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, classConstant.u2nameIndex); 121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant) 125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, nameAndTypeConstant.u2nameIndex); 127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, nameAndTypeConstant.u2descriptorIndex); 128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for AttributeVisitor. 132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute) 134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // This is the best we can do for unknown attributes. 136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, unknownAttribute.u2attributeNameIndex); 137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute) 141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, sourceFileAttribute.u2attributeNameIndex); 143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, sourceFileAttribute.u2sourceFileIndex); 145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) 149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, sourceDirAttribute.u2attributeNameIndex); 151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, sourceDirAttribute.u2sourceDirIndex); 153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) 157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, innerClassesAttribute.u2attributeNameIndex); 159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Mark the UTF-8 entries referenced by the inner classes. 161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato innerClassesAttribute.innerClassEntriesAccept(clazz, this); 162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) 166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, enclosingMethodAttribute.u2attributeNameIndex); 168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // These entries have already been marked in the constant pool. 170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato //clazz.constantPoolEntryAccept(this, enclosingMethodAttribute.u2classIndex); 171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato //clazz.constantPoolEntryAccept(this, enclosingMethodAttribute.u2nameAndTypeIndex); 172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute) 176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, deprecatedAttribute.u2attributeNameIndex); 178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute) 182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, syntheticAttribute.u2attributeNameIndex); 184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) 188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, signatureAttribute.u2attributeNameIndex); 190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, signatureAttribute.u2signatureIndex); 192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) 196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, constantValueAttribute.u2attributeNameIndex); 198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) 202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, exceptionsAttribute.u2attributeNameIndex); 204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) 208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, codeAttribute.u2attributeNameIndex); 210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Mark the UTF-8 entries referenced by the attributes. 212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato codeAttribute.attributesAccept(clazz, method, this); 213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) 217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, stackMapAttribute.u2attributeNameIndex); 219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) 223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, stackMapTableAttribute.u2attributeNameIndex); 225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) 229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, lineNumberTableAttribute.u2attributeNameIndex); 231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) 235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, localVariableTableAttribute.u2attributeNameIndex); 237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Mark the UTF-8 entries referenced by the local variables. 239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); 240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) 244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, localVariableTypeTableAttribute.u2attributeNameIndex); 246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Mark the UTF-8 entries referenced by the local variable types. 248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); 249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute) 253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, annotationsAttribute.u2attributeNameIndex); 255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Mark the UTF-8 entries referenced by the annotations. 257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato annotationsAttribute.annotationsAccept(clazz, this); 258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) 262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, parameterAnnotationsAttribute.u2attributeNameIndex); 264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Mark the UTF-8 entries referenced by the annotations. 266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato parameterAnnotationsAttribute.annotationsAccept(clazz, method, this); 267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) 271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, annotationDefaultAttribute.u2attributeNameIndex); 273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Mark the UTF-8 entries referenced by the element value. 275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato annotationDefaultAttribute.defaultValueAccept(clazz, this); 276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for InnerClassesInfoVisitor. 280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo) 282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (innerClassesInfo.u2innerNameIndex != 0) 284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, innerClassesInfo.u2innerNameIndex); 286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for LocalVariableInfoVisitor. 291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) 293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, localVariableInfo.u2nameIndex); 295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, localVariableInfo.u2descriptorIndex); 296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for LocalVariableTypeInfoVisitor. 300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) 302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, localVariableTypeInfo.u2nameIndex); 304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, localVariableTypeInfo.u2signatureIndex); 305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 308b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for AnnotationVisitor. 309b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 310b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitAnnotation(Clazz clazz, Annotation annotation) 311b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 312b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, annotation.u2typeIndex); 313b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 314b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Mark the UTF-8 entries referenced by the element values. 315b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato annotation.elementValuesAccept(clazz, this); 316b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for ElementValueVisitor. 320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue) 322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (constantElementValue.u2elementNameIndex != 0) 324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, constantElementValue.u2elementNameIndex); 326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 328b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Only the string constant element value refers to a UTF-8 entry. 329b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (constantElementValue.u1tag == ClassConstants.ELEMENT_VALUE_STRING_CONSTANT) 330b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 331b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, constantElementValue.u2constantValueIndex); 332b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 333b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 334b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 335b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 336b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue) 337b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 338b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (enumConstantElementValue.u2elementNameIndex != 0) 339b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 340b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, enumConstantElementValue.u2elementNameIndex); 341b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 342b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 343b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, enumConstantElementValue.u2typeNameIndex); 344b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, enumConstantElementValue.u2constantNameIndex); 345b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 346b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 347b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 348b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue) 349b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 350b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (classElementValue.u2elementNameIndex != 0) 351b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 352b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, classElementValue.u2elementNameIndex); 353b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 354b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 355b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, classElementValue.u2classInfoIndex); 356b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 357b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 358b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 359b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) 360b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 361b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (annotationElementValue.u2elementNameIndex != 0) 362b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 363b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, annotationElementValue.u2elementNameIndex); 364b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 365b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 366b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Mark the UTF-8 entries referenced by the annotation. 367b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato annotationElementValue.annotationAccept(clazz, this); 368b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 369b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 370b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 371b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) 372b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 373b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (arrayElementValue.u2elementNameIndex != 0) 374b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 375b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markCpUtf8Entry(clazz, arrayElementValue.u2elementNameIndex); 376b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 377b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 378b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Mark the UTF-8 entries referenced by the element values. 379b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato arrayElementValue.elementValuesAccept(clazz, annotation, this); 380b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 381b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 382b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 383b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Small utility methods. 384b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 385b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 386b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Marks the given UTF-8 constant pool entry of the given class. 387b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 388b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void markCpUtf8Entry(Clazz clazz, int index) 389b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 390b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markAsUsed((Utf8Constant)((ProgramClass)clazz).getConstant(index)); 391b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 392b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 393b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 394b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 395b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Marks the given VisitorAccepter as being used. 396b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * In this context, the VisitorAccepter will be a Utf8Constant object. 397b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 398b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang private void markAsUsed(VisitorAccepter visitorAccepter) 399b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 400b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato visitorAccepter.setVisitorInfo(USED); 401b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 402b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 403b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 404b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 405b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns whether the given VisitorAccepter has been marked as being used. 406b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * In this context, the VisitorAccepter will be a Utf8Constant object. 407b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 408b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang private boolean isUsed(VisitorAccepter visitorAccepter) 409b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 410b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return visitorAccepter.getVisitorInfo() == USED; 411b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 412b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 413b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 414b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 415b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Removes all UTF-8 entries that are not marked as being used 416b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * from the given constant pool. 417b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the new number of entries. 418b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 419b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang private int shrinkConstantPool(Constant[] constantPool, int length) 420b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 421b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Create a new index map, if necessary. 422b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (constantIndexMap.length < length) 423b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 424b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang constantIndexMap = new int[length]; 425b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 426b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 427b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int counter = 1; 428b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang boolean isUsed = false; 429b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 430b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Shift the used constant pool entries together. 431b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang for (int index = 1; index < length; index++) 432b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 433b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang constantIndexMap[index] = counter; 434b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 435b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Constant constant = constantPool[index]; 436b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 437b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Don't update the flag if this is the second half of a long entry. 438b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (constant != null) 439b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 440b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang isUsed = constant.getTag() != ClassConstants.CONSTANT_Utf8 || 441b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang isUsed(constant); 442b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 443b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 444b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (isUsed) 445b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 446b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang constantPool[counter++] = constant; 447b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 448b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 449b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 450b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Clear the remaining constant pool elements. 451b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Arrays.fill(constantPool, counter, length, null); 452b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 453b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return counter; 454b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 455b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 456