diff options
author | Ying Wang <wangying@google.com> | 2012-02-27 10:21:35 -0800 |
---|---|---|
committer | Ying Wang <wangying@google.com> | 2012-02-27 11:54:51 -0800 |
commit | cfead78069f3dc32998dc118ee08cab3867acea2 (patch) | |
tree | 9600f15eed62fa9ba63ce5894d1f09fe686d5997 /src/proguard/obfuscate | |
parent | 10aa7224f49abe49d123bde5d34346202d49aaca (diff) | |
download | android_external_proguard-cfead78069f3dc32998dc118ee08cab3867acea2.tar.gz android_external_proguard-cfead78069f3dc32998dc118ee08cab3867acea2.tar.bz2 android_external_proguard-cfead78069f3dc32998dc118ee08cab3867acea2.zip |
Upgrade from Progaurd 4.4 to 4.7.
Change-Id: Ie185d0be411a80cc6a330cafa8547252a7dc1d9c
You can find the changelog here
http://proguard.sourceforge.net/#downloads.html
Diffstat (limited to 'src/proguard/obfuscate')
30 files changed, 323 insertions, 797 deletions
diff --git a/src/proguard/obfuscate/AttributeShrinker.java b/src/proguard/obfuscate/AttributeShrinker.java index a8bc36b..ee9bc4b 100644 --- a/src/proguard/obfuscate/AttributeShrinker.java +++ b/src/proguard/obfuscate/AttributeShrinker.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free @@ -26,6 +26,8 @@ import proguard.classfile.attribute.visitor.AttributeVisitor; import proguard.classfile.util.SimplifiedVisitor; import proguard.classfile.visitor.*; +import java.util.Arrays; + /** * This ClassVisitor removes attributes that are not marked as being used or * required. @@ -111,10 +113,7 @@ implements ClassVisitor, } // Clear the remaining array elements. - for (int index = counter; index < length; index++) - { - array[index] = null; - } + Arrays.fill(array, counter, length, null); return counter; } diff --git a/src/proguard/obfuscate/AttributeUsageMarker.java b/src/proguard/obfuscate/AttributeUsageMarker.java index e772324..297b540 100644 --- a/src/proguard/obfuscate/AttributeUsageMarker.java +++ b/src/proguard/obfuscate/AttributeUsageMarker.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free @@ -26,7 +26,7 @@ import proguard.classfile.attribute.visitor.AttributeVisitor; import proguard.classfile.util.SimplifiedVisitor; /** - * This ClassVisitor marks all attributes that it visits. + * This AttributeVisitor marks all attributes that it visits. * * @see AttributeShrinker * diff --git a/src/proguard/obfuscate/ClassObfuscator.java b/src/proguard/obfuscate/ClassObfuscator.java index 9af0c82..446b158 100644 --- a/src/proguard/obfuscate/ClassObfuscator.java +++ b/src/proguard/obfuscate/ClassObfuscator.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free @@ -469,13 +469,25 @@ implements ClassVisitor, { // Come up with class names until we get an original one. String newClassName; + String newMixedCaseClassName; do { // Let the factory produce a class name. newClassName = newPackagePrefix + classNameFactory.nextName(); + + newMixedCaseClassName = mixedCaseClassName(newClassName); + } + while (classNamesToAvoid.contains(newMixedCaseClassName)); + + // Explicitly make sure the name isn't used again if we have a + // user-specified dictionary and we're not allowed to have mixed case + // class names -- just to protect against problematic dictionaries. + if (this.classNameFactory != null && + !useMixedCaseClassNames) + { + classNamesToAvoid.add(newMixedCaseClassName); } - while (classNamesToAvoid.contains(mixedCaseClassName(newClassName))); return newClassName; } diff --git a/src/proguard/obfuscate/ClassRenamer.java b/src/proguard/obfuscate/ClassRenamer.java index 143e3fb..a967d36 100644 --- a/src/proguard/obfuscate/ClassRenamer.java +++ b/src/proguard/obfuscate/ClassRenamer.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free diff --git a/src/proguard/obfuscate/DictionaryNameFactory.java b/src/proguard/obfuscate/DictionaryNameFactory.java index f262664..393c648 100644 --- a/src/proguard/obfuscate/DictionaryNameFactory.java +++ b/src/proguard/obfuscate/DictionaryNameFactory.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free diff --git a/src/proguard/obfuscate/MapCleaner.java b/src/proguard/obfuscate/MapCleaner.java index fdefec5..d6ca5f6 100644 --- a/src/proguard/obfuscate/MapCleaner.java +++ b/src/proguard/obfuscate/MapCleaner.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free diff --git a/src/proguard/obfuscate/MappingKeeper.java b/src/proguard/obfuscate/MappingKeeper.java index c9d6aa6..d02d7bc 100644 --- a/src/proguard/obfuscate/MappingKeeper.java +++ b/src/proguard/obfuscate/MappingKeeper.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free diff --git a/src/proguard/obfuscate/MappingPrinter.java b/src/proguard/obfuscate/MappingPrinter.java index aa8b13e..c004b73 100644 --- a/src/proguard/obfuscate/MappingPrinter.java +++ b/src/proguard/obfuscate/MappingPrinter.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free diff --git a/src/proguard/obfuscate/MappingProcessor.java b/src/proguard/obfuscate/MappingProcessor.java index 01c1809..7c9103a 100644 --- a/src/proguard/obfuscate/MappingProcessor.java +++ b/src/proguard/obfuscate/MappingProcessor.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free diff --git a/src/proguard/obfuscate/MappingReader.java b/src/proguard/obfuscate/MappingReader.java index 24fd26c..0798a4d 100644 --- a/src/proguard/obfuscate/MappingReader.java +++ b/src/proguard/obfuscate/MappingReader.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free diff --git a/src/proguard/obfuscate/MemberNameCleaner.java b/src/proguard/obfuscate/MemberNameCleaner.java index c41c59d..0d5a519 100644 --- a/src/proguard/obfuscate/MemberNameCleaner.java +++ b/src/proguard/obfuscate/MemberNameCleaner.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free diff --git a/src/proguard/obfuscate/MemberNameCollector.java b/src/proguard/obfuscate/MemberNameCollector.java index c248820..92ec589 100644 --- a/src/proguard/obfuscate/MemberNameCollector.java +++ b/src/proguard/obfuscate/MemberNameCollector.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free diff --git a/src/proguard/obfuscate/MemberNameConflictFixer.java b/src/proguard/obfuscate/MemberNameConflictFixer.java index b9093a6..22de855 100644 --- a/src/proguard/obfuscate/MemberNameConflictFixer.java +++ b/src/proguard/obfuscate/MemberNameConflictFixer.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free diff --git a/src/proguard/obfuscate/MemberNameFilter.java b/src/proguard/obfuscate/MemberNameFilter.java new file mode 100644 index 0000000..1447a25 --- /dev/null +++ b/src/proguard/obfuscate/MemberNameFilter.java @@ -0,0 +1,120 @@ +/* + * ProGuard -- shrinking, optimization, obfuscation, and preverification + * of Java bytecode. + * + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package proguard.obfuscate; + +import proguard.classfile.*; +import proguard.classfile.visitor.MemberVisitor; + +/** + * This <code>MemberVisitor</code> delegates its visits to another given + * <code>MemberVisitor</code>, but only when the visited member has a new name. + * Constructors are judged based on the class name. + * + * @see ClassObfuscator + * @see MemberObfuscator + * + * @author Eric Lafortune + */ +public class MemberNameFilter implements MemberVisitor +{ + private final MemberVisitor memberVisitor; + + + /** + * Creates a new MemberSpecialNameFilter. + * @param memberVisitor the <code>MemberVisitor</code> to which + * visits will be delegated. + */ + public MemberNameFilter(MemberVisitor memberVisitor) + { + this.memberVisitor = memberVisitor; + } + + + // Implementations for MemberVisitor. + + public void visitProgramField(ProgramClass programClass, ProgramField programField) + { + if (hasName(programField)) + { + memberVisitor.visitProgramField(programClass, programField); + } + } + + + public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) + { + if (hasName(programClass, programMethod)) + { + memberVisitor.visitProgramMethod(programClass, programMethod); + } + } + + + public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) + { + if (hasName(libraryField)) + { + memberVisitor.visitLibraryField(libraryClass, libraryField); + } + } + + + public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) + { + if (hasName(libraryClass, libraryMethod)) + { + memberVisitor.visitLibraryMethod(libraryClass, libraryMethod); + } + } + + + // Small utility methods. + + /** + * Returns whether the given class has a new name. + */ + private boolean hasName(Clazz clazz) + { + return ClassObfuscator.newClassName(clazz) != null; + } + + + /** + * Returns whether the given method has a new name. + */ + private boolean hasName(Clazz clazz, Method method) + { + return + hasName(method) || + (hasName(clazz) && + method.getName(clazz).equals(ClassConstants.INTERNAL_METHOD_NAME_INIT)); + } + + + /** + * Returns whether the given class member has a new name. + */ + private boolean hasName(Member member) + { + return MemberObfuscator.newMemberName(member) != null; + } +}
\ No newline at end of file diff --git a/src/proguard/obfuscate/MemberObfuscator.java b/src/proguard/obfuscate/MemberObfuscator.java index 332b849..7b30596 100644 --- a/src/proguard/obfuscate/MemberObfuscator.java +++ b/src/proguard/obfuscate/MemberObfuscator.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free diff --git a/src/proguard/obfuscate/MemberSpecialNameFilter.java b/src/proguard/obfuscate/MemberSpecialNameFilter.java index f83374b..6da56da 100644 --- a/src/proguard/obfuscate/MemberSpecialNameFilter.java +++ b/src/proguard/obfuscate/MemberSpecialNameFilter.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free @@ -54,7 +54,7 @@ public class MemberSpecialNameFilter implements MemberVisitor public void visitProgramField(ProgramClass programClass, ProgramField programField) { - if (isSpecialName(programField)) + if (hasSpecialName(programField)) { memberVisitor.visitProgramField(programClass, programField); } @@ -63,7 +63,7 @@ public class MemberSpecialNameFilter implements MemberVisitor public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) { - if (isSpecialName(programMethod)) + if (hasSpecialName(programMethod)) { memberVisitor.visitProgramMethod(programClass, programMethod); } @@ -72,7 +72,7 @@ public class MemberSpecialNameFilter implements MemberVisitor public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) { - if (isSpecialName(libraryField)) + if (hasSpecialName(libraryField)) { memberVisitor.visitLibraryField(libraryClass, libraryField); } @@ -81,7 +81,7 @@ public class MemberSpecialNameFilter implements MemberVisitor public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) { - if (isSpecialName(libraryMethod)) + if (hasSpecialName(libraryMethod)) { memberVisitor.visitLibraryMethod(libraryClass, libraryMethod); } @@ -94,7 +94,7 @@ public class MemberSpecialNameFilter implements MemberVisitor * Returns whether the given class member has a special new name. * @param member the class member. */ - private static boolean isSpecialName(Member member) + private static boolean hasSpecialName(Member member) { return SpecialNameFactory.isSpecialName(MemberObfuscator.newMemberName(member)); } diff --git a/src/proguard/obfuscate/MultiMappingProcessor.java b/src/proguard/obfuscate/MultiMappingProcessor.java index 4074ff8..8b67bb6 100644 --- a/src/proguard/obfuscate/MultiMappingProcessor.java +++ b/src/proguard/obfuscate/MultiMappingProcessor.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free diff --git a/src/proguard/obfuscate/NameAndTypeShrinker.java b/src/proguard/obfuscate/NameAndTypeShrinker.java deleted file mode 100644 index 1284c82..0000000 --- a/src/proguard/obfuscate/NameAndTypeShrinker.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.*; -import proguard.classfile.constant.Constant; -import proguard.classfile.editor.ConstantPoolRemapper; -import proguard.classfile.visitor.ClassVisitor; - - -/** - * This ClassVisitor removes NameAndType constant pool entries - * that are not marked as being used. - * - * @see NameAndTypeUsageMarker - * - * @author Eric Lafortune - */ -public class NameAndTypeShrinker implements ClassVisitor -{ - private int[] constantIndexMap; - private final ConstantPoolRemapper constantPoolRemapper = new ConstantPoolRemapper(); - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Shift the used constant pool entries together, filling out the - // index map. - programClass.u2constantPoolCount = - shrinkConstantPool(programClass.constantPool, - programClass.u2constantPoolCount); - - - // Remap all constant pool references. - constantPoolRemapper.setConstantIndexMap(constantIndexMap); - constantPoolRemapper.visitProgramClass(programClass); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - } - - - // Small utility methods. - - /** - * Removes all NameAndType entries that are not marked as being used - * from the given constant pool. - * @return the new number of entries. - */ - private int shrinkConstantPool(Constant[] constantPool, int length) - { - // Create a new index map, if necessary. - if (constantIndexMap == null || - constantIndexMap.length < length) - { - constantIndexMap = new int[length]; - } - - int counter = 1; - boolean isUsed = false; - - // Shift the used constant pool entries together. - for (int index = 1; index < length; index++) - { - constantIndexMap[index] = counter; - - Constant constant = constantPool[index]; - - // Don't update the flag if this is the second half of a long entry. - if (constant != null) - { - isUsed = constant.getTag() != ClassConstants.CONSTANT_NameAndType || - NameAndTypeUsageMarker.isUsed(constant); - } - - if (isUsed) - { - constantPool[counter++] = constant; - } - } - - // Clear the remaining constant pool elements. - for (int index = counter; index < length; index++) - { - constantPool[index] = null; - } - - return counter; - } -} diff --git a/src/proguard/obfuscate/NameAndTypeUsageMarker.java b/src/proguard/obfuscate/NameAndTypeUsageMarker.java deleted file mode 100644 index cc779f0..0000000 --- a/src/proguard/obfuscate/NameAndTypeUsageMarker.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor marks all NameAndType constant pool entries that are - * being used in the program classes it visits. - * - * @see NameAndTypeShrinker - * - * @author Eric Lafortune - */ -public class NameAndTypeUsageMarker -extends SimplifiedVisitor -implements ClassVisitor, - ConstantVisitor, - AttributeVisitor -{ - // A visitor info flag to indicate the NameAndType constant pool entry is being used. - private static final Object USED = new Object(); - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Mark the NameAndType entries referenced by all other constant pool - // entries. - programClass.constantPoolEntriesAccept(this); - - // Mark the NameAndType entries referenced by all EnclosingMethod - // attributes. - programClass.attributesAccept(this); - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fieldrefConstant) - { - visitRefConstant(clazz, fieldrefConstant); - } - - - public void visitInterfaceMethodrefConstant(Clazz clazz, InterfaceMethodrefConstant interfaceMethodrefConstant) - { - visitRefConstant(clazz, interfaceMethodrefConstant); - } - - - public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant) - { - visitRefConstant(clazz, methodrefConstant); - } - - - private void visitRefConstant(Clazz clazz, RefConstant refConstant) - { - markNameAndTypeConstant(clazz, refConstant.u2nameAndTypeIndex); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - if (enclosingMethodAttribute.u2nameAndTypeIndex != 0) - { - markNameAndTypeConstant(clazz, enclosingMethodAttribute.u2nameAndTypeIndex); - } - } - - - // Small utility methods. - - /** - * Marks the given UTF-8 constant pool entry of the given class. - */ - private void markNameAndTypeConstant(Clazz clazz, int index) - { - markAsUsed((NameAndTypeConstant)((ProgramClass)clazz).getConstant(index)); - } - - - /** - * Marks the given VisitorAccepter as being used. - * In this context, the VisitorAccepter will be a NameAndTypeConstant object. - */ - private static void markAsUsed(VisitorAccepter visitorAccepter) - { - visitorAccepter.setVisitorInfo(USED); - } - - - /** - * Returns whether the given VisitorAccepter has been marked as being used. - * In this context, the VisitorAccepter will be a NameAndTypeConstant object. - */ - static boolean isUsed(VisitorAccepter visitorAccepter) - { - return visitorAccepter.getVisitorInfo() == USED; - } -} diff --git a/src/proguard/obfuscate/NameFactory.java b/src/proguard/obfuscate/NameFactory.java index c64d1ad..9585381 100644 --- a/src/proguard/obfuscate/NameFactory.java +++ b/src/proguard/obfuscate/NameFactory.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free diff --git a/src/proguard/obfuscate/NameFactoryResetter.java b/src/proguard/obfuscate/NameFactoryResetter.java index b6ba6ad..f3e889d 100644 --- a/src/proguard/obfuscate/NameFactoryResetter.java +++ b/src/proguard/obfuscate/NameFactoryResetter.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free diff --git a/src/proguard/obfuscate/NameMarker.java b/src/proguard/obfuscate/NameMarker.java index 2ce0ee9..130260c 100644 --- a/src/proguard/obfuscate/NameMarker.java +++ b/src/proguard/obfuscate/NameMarker.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free diff --git a/src/proguard/obfuscate/NumericNameFactory.java b/src/proguard/obfuscate/NumericNameFactory.java index cc21c4b..5a6e3b4 100644 --- a/src/proguard/obfuscate/NumericNameFactory.java +++ b/src/proguard/obfuscate/NumericNameFactory.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free diff --git a/src/proguard/obfuscate/Obfuscator.java b/src/proguard/obfuscate/Obfuscator.java index dce563a..5f58a83 100644 --- a/src/proguard/obfuscate/Obfuscator.java +++ b/src/proguard/obfuscate/Obfuscator.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free @@ -99,19 +99,30 @@ public class Obfuscator libraryClassPool.classesAccept(new AllMemberVisitor(nameMarker)); // Mark attributes that have to be kept. - AttributeUsageMarker requiredAttributeUsageMarker = - new AttributeUsageMarker(); + AttributeVisitor attributeUsageMarker = + new NonEmptyAttributeFilter( + new AttributeUsageMarker()); AttributeVisitor optionalAttributeUsageMarker = configuration.keepAttributes == null ? null : new AttributeNameFilter(new ListParser(new NameParser()).parse(configuration.keepAttributes), - requiredAttributeUsageMarker); + attributeUsageMarker); programClassPool.classesAccept( new AllAttributeVisitor(true, - new RequiredAttributeFilter(requiredAttributeUsageMarker, + new RequiredAttributeFilter(attributeUsageMarker, optionalAttributeUsageMarker))); + // Keep parameter names and types if specified. + if (configuration.keepParameterNames) + { + programClassPool.classesAccept( + new AllMethodVisitor( + new MemberNameFilter( + new AllAttributeVisitor(true, + new ParameterNameMarker(attributeUsageMarker))))); + } + // Remove the attributes that can be discarded. Note that the attributes // may only be discarded after the seeds have been marked, since the // configuration may rely on annotations. @@ -398,23 +409,28 @@ public class Obfuscator programClassPool.classesAccept( new AllConstantVisitor( new AccessFixer())); + + // Fix the access flags of the inner classes information. + programClassPool.classesAccept( + new AllAttributeVisitor( + new AllInnerClassesInfoVisitor( + new InnerClassesAccessFixer()))); } + // Fix the bridge method flags. + programClassPool.classesAccept( + new AllMethodVisitor( + new BridgeMethodFixer())); + // Rename the source file attributes, if requested. if (configuration.newSourceFileAttribute != null) { programClassPool.classesAccept(new SourceFileRenamer(configuration.newSourceFileAttribute)); } - // Mark NameAndType constant pool entries that have to be kept - // and remove the other ones. - programClassPool.classesAccept(new NameAndTypeUsageMarker()); - programClassPool.classesAccept(new NameAndTypeShrinker()); - - // Mark Utf8 constant pool entries that have to be kept - // and remove the other ones. - programClassPool.classesAccept(new Utf8UsageMarker()); - programClassPool.classesAccept(new Utf8Shrinker()); + // Remove unused constants. + programClassPool.classesAccept( + new ConstantPoolShrinker()); } diff --git a/src/proguard/obfuscate/ParameterNameMarker.java b/src/proguard/obfuscate/ParameterNameMarker.java new file mode 100644 index 0000000..2c3a3db --- /dev/null +++ b/src/proguard/obfuscate/ParameterNameMarker.java @@ -0,0 +1,128 @@ +/* + * ProGuard -- shrinking, optimization, obfuscation, and preverification + * of Java bytecode. + * + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package proguard.obfuscate; + +import proguard.classfile.*; +import proguard.classfile.attribute.*; +import proguard.classfile.attribute.visitor.AttributeVisitor; +import proguard.classfile.util.*; + +/** + * This AttributeVisitor trims and marks all local variable (type) table + * attributes that it visits. It keeps parameter names and types and removes + * the ordinary local variable names and types. + * + * @author Eric Lafortune + */ +public class ParameterNameMarker +extends SimplifiedVisitor +implements AttributeVisitor +{ + private final AttributeVisitor attributeUsageMarker; + + + /** + * Constructs a new ParameterNameMarker. + * @param attributeUsageMarker the marker that will be used to mark + * attributes containing local variable info. + */ + public ParameterNameMarker(AttributeVisitor attributeUsageMarker) + { + this.attributeUsageMarker = attributeUsageMarker; + } + + + // Implementations for AttributeVisitor. + + public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} + + + public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) + { + if (!AttributeUsageMarker.isUsed(localVariableTableAttribute) && + hasParameters(clazz, method)) + { + // Shift the entries that start at offset 0 to the front. + int newIndex = 0; + + for (int index = 0; index < localVariableTableAttribute.u2localVariableTableLength; index++) + { + LocalVariableInfo localVariableInfo = + localVariableTableAttribute.localVariableTable[index]; + + if (localVariableInfo.u2startPC == 0) + { + localVariableTableAttribute.localVariableTable[newIndex++] = + localVariableInfo; + } + } + + // Trim the table. + localVariableTableAttribute.u2localVariableTableLength = newIndex; + + // Mark the table if there are any entries. + if (newIndex > 0) + { + attributeUsageMarker.visitLocalVariableTableAttribute(clazz, method, codeAttribute, localVariableTableAttribute); + } + } + } + + + public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) + { + if (!AttributeUsageMarker.isUsed(localVariableTypeTableAttribute) && + hasParameters(clazz, method)) + { + // Shift the entries that start at offset 0 to the front. + int newIndex = 0; + + for (int index = 0; index < localVariableTypeTableAttribute.u2localVariableTypeTableLength; index++) + { + LocalVariableTypeInfo localVariableTypeInfo = + localVariableTypeTableAttribute.localVariableTypeTable[index]; + + if (localVariableTypeInfo.u2startPC == 0) + { + localVariableTypeTableAttribute.localVariableTypeTable[newIndex++] = + localVariableTypeInfo; + } + } + + // Trim the table. + localVariableTypeTableAttribute.u2localVariableTypeTableLength = newIndex; + + // Mark the table if there are any entries. + if (newIndex > 0) + { + attributeUsageMarker.visitLocalVariableTypeTableAttribute(clazz, method, codeAttribute, localVariableTypeTableAttribute); + } + } + } + + + // Small utility methods. + + private boolean hasParameters(Clazz clazz, Method method) + { + return method.getDescriptor(clazz).charAt(1) != ClassConstants.INTERNAL_METHOD_ARGUMENTS_CLOSE; + } +}
\ No newline at end of file diff --git a/src/proguard/obfuscate/SimpleNameFactory.java b/src/proguard/obfuscate/SimpleNameFactory.java index bce22de..d9b770b 100644 --- a/src/proguard/obfuscate/SimpleNameFactory.java +++ b/src/proguard/obfuscate/SimpleNameFactory.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free diff --git a/src/proguard/obfuscate/SourceFileRenamer.java b/src/proguard/obfuscate/SourceFileRenamer.java index cbf1b63..8805b08 100644 --- a/src/proguard/obfuscate/SourceFileRenamer.java +++ b/src/proguard/obfuscate/SourceFileRenamer.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free diff --git a/src/proguard/obfuscate/SpecialNameFactory.java b/src/proguard/obfuscate/SpecialNameFactory.java index a5431ca..07c1674 100644 --- a/src/proguard/obfuscate/SpecialNameFactory.java +++ b/src/proguard/obfuscate/SpecialNameFactory.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free diff --git a/src/proguard/obfuscate/Utf8Shrinker.java b/src/proguard/obfuscate/Utf8Shrinker.java deleted file mode 100644 index 87ada80..0000000 --- a/src/proguard/obfuscate/Utf8Shrinker.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.*; -import proguard.classfile.constant.Constant; -import proguard.classfile.editor.ConstantPoolRemapper; -import proguard.classfile.visitor.ClassVisitor; - - -/** - * This ClassVisitor removes UTF-8 constant pool entries that are not marked - * as being used. - * - * @see Utf8UsageMarker - * - * @author Eric Lafortune - */ -public class Utf8Shrinker implements ClassVisitor -{ - private int[] constantIndexMap = new int[ClassConstants.TYPICAL_CONSTANT_POOL_SIZE]; - private final ConstantPoolRemapper constantPoolRemapper = new ConstantPoolRemapper(); - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Shift the used constant pool entries together, filling out the - // index map. - programClass.u2constantPoolCount = - shrinkConstantPool(programClass.constantPool, - programClass.u2constantPoolCount); - - // Remap all constant pool references. - constantPoolRemapper.setConstantIndexMap(constantIndexMap); - constantPoolRemapper.visitProgramClass(programClass); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - } - - - // Small utility methods. - - /** - * Removes all UTF-8 entries that are not marked as being used - * from the given constant pool. - * @return the new number of entries. - */ - private int shrinkConstantPool(Constant[] constantPool, int length) - { - // Create a new index map, if necessary. - if (constantIndexMap.length < length) - { - constantIndexMap = new int[length]; - } - - int counter = 1; - boolean isUsed = false; - - // Shift the used constant pool entries together. - for (int index = 1; index < length; index++) - { - constantIndexMap[index] = counter; - - Constant constant = constantPool[index]; - - // Don't update the flag if this is the second half of a long entry. - if (constant != null) - { - isUsed = constant.getTag() != ClassConstants.CONSTANT_Utf8 || - Utf8UsageMarker.isUsed(constant); - } - - if (isUsed) - { - constantPool[counter++] = constant; - } - } - - // Clear the remaining constant pool elements. - for (int index = counter; index < length; index++) - { - constantPool[index] = null; - } - - return counter; - } -} diff --git a/src/proguard/obfuscate/Utf8UsageMarker.java b/src/proguard/obfuscate/Utf8UsageMarker.java deleted file mode 100644 index c59ebb8..0000000 --- a/src/proguard/obfuscate/Utf8UsageMarker.java +++ /dev/null @@ -1,392 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.visitor.*; -import proguard.classfile.attribute.preverification.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; - -/** - * This ClassVisitor marks all UTF-8 constant pool entries that are - * being used in the program classes it visits. - * - * @see Utf8Shrinker - * - * @author Eric Lafortune - */ -public class Utf8UsageMarker -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor, - ConstantVisitor, - AttributeVisitor, - InnerClassesInfoVisitor, - LocalVariableInfoVisitor, - LocalVariableTypeInfoVisitor, - AnnotationVisitor, - ElementValueVisitor -{ - // A visitor info flag to indicate the UTF-8 constant pool entry is being used. - private static final Object USED = new Object(); - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Mark the UTF-8 entries referenced by the other constant pool entries. - programClass.constantPoolEntriesAccept(this); - - // Mark the UTF-8 entries referenced by the fields and methods. - programClass.fieldsAccept(this); - programClass.methodsAccept(this); - - // Mark the UTF-8 entries referenced by the attributes. - programClass.attributesAccept(this); - } - - - // Implementations for MemberVisitor. - - public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) - { - // Mark the name and descriptor UTF-8 entries. - markCpUtf8Entry(programClass, programMember.u2nameIndex); - markCpUtf8Entry(programClass, programMember.u2descriptorIndex); - - // Mark the UTF-8 entries referenced by the attributes. - programMember.attributesAccept(programClass, this); - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - markCpUtf8Entry(clazz, stringConstant.u2stringIndex); - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - markCpUtf8Entry(clazz, classConstant.u2nameIndex); - } - - - public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant) - { - markCpUtf8Entry(clazz, nameAndTypeConstant.u2nameIndex); - markCpUtf8Entry(clazz, nameAndTypeConstant.u2descriptorIndex); - } - - - // Implementations for AttributeVisitor. - - public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute) - { - // This is the best we can do for unknown attributes. - markCpUtf8Entry(clazz, unknownAttribute.u2attributeNameIndex); - } - - - public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute) - { - markCpUtf8Entry(clazz, sourceFileAttribute.u2attributeNameIndex); - - markCpUtf8Entry(clazz, sourceFileAttribute.u2sourceFileIndex); - } - - - public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) - { - markCpUtf8Entry(clazz, sourceDirAttribute.u2attributeNameIndex); - - markCpUtf8Entry(clazz, sourceDirAttribute.u2sourceDirIndex); - } - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - markCpUtf8Entry(clazz, innerClassesAttribute.u2attributeNameIndex); - - // Mark the UTF-8 entries referenced by the inner classes. - innerClassesAttribute.innerClassEntriesAccept(clazz, this); - } - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - markCpUtf8Entry(clazz, enclosingMethodAttribute.u2attributeNameIndex); - - // These entries have already been marked in the constant pool. - //clazz.constantPoolEntryAccept(this, enclosingMethodAttribute.u2classIndex); - //clazz.constantPoolEntryAccept(this, enclosingMethodAttribute.u2nameAndTypeIndex); - } - - - public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute) - { - markCpUtf8Entry(clazz, deprecatedAttribute.u2attributeNameIndex); - } - - - public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute) - { - markCpUtf8Entry(clazz, syntheticAttribute.u2attributeNameIndex); - } - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) - { - markCpUtf8Entry(clazz, signatureAttribute.u2attributeNameIndex); - - markCpUtf8Entry(clazz, signatureAttribute.u2signatureIndex); - } - - - public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) - { - markCpUtf8Entry(clazz, constantValueAttribute.u2attributeNameIndex); - } - - - public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) - { - markCpUtf8Entry(clazz, exceptionsAttribute.u2attributeNameIndex); - } - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - markCpUtf8Entry(clazz, codeAttribute.u2attributeNameIndex); - - // Mark the UTF-8 entries referenced by the attributes. - codeAttribute.attributesAccept(clazz, method, this); - } - - - public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) - { - markCpUtf8Entry(clazz, stackMapAttribute.u2attributeNameIndex); - } - - - public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) - { - markCpUtf8Entry(clazz, stackMapTableAttribute.u2attributeNameIndex); - } - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - markCpUtf8Entry(clazz, lineNumberTableAttribute.u2attributeNameIndex); - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - markCpUtf8Entry(clazz, localVariableTableAttribute.u2attributeNameIndex); - - // Mark the UTF-8 entries referenced by the local variables. - localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - markCpUtf8Entry(clazz, localVariableTypeTableAttribute.u2attributeNameIndex); - - // Mark the UTF-8 entries referenced by the local variable types. - localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute) - { - markCpUtf8Entry(clazz, annotationsAttribute.u2attributeNameIndex); - - // Mark the UTF-8 entries referenced by the annotations. - annotationsAttribute.annotationsAccept(clazz, this); - } - - - public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) - { - markCpUtf8Entry(clazz, parameterAnnotationsAttribute.u2attributeNameIndex); - - // Mark the UTF-8 entries referenced by the annotations. - parameterAnnotationsAttribute.annotationsAccept(clazz, method, this); - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - markCpUtf8Entry(clazz, annotationDefaultAttribute.u2attributeNameIndex); - - // Mark the UTF-8 entries referenced by the element value. - annotationDefaultAttribute.defaultValueAccept(clazz, this); - } - - - // Implementations for InnerClassesInfoVisitor. - - public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo) - { - if (innerClassesInfo.u2innerNameIndex != 0) - { - markCpUtf8Entry(clazz, innerClassesInfo.u2innerNameIndex); - } - } - - - // Implementations for LocalVariableInfoVisitor. - - public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) - { - markCpUtf8Entry(clazz, localVariableInfo.u2nameIndex); - markCpUtf8Entry(clazz, localVariableInfo.u2descriptorIndex); - } - - - // Implementations for LocalVariableTypeInfoVisitor. - - public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) - { - markCpUtf8Entry(clazz, localVariableTypeInfo.u2nameIndex); - markCpUtf8Entry(clazz, localVariableTypeInfo.u2signatureIndex); - } - - - // Implementations for AnnotationVisitor. - - public void visitAnnotation(Clazz clazz, Annotation annotation) - { - markCpUtf8Entry(clazz, annotation.u2typeIndex); - - // Mark the UTF-8 entries referenced by the element values. - annotation.elementValuesAccept(clazz, this); - } - - - // Implementations for ElementValueVisitor. - - public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue) - { - if (constantElementValue.u2elementNameIndex != 0) - { - markCpUtf8Entry(clazz, constantElementValue.u2elementNameIndex); - } - - // Only the string constant element value refers to a UTF-8 entry. - if (constantElementValue.u1tag == ClassConstants.ELEMENT_VALUE_STRING_CONSTANT) - { - markCpUtf8Entry(clazz, constantElementValue.u2constantValueIndex); - } - } - - - public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue) - { - if (enumConstantElementValue.u2elementNameIndex != 0) - { - markCpUtf8Entry(clazz, enumConstantElementValue.u2elementNameIndex); - } - - markCpUtf8Entry(clazz, enumConstantElementValue.u2typeNameIndex); - markCpUtf8Entry(clazz, enumConstantElementValue.u2constantNameIndex); - } - - - public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue) - { - if (classElementValue.u2elementNameIndex != 0) - { - markCpUtf8Entry(clazz, classElementValue.u2elementNameIndex); - } - - markCpUtf8Entry(clazz, classElementValue.u2classInfoIndex); - } - - - public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) - { - if (annotationElementValue.u2elementNameIndex != 0) - { - markCpUtf8Entry(clazz, annotationElementValue.u2elementNameIndex); - } - - // Mark the UTF-8 entries referenced by the annotation. - annotationElementValue.annotationAccept(clazz, this); - } - - - public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) - { - if (arrayElementValue.u2elementNameIndex != 0) - { - markCpUtf8Entry(clazz, arrayElementValue.u2elementNameIndex); - } - - // Mark the UTF-8 entries referenced by the element values. - arrayElementValue.elementValuesAccept(clazz, annotation, this); - } - - - // Small utility methods. - - /** - * Marks the given UTF-8 constant pool entry of the given class. - */ - private void markCpUtf8Entry(Clazz clazz, int index) - { - markAsUsed((Utf8Constant)((ProgramClass)clazz).getConstant(index)); - } - - - /** - * Marks the given VisitorAccepter as being used. - * In this context, the VisitorAccepter will be a Utf8Constant object. - */ - private static void markAsUsed(VisitorAccepter visitorAccepter) - { - visitorAccepter.setVisitorInfo(USED); - } - - - /** - * Returns whether the given VisitorAccepter has been marked as being used. - * In this context, the VisitorAccepter will be a Utf8Constant object. - */ - static boolean isUsed(VisitorAccepter visitorAccepter) - { - return visitorAccepter.getVisitorInfo() == USED; - } -} |