diff options
Diffstat (limited to 'src/proguard/classfile/util')
19 files changed, 1001 insertions, 364 deletions
diff --git a/src/proguard/classfile/util/AccessUtil.java b/src/proguard/classfile/util/AccessUtil.java index d16f576..97fda89 100644 --- a/src/proguard/classfile/util/AccessUtil.java +++ b/src/proguard/classfile/util/AccessUtil.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2014 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 @@ -40,9 +40,9 @@ public class AccessUtil // The mask of access flags. private static final int ACCESS_MASK = - ClassConstants.INTERNAL_ACC_PUBLIC | - ClassConstants.INTERNAL_ACC_PRIVATE | - ClassConstants.INTERNAL_ACC_PROTECTED; + ClassConstants.ACC_PUBLIC | + ClassConstants.ACC_PRIVATE | + ClassConstants.ACC_PROTECTED; /** @@ -56,10 +56,10 @@ public class AccessUtil { switch (accessFlags & ACCESS_MASK) { - case ClassConstants.INTERNAL_ACC_PRIVATE: return PRIVATE; - default: return PACKAGE_VISIBLE; - case ClassConstants.INTERNAL_ACC_PROTECTED: return PROTECTED; - case ClassConstants.INTERNAL_ACC_PUBLIC: return PUBLIC; + case ClassConstants.ACC_PRIVATE: return PRIVATE; + default: return PACKAGE_VISIBLE; + case ClassConstants.ACC_PROTECTED: return PROTECTED; + case ClassConstants.ACC_PUBLIC: return PUBLIC; } } @@ -78,10 +78,10 @@ public class AccessUtil { switch (accessLevel) { - case PRIVATE: return ClassConstants.INTERNAL_ACC_PRIVATE; + case PRIVATE: return ClassConstants.ACC_PRIVATE; default: return 0; - case PROTECTED: return ClassConstants.INTERNAL_ACC_PROTECTED; - case PUBLIC: return ClassConstants.INTERNAL_ACC_PUBLIC; + case PROTECTED: return ClassConstants.ACC_PROTECTED; + case PUBLIC: return ClassConstants.ACC_PUBLIC; } } @@ -94,9 +94,9 @@ public class AccessUtil public static int replaceAccessFlags(int accessFlags, int newAccessFlags) { // A private class member should not be explicitly final. - if (newAccessFlags == ClassConstants.INTERNAL_ACC_PRIVATE) + if (newAccessFlags == ClassConstants.ACC_PRIVATE) { - accessFlags &= ~ClassConstants.INTERNAL_ACC_FINAL; + accessFlags &= ~ClassConstants.ACC_FINAL; } return (accessFlags & ~ACCESS_MASK) | diff --git a/src/proguard/classfile/util/AllParameterVisitor.java b/src/proguard/classfile/util/AllParameterVisitor.java new file mode 100644 index 0000000..3695dbb --- /dev/null +++ b/src/proguard/classfile/util/AllParameterVisitor.java @@ -0,0 +1,239 @@ +/* + * ProGuard -- shrinking, optimization, obfuscation, and preverification + * of Java bytecode. + * + * Copyright (c) 2002-2014 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.classfile.util; + +import proguard.classfile.*; +import proguard.classfile.visitor.*; + +/** + * This MemberVisitor lets a given parameter visitor visit all the parameters + * of the methods that it visits. The parameters do not include or count the + * 'this' parameter or the return value. + * + * @author Eric Lafortune + */ +public class AllParameterVisitor +implements MemberVisitor +{ + private final ParameterVisitor parameterVisitor; + + + /** + * Creates a new AllParameterVisitor for the given parameter + * visitor. + */ + public AllParameterVisitor(ParameterVisitor parameterVisitor) + { + this.parameterVisitor = parameterVisitor; + } + + + // Implementations for MemberVisitor. + + public void visitProgramField(ProgramClass programClass, ProgramField programField) + { + visitFieldType(programClass, + programField, + programField.referencedClass); + } + + + public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) + { + visitFieldType(libraryClass, + libraryField, + libraryField.referencedClass); + } + + + public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) + { + visitParameters(programClass, + programMethod, + programMethod.referencedClasses); + } + + + public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) + { + visitParameters(libraryClass, + libraryMethod, + libraryMethod.referencedClasses); + } + + + // Small utility methods. + + /** + * Lets the parameter visitor visit the type of the given field. + */ + private void visitFieldType(Clazz clazz, + Field field, + Clazz referencedClass) + { + String descriptor = field.getDescriptor(clazz); + parameterVisitor.visitParameter(clazz, + field, + 0, + 1, + 0, + ClassUtil.internalTypeSize(descriptor), + descriptor, + referencedClass); + } + + + /** + * Lets the parameter visitor visit the parameters of the given method. + */ + private void visitParameters(Clazz clazz, + Method method, + Clazz[] referencedClasses) + { + String descriptor = method.getDescriptor(clazz); + + // Count the number of parameters and their total size. + int parameterCount = 0; + int parameterSize = 0; + + int index = 1; + + loop: while (true) + { + char c = descriptor.charAt(index++); + switch (c) + { + case ClassConstants.TYPE_LONG: + case ClassConstants.TYPE_DOUBLE: + { + // Long and double primitive types. + parameterSize++; + break; + } + default: + { + // All other primitive types. + break; + } + case ClassConstants.TYPE_CLASS_START: + { + // Class types. + // Skip the class name. + index = descriptor.indexOf(ClassConstants.TYPE_CLASS_END, index) + 1; + break; + } + case ClassConstants.TYPE_ARRAY: + { + // Array types. + // Skip all array characters. + while ((c = descriptor.charAt(index++)) == ClassConstants.TYPE_ARRAY) {} + + if (c == ClassConstants.TYPE_CLASS_START) + { + // Skip the class type. + index = descriptor.indexOf(ClassConstants.TYPE_CLASS_END, index) + 1; + } + break; + } + case ClassConstants.METHOD_ARGUMENTS_CLOSE: + { + break loop; + } + } + + parameterCount++; + parameterSize++; + } + + // Visit the parameters. + int parameterIndex = 0; + int parameterOffset = 0; + int referenceClassIndex = 0; + + index = 1; + + while (true) + { + int newIndex = index + 1; + int thisParameterSize = 1; + Clazz referencedClass = null; + + char c = descriptor.charAt(index); + switch (c) + { + case ClassConstants.TYPE_LONG: + case ClassConstants.TYPE_DOUBLE: + { + // Long and double primitive types. + thisParameterSize = 2; + break; + } + default: + { + // All other primitive types. + break; + } + case ClassConstants.TYPE_CLASS_START: + { + // Class types. + // Skip the class name. + newIndex = descriptor.indexOf(ClassConstants.TYPE_CLASS_END, newIndex) + 1; + referencedClass = referencedClasses == null ? null : + referencedClasses[referenceClassIndex++]; + break; + } + case ClassConstants.TYPE_ARRAY: + { + // Array types. + // Skip all array characters. + while ((c = descriptor.charAt(newIndex++)) == ClassConstants.TYPE_ARRAY) {} + + if (c == ClassConstants.TYPE_CLASS_START) + { + // Skip the class type. + newIndex = descriptor.indexOf(ClassConstants.TYPE_CLASS_END, newIndex) + 1; + referencedClass = referencedClasses == null ? null : + referencedClasses[referenceClassIndex++]; + } + break; + } + case ClassConstants.METHOD_ARGUMENTS_CLOSE: + { + // End of the method parameters. + return; + } + } + + parameterVisitor.visitParameter(clazz, + method, + parameterIndex++, + parameterCount, + parameterOffset, + parameterSize, + descriptor.substring(index, newIndex), + referencedClass); + + // Continue with the next parameter. + index = newIndex; + parameterOffset += thisParameterSize; + } + } +} diff --git a/src/proguard/classfile/util/ClassReferenceInitializer.java b/src/proguard/classfile/util/ClassReferenceInitializer.java index a5748ee..3baf422 100644 --- a/src/proguard/classfile/util/ClassReferenceInitializer.java +++ b/src/proguard/classfile/util/ClassReferenceInitializer.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2014 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 @@ -165,7 +165,15 @@ implements ClassVisitor, { // Fill out the String class. stringConstant.javaLangStringClass = - findClass(clazz.getName(), ClassConstants.INTERNAL_NAME_JAVA_LANG_STRING); + findClass(clazz.getName(), ClassConstants.NAME_JAVA_LANG_STRING); + } + + + public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) + { + invokeDynamicConstant.referencedClasses = + findReferencedClasses(clazz.getName(), + invokeDynamicConstant.getType(clazz)); } @@ -173,7 +181,7 @@ implements ClassVisitor, { // Fill out the MethodHandle class. methodHandleConstant.javaLangInvokeMethodHandleClass = - findClass(clazz.getName(), ClassConstants.INTERNAL_NAME_JAVA_LANG_INVOKE_METHOD_HANDLE); + findClass(clazz.getName(), ClassConstants.NAME_JAVA_LANG_INVOKE_METHOD_HANDLE); } @@ -184,7 +192,7 @@ implements ClassVisitor, // Methods for array types should be found in the Object class. if (ClassUtil.isInternalArrayType(className)) { - className = ClassConstants.INTERNAL_NAME_JAVA_LANG_OBJECT; + className = ClassConstants.NAME_JAVA_LANG_OBJECT; } // See if we can find the referenced class. @@ -246,7 +254,7 @@ implements ClassVisitor, // Fill out the Class class. classConstant.javaLangClassClass = - findClass(className, ClassConstants.INTERNAL_NAME_JAVA_LANG_CLASS); + findClass(className, ClassConstants.NAME_JAVA_LANG_CLASS); } @@ -254,7 +262,11 @@ implements ClassVisitor, { // Fill out the MethodType class. methodTypeConstant.javaLangInvokeMethodTypeClass = - findClass(clazz.getName(), ClassConstants.INTERNAL_NAME_JAVA_LANG_INVOKE_METHOD_TYPE); + findClass(clazz.getName(), ClassConstants.NAME_JAVA_LANG_INVOKE_METHOD_TYPE); + + methodTypeConstant.referencedClasses = + findReferencedClasses(clazz.getName(), + methodTypeConstant.getType(clazz)); } @@ -327,7 +339,7 @@ implements ClassVisitor, { signatureAttribute.referencedClasses = findReferencedClasses(clazz.getName(), - clazz.getString(signatureAttribute.u2signatureIndex)); + signatureAttribute.getSignature(clazz)); } @@ -358,7 +370,7 @@ implements ClassVisitor, { localVariableInfo.referencedClass = findReferencedClass(clazz.getName(), - clazz.getString(localVariableInfo.u2descriptorIndex)); + localVariableInfo.getDescriptor(clazz)); } @@ -368,7 +380,7 @@ implements ClassVisitor, { localVariableTypeInfo.referencedClasses = findReferencedClasses(clazz.getName(), - clazz.getString(localVariableTypeInfo.u2signatureIndex)); + localVariableTypeInfo.getSignature(clazz)); } @@ -378,7 +390,7 @@ implements ClassVisitor, { annotation.referencedClasses = findReferencedClasses(clazz.getName(), - clazz.getString(annotation.u2typeIndex)); + annotation.getType(clazz)); // Initialize the element values. annotation.elementValuesAccept(clazz, this); @@ -399,7 +411,7 @@ implements ClassVisitor, enumConstantElementValue.referencedClasses = findReferencedClasses(clazz.getName(), - clazz.getString(enumConstantElementValue.u2typeNameIndex)); + enumConstantElementValue.getTypeName(clazz)); } @@ -409,7 +421,7 @@ implements ClassVisitor, classElementValue.referencedClasses = findReferencedClasses(clazz.getName(), - clazz.getString(classElementValue.u2classInfoIndex)); + classElementValue.getClassName(clazz)); } @@ -443,7 +455,7 @@ implements ClassVisitor, { // See if we can find the method in the referenced class // (ignoring the descriptor). - String name = clazz.getString(elementValue.u2elementNameIndex); + String name = elementValue.getMethodName(clazz); Clazz referencedClass = annotation.referencedClasses[0]; elementValue.referencedClass = referencedClass; diff --git a/src/proguard/classfile/util/ClassSubHierarchyInitializer.java b/src/proguard/classfile/util/ClassSubHierarchyInitializer.java index 993a559..8a0e45e 100644 --- a/src/proguard/classfile/util/ClassSubHierarchyInitializer.java +++ b/src/proguard/classfile/util/ClassSubHierarchyInitializer.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2014 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/classfile/util/ClassSuperHierarchyInitializer.java b/src/proguard/classfile/util/ClassSuperHierarchyInitializer.java index fb431b8..1e765cb 100644 --- a/src/proguard/classfile/util/ClassSuperHierarchyInitializer.java +++ b/src/proguard/classfile/util/ClassSuperHierarchyInitializer.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2014 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/classfile/util/ClassUtil.java b/src/proguard/classfile/util/ClassUtil.java index fb38616..037d31a 100644 --- a/src/proguard/classfile/util/ClassUtil.java +++ b/src/proguard/classfile/util/ClassUtil.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2014 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 @@ -20,7 +20,7 @@ */ package proguard.classfile.util; -import proguard.classfile.ClassConstants; +import proguard.classfile.*; import java.util.List; @@ -91,18 +91,20 @@ public class ClassUtil public static int internalClassVersion(String classVersion) { return - classVersion.equals(ClassConstants.EXTERNAL_CLASS_VERSION_1_0) || - classVersion.equals(ClassConstants.EXTERNAL_CLASS_VERSION_1_1) ? ClassConstants.INTERNAL_CLASS_VERSION_1_0 : - classVersion.equals(ClassConstants.EXTERNAL_CLASS_VERSION_1_2) ? ClassConstants.INTERNAL_CLASS_VERSION_1_2 : - classVersion.equals(ClassConstants.EXTERNAL_CLASS_VERSION_1_3) ? ClassConstants.INTERNAL_CLASS_VERSION_1_3 : - classVersion.equals(ClassConstants.EXTERNAL_CLASS_VERSION_1_4) ? ClassConstants.INTERNAL_CLASS_VERSION_1_4 : - classVersion.equals(ClassConstants.EXTERNAL_CLASS_VERSION_1_5_ALIAS) || - classVersion.equals(ClassConstants.EXTERNAL_CLASS_VERSION_1_5) ? ClassConstants.INTERNAL_CLASS_VERSION_1_5 : - classVersion.equals(ClassConstants.EXTERNAL_CLASS_VERSION_1_6_ALIAS) || - classVersion.equals(ClassConstants.EXTERNAL_CLASS_VERSION_1_6) ? ClassConstants.INTERNAL_CLASS_VERSION_1_6 : - classVersion.equals(ClassConstants.EXTERNAL_CLASS_VERSION_1_7_ALIAS) || - classVersion.equals(ClassConstants.EXTERNAL_CLASS_VERSION_1_7) ? ClassConstants.INTERNAL_CLASS_VERSION_1_7 : - 0; + classVersion.equals(JavaConstants.CLASS_VERSION_1_0) || + classVersion.equals(JavaConstants.CLASS_VERSION_1_1) ? ClassConstants.CLASS_VERSION_1_0 : + classVersion.equals(JavaConstants.CLASS_VERSION_1_2) ? ClassConstants.CLASS_VERSION_1_2 : + classVersion.equals(JavaConstants.CLASS_VERSION_1_3) ? ClassConstants.CLASS_VERSION_1_3 : + classVersion.equals(JavaConstants.CLASS_VERSION_1_4) ? ClassConstants.CLASS_VERSION_1_4 : + classVersion.equals(JavaConstants.CLASS_VERSION_1_5_ALIAS) || + classVersion.equals(JavaConstants.CLASS_VERSION_1_5) ? ClassConstants.CLASS_VERSION_1_5 : + classVersion.equals(JavaConstants.CLASS_VERSION_1_6_ALIAS) || + classVersion.equals(JavaConstants.CLASS_VERSION_1_6) ? ClassConstants.CLASS_VERSION_1_6 : + classVersion.equals(JavaConstants.CLASS_VERSION_1_7_ALIAS) || + classVersion.equals(JavaConstants.CLASS_VERSION_1_7) ? ClassConstants.CLASS_VERSION_1_7 : + classVersion.equals(JavaConstants.CLASS_VERSION_1_8_ALIAS) || + classVersion.equals(JavaConstants.CLASS_VERSION_1_8) ? ClassConstants.CLASS_VERSION_1_8 : + 0; } @@ -115,14 +117,15 @@ public class ClassUtil { switch (classVersion) { - case ClassConstants.INTERNAL_CLASS_VERSION_1_0: return ClassConstants.EXTERNAL_CLASS_VERSION_1_0; - case ClassConstants.INTERNAL_CLASS_VERSION_1_2: return ClassConstants.EXTERNAL_CLASS_VERSION_1_2; - case ClassConstants.INTERNAL_CLASS_VERSION_1_3: return ClassConstants.EXTERNAL_CLASS_VERSION_1_3; - case ClassConstants.INTERNAL_CLASS_VERSION_1_4: return ClassConstants.EXTERNAL_CLASS_VERSION_1_4; - case ClassConstants.INTERNAL_CLASS_VERSION_1_5: return ClassConstants.EXTERNAL_CLASS_VERSION_1_5; - case ClassConstants.INTERNAL_CLASS_VERSION_1_6: return ClassConstants.EXTERNAL_CLASS_VERSION_1_6; - case ClassConstants.INTERNAL_CLASS_VERSION_1_7: return ClassConstants.EXTERNAL_CLASS_VERSION_1_7; - default: return null; + case ClassConstants.CLASS_VERSION_1_0: return JavaConstants.CLASS_VERSION_1_0; + case ClassConstants.CLASS_VERSION_1_2: return JavaConstants.CLASS_VERSION_1_2; + case ClassConstants.CLASS_VERSION_1_3: return JavaConstants.CLASS_VERSION_1_3; + case ClassConstants.CLASS_VERSION_1_4: return JavaConstants.CLASS_VERSION_1_4; + case ClassConstants.CLASS_VERSION_1_5: return JavaConstants.CLASS_VERSION_1_5; + case ClassConstants.CLASS_VERSION_1_6: return JavaConstants.CLASS_VERSION_1_6; + case ClassConstants.CLASS_VERSION_1_7: return JavaConstants.CLASS_VERSION_1_7; + case ClassConstants.CLASS_VERSION_1_8: return JavaConstants.CLASS_VERSION_1_8; + default: return null; } } @@ -134,15 +137,15 @@ public class ClassUtil */ public static void checkVersionNumbers(int classVersion) throws UnsupportedOperationException { - if (classVersion < ClassConstants.INTERNAL_CLASS_VERSION_1_0 || - classVersion > ClassConstants.INTERNAL_CLASS_VERSION_1_7) + if (classVersion < ClassConstants.CLASS_VERSION_1_0 || + classVersion > ClassConstants.CLASS_VERSION_1_8) { throw new UnsupportedOperationException("Unsupported class version number ["+ internalMajorClassVersion(classVersion)+"."+ internalMinorClassVersion(classVersion)+"] (maximum "+ - ClassConstants.INTERNAL_CLASS_VERSION_1_7_MAJOR+"."+ - ClassConstants.INTERNAL_CLASS_VERSION_1_7_MINOR+", Java "+ - ClassConstants.EXTERNAL_CLASS_VERSION_1_7+")"); + ClassConstants.CLASS_VERSION_1_8_MAJOR+"."+ + ClassConstants.CLASS_VERSION_1_8_MINOR+", Java "+ + JavaConstants.CLASS_VERSION_1_8+")"); } } @@ -156,8 +159,8 @@ public class ClassUtil */ public static String internalClassName(String externalClassName) { - return externalClassName.replace(ClassConstants.EXTERNAL_PACKAGE_SEPARATOR, - ClassConstants.INTERNAL_PACKAGE_SEPARATOR); + return externalClassName.replace(JavaConstants.PACKAGE_SEPARATOR, + ClassConstants.PACKAGE_SEPARATOR); } @@ -186,11 +189,11 @@ public class ClassUtil */ public static String externalClassName(String internalClassName) { - return //internalClassName.startsWith(ClassConstants.INTERNAL_PACKAGE_JAVA_LANG) && - //internalClassName.indexOf(ClassConstants.INTERNAL_PACKAGE_SEPARATOR, ClassConstants.INTERNAL_PACKAGE_JAVA_LANG.length() + 1) < 0 ? - //internalClassName.substring(ClassConstants.INTERNAL_PACKAGE_JAVA_LANG.length()) : - internalClassName.replace(ClassConstants.INTERNAL_PACKAGE_SEPARATOR, - ClassConstants.EXTERNAL_PACKAGE_SEPARATOR); + return //internalClassName.startsWith(ClassConstants.PACKAGE_JAVA_LANG) && + //internalClassName.indexOf(ClassConstants.PACKAGE_SEPARATOR, ClassConstants.PACKAGE_JAVA_LANG.length() + 1) < 0 ? + //internalClassName.substring(ClassConstants.PACKAGE_JAVA_LANG.length()) : + internalClassName.replace(ClassConstants.PACKAGE_SEPARATOR, + JavaConstants.PACKAGE_SEPARATOR); } @@ -204,7 +207,7 @@ public class ClassUtil */ public static String externalBaseType(String externalArrayType) { - int index = externalArrayType.indexOf(ClassConstants.EXTERNAL_TYPE_ARRAY); + int index = externalArrayType.indexOf(JavaConstants.TYPE_ARRAY); return index >= 0 ? externalArrayType.substring(0, index) : externalArrayType; @@ -221,7 +224,7 @@ public class ClassUtil */ public static String externalShortClassName(String externalClassName) { - int index = externalClassName.lastIndexOf(ClassConstants.EXTERNAL_PACKAGE_SEPARATOR); + int index = externalClassName.lastIndexOf(JavaConstants.PACKAGE_SEPARATOR); return externalClassName.substring(index+1); } @@ -236,7 +239,7 @@ public class ClassUtil public static boolean isInternalArrayType(String internalType) { return internalType.length() > 1 && - internalType.charAt(0) == ClassConstants.INTERNAL_TYPE_ARRAY; + internalType.charAt(0) == ClassConstants.TYPE_ARRAY; } @@ -249,7 +252,7 @@ public class ClassUtil public static int internalArrayTypeDimensionCount(String internalType) { int dimensions = 0; - while (internalType.charAt(dimensions) == ClassConstants.INTERNAL_TYPE_ARRAY) + while (internalType.charAt(dimensions) == ClassConstants.TYPE_ARRAY) { dimensions++; } @@ -270,9 +273,9 @@ public class ClassUtil */ public static boolean isInternalArrayInterfaceName(String internalClassName) { - return ClassConstants.INTERNAL_NAME_JAVA_LANG_OBJECT.equals(internalClassName) || - ClassConstants.INTERNAL_NAME_JAVA_LANG_CLONEABLE.equals(internalClassName) || - ClassConstants.INTERNAL_NAME_JAVA_IO_SERIALIZABLE.equals(internalClassName); + return ClassConstants.NAME_JAVA_LANG_OBJECT.equals(internalClassName) || + ClassConstants.NAME_JAVA_LANG_CLONEABLE.equals(internalClassName) || + ClassConstants.NAME_JAVA_IO_SERIALIZABLE.equals(internalClassName); } @@ -286,14 +289,14 @@ public class ClassUtil */ public static boolean isInternalPrimitiveType(char internalType) { - return internalType == ClassConstants.INTERNAL_TYPE_BOOLEAN || - internalType == ClassConstants.INTERNAL_TYPE_BYTE || - internalType == ClassConstants.INTERNAL_TYPE_CHAR || - internalType == ClassConstants.INTERNAL_TYPE_SHORT || - internalType == ClassConstants.INTERNAL_TYPE_INT || - internalType == ClassConstants.INTERNAL_TYPE_FLOAT || - internalType == ClassConstants.INTERNAL_TYPE_LONG || - internalType == ClassConstants.INTERNAL_TYPE_DOUBLE; + return internalType == ClassConstants.TYPE_BOOLEAN || + internalType == ClassConstants.TYPE_BYTE || + internalType == ClassConstants.TYPE_CHAR || + internalType == ClassConstants.TYPE_SHORT || + internalType == ClassConstants.TYPE_INT || + internalType == ClassConstants.TYPE_FLOAT || + internalType == ClassConstants.TYPE_LONG || + internalType == ClassConstants.TYPE_DOUBLE; } @@ -307,8 +310,8 @@ public class ClassUtil public static boolean isInternalCategory2Type(String internalType) { return internalType.length() == 1 && - (internalType.charAt(0) == ClassConstants.INTERNAL_TYPE_LONG || - internalType.charAt(0) == ClassConstants.INTERNAL_TYPE_DOUBLE); + (internalType.charAt(0) == ClassConstants.TYPE_LONG || + internalType.charAt(0) == ClassConstants.TYPE_DOUBLE); } @@ -324,8 +327,8 @@ public class ClassUtil { int length = internalType.length(); return length > 1 && -// internalType.charAt(0) == ClassConstants.INTERNAL_TYPE_CLASS_START && - internalType.charAt(length-1) == ClassConstants.INTERNAL_TYPE_CLASS_END; +// internalType.charAt(0) == ClassConstants.TYPE_CLASS_START && + internalType.charAt(length-1) == ClassConstants.TYPE_CLASS_END; } @@ -359,12 +362,12 @@ public class ClassUtil for (int dimension = 0; dimension < dimensionCount; dimension++) { - buffer.append(ClassConstants.INTERNAL_TYPE_ARRAY); + buffer.append(ClassConstants.TYPE_ARRAY); } - return buffer.append(ClassConstants.INTERNAL_TYPE_CLASS_START) + return buffer.append(ClassConstants.TYPE_CLASS_START) .append(internalClassName) - .append(ClassConstants.INTERNAL_TYPE_CLASS_END) + .append(ClassConstants.TYPE_CLASS_END) .toString(); } @@ -380,7 +383,7 @@ public class ClassUtil */ public static String internalTypeFromArrayType(String internalArrayType) { - int index = internalArrayType.lastIndexOf(ClassConstants.INTERNAL_TYPE_ARRAY); + int index = internalArrayType.lastIndexOf(ClassConstants.TYPE_ARRAY); return internalArrayType.substring(index+1); } @@ -399,7 +402,7 @@ public class ClassUtil public static String internalClassNameFromClassType(String internalClassType) { return isInternalClassType(internalClassType) ? - internalClassType.substring(internalClassType.indexOf(ClassConstants.INTERNAL_TYPE_CLASS_START)+1, + internalClassType.substring(internalClassType.indexOf(ClassConstants.TYPE_CLASS_START)+1, internalClassType.length()-1) : internalClassType; } @@ -442,8 +445,8 @@ public class ClassUtil */ public static boolean isInitializer(String internalMethodName) { - return internalMethodName.equals(ClassConstants.INTERNAL_METHOD_NAME_CLINIT) || - internalMethodName.equals(ClassConstants.INTERNAL_METHOD_NAME_INIT); + return internalMethodName.equals(ClassConstants.METHOD_NAME_CLINIT) || + internalMethodName.equals(ClassConstants.METHOD_NAME_INIT); } @@ -456,7 +459,7 @@ public class ClassUtil */ public static String internalMethodReturnType(String internalMethodDescriptor) { - int index = internalMethodDescriptor.indexOf(ClassConstants.INTERNAL_METHOD_ARGUMENTS_CLOSE); + int index = internalMethodDescriptor.indexOf(ClassConstants.METHOD_ARGUMENTS_CLOSE); return internalMethodDescriptor.substring(index + 1); } @@ -470,18 +473,38 @@ public class ClassUtil */ public static int internalMethodParameterCount(String internalMethodDescriptor) { - InternalTypeEnumeration internalTypeEnumeration = - new InternalTypeEnumeration(internalMethodDescriptor); - int counter = 0; - while (internalTypeEnumeration.hasMoreTypes()) - { - internalTypeEnumeration.nextType(); + int index = 1; - counter++; + while (true) + { + char c = internalMethodDescriptor.charAt(index++); + switch (c) + { + case ClassConstants.TYPE_ARRAY: + { + // Just ignore all array characters. + break; + } + case ClassConstants.TYPE_CLASS_START: + { + counter++; + + // Skip the class name. + index = internalMethodDescriptor.indexOf(ClassConstants.TYPE_CLASS_END, index) + 1; + break; + } + default: + { + counter++; + break; + } + case ClassConstants.METHOD_ARGUMENTS_CLOSE: + { + return counter; + } + } } - - return counter; } @@ -516,7 +539,7 @@ public class ClassUtil int accessFlags) { return internalMethodParameterSize(internalMethodDescriptor, - (accessFlags & ClassConstants.INTERNAL_ACC_STATIC) != 0); + (accessFlags & ClassConstants.ACC_STATIC) != 0); } @@ -535,18 +558,53 @@ public class ClassUtil public static int internalMethodParameterSize(String internalMethodDescriptor, boolean isStatic) { - InternalTypeEnumeration internalTypeEnumeration = - new InternalTypeEnumeration(internalMethodDescriptor); + int size = isStatic ? 0 : 1; + int index = 1; - int size = isStatic ? 0 : 1; - while (internalTypeEnumeration.hasMoreTypes()) + while (true) { - String internalType = internalTypeEnumeration.nextType(); - - size += internalTypeSize(internalType); + char c = internalMethodDescriptor.charAt(index++); + switch (c) + { + case ClassConstants.TYPE_LONG: + case ClassConstants.TYPE_DOUBLE: + { + size += 2; + break; + } + case ClassConstants.TYPE_CLASS_START: + { + size++; + + // Skip the class name. + index = internalMethodDescriptor.indexOf(ClassConstants.TYPE_CLASS_END, index) + 1; + break; + } + case ClassConstants.TYPE_ARRAY: + { + size++; + + // Skip all array characters. + while ((c = internalMethodDescriptor.charAt(index++)) == ClassConstants.TYPE_ARRAY) {} + + if (c == ClassConstants.TYPE_CLASS_START) + { + // Skip the class type. + index = internalMethodDescriptor.indexOf(ClassConstants.TYPE_CLASS_END, index) + 1; + } + break; + } + default: + { + size++; + break; + } + case ClassConstants.METHOD_ARGUMENTS_CLOSE: + { + return size; + } + } } - - return size; } @@ -564,12 +622,12 @@ public class ClassUtil if (internalType.length() == 1) { char internalPrimitiveType = internalType.charAt(0); - if (internalPrimitiveType == ClassConstants.INTERNAL_TYPE_LONG || - internalPrimitiveType == ClassConstants.INTERNAL_TYPE_DOUBLE) + if (internalPrimitiveType == ClassConstants.TYPE_LONG || + internalPrimitiveType == ClassConstants.TYPE_DOUBLE) { return 2; } - else if (internalPrimitiveType == ClassConstants.INTERNAL_TYPE_VOID) + else if (internalPrimitiveType == ClassConstants.TYPE_VOID) { return 0; } @@ -594,43 +652,33 @@ public class ClassUtil int dimensionCount = externalArrayTypeDimensionCount(externalType); if (dimensionCount > 0) { - externalType = externalType.substring(0, externalType.length() - dimensionCount * ClassConstants.EXTERNAL_TYPE_ARRAY.length()); + externalType = externalType.substring(0, externalType.length() - dimensionCount * JavaConstants.TYPE_ARRAY.length()); } // Analyze the actual type part. char internalTypeChar = - externalType.equals(ClassConstants.EXTERNAL_TYPE_VOID ) ? - ClassConstants.INTERNAL_TYPE_VOID : - externalType.equals(ClassConstants.EXTERNAL_TYPE_BOOLEAN) ? - ClassConstants.INTERNAL_TYPE_BOOLEAN : - externalType.equals(ClassConstants.EXTERNAL_TYPE_BYTE ) ? - ClassConstants.INTERNAL_TYPE_BYTE : - externalType.equals(ClassConstants.EXTERNAL_TYPE_CHAR ) ? - ClassConstants.INTERNAL_TYPE_CHAR : - externalType.equals(ClassConstants.EXTERNAL_TYPE_SHORT ) ? - ClassConstants.INTERNAL_TYPE_SHORT : - externalType.equals(ClassConstants.EXTERNAL_TYPE_INT ) ? - ClassConstants.INTERNAL_TYPE_INT : - externalType.equals(ClassConstants.EXTERNAL_TYPE_FLOAT ) ? - ClassConstants.INTERNAL_TYPE_FLOAT : - externalType.equals(ClassConstants.EXTERNAL_TYPE_LONG ) ? - ClassConstants.INTERNAL_TYPE_LONG : - externalType.equals(ClassConstants.EXTERNAL_TYPE_DOUBLE ) ? - ClassConstants.INTERNAL_TYPE_DOUBLE : - externalType.equals("%" ) ? - '%' : - (char)0; + externalType.equals(JavaConstants.TYPE_VOID ) ? ClassConstants.TYPE_VOID : + externalType.equals(JavaConstants.TYPE_BOOLEAN) ? ClassConstants.TYPE_BOOLEAN : + externalType.equals(JavaConstants.TYPE_BYTE ) ? ClassConstants.TYPE_BYTE : + externalType.equals(JavaConstants.TYPE_CHAR ) ? ClassConstants.TYPE_CHAR : + externalType.equals(JavaConstants.TYPE_SHORT ) ? ClassConstants.TYPE_SHORT : + externalType.equals(JavaConstants.TYPE_INT ) ? ClassConstants.TYPE_INT : + externalType.equals(JavaConstants.TYPE_FLOAT ) ? ClassConstants.TYPE_FLOAT : + externalType.equals(JavaConstants.TYPE_LONG ) ? ClassConstants.TYPE_LONG : + externalType.equals(JavaConstants.TYPE_DOUBLE ) ? ClassConstants.TYPE_DOUBLE : + externalType.equals("%" ) ? '%' : + (char)0; String internalType = internalTypeChar != 0 ? String.valueOf(internalTypeChar) : - ClassConstants.INTERNAL_TYPE_CLASS_START + + ClassConstants.TYPE_CLASS_START + internalClassName(externalType) + - ClassConstants.INTERNAL_TYPE_CLASS_END; + ClassConstants.TYPE_CLASS_END; // Prepend the array part, if any. for (int count = 0; count < dimensionCount; count++) { - internalType = ClassConstants.INTERNAL_TYPE_ARRAY + internalType; + internalType = ClassConstants.TYPE_ARRAY + internalType; } return internalType; @@ -646,10 +694,10 @@ public class ClassUtil public static int externalArrayTypeDimensionCount(String externalType) { int dimensions = 0; - int length = ClassConstants.EXTERNAL_TYPE_ARRAY.length(); + int length = JavaConstants.TYPE_ARRAY.length(); int offset = externalType.length() - length; while (externalType.regionMatches(offset, - ClassConstants.EXTERNAL_TYPE_ARRAY, + JavaConstants.TYPE_ARRAY, 0, length)) { @@ -683,29 +731,18 @@ public class ClassUtil char internalTypeChar = internalType.charAt(0); String externalType = - internalTypeChar == ClassConstants.INTERNAL_TYPE_VOID ? - ClassConstants.EXTERNAL_TYPE_VOID : - internalTypeChar == ClassConstants.INTERNAL_TYPE_BOOLEAN ? - ClassConstants.EXTERNAL_TYPE_BOOLEAN : - internalTypeChar == ClassConstants.INTERNAL_TYPE_BYTE ? - ClassConstants.EXTERNAL_TYPE_BYTE : - internalTypeChar == ClassConstants.INTERNAL_TYPE_CHAR ? - ClassConstants.EXTERNAL_TYPE_CHAR : - internalTypeChar == ClassConstants.INTERNAL_TYPE_SHORT ? - ClassConstants.EXTERNAL_TYPE_SHORT : - internalTypeChar == ClassConstants.INTERNAL_TYPE_INT ? - ClassConstants.EXTERNAL_TYPE_INT : - internalTypeChar == ClassConstants.INTERNAL_TYPE_FLOAT ? - ClassConstants.EXTERNAL_TYPE_FLOAT : - internalTypeChar == ClassConstants.INTERNAL_TYPE_LONG ? - ClassConstants.EXTERNAL_TYPE_LONG : - internalTypeChar == ClassConstants.INTERNAL_TYPE_DOUBLE ? - ClassConstants.EXTERNAL_TYPE_DOUBLE : - internalTypeChar == '%' ? - "%" : - internalTypeChar == ClassConstants.INTERNAL_TYPE_CLASS_START ? - externalClassName(internalType.substring(1, internalType.indexOf(ClassConstants.INTERNAL_TYPE_CLASS_END))) : - null; + internalTypeChar == ClassConstants.TYPE_VOID ? JavaConstants.TYPE_VOID : + internalTypeChar == ClassConstants.TYPE_BOOLEAN ? JavaConstants.TYPE_BOOLEAN : + internalTypeChar == ClassConstants.TYPE_BYTE ? JavaConstants.TYPE_BYTE : + internalTypeChar == ClassConstants.TYPE_CHAR ? JavaConstants.TYPE_CHAR : + internalTypeChar == ClassConstants.TYPE_SHORT ? JavaConstants.TYPE_SHORT : + internalTypeChar == ClassConstants.TYPE_INT ? JavaConstants.TYPE_INT : + internalTypeChar == ClassConstants.TYPE_FLOAT ? JavaConstants.TYPE_FLOAT : + internalTypeChar == ClassConstants.TYPE_LONG ? JavaConstants.TYPE_LONG : + internalTypeChar == ClassConstants.TYPE_DOUBLE ? JavaConstants.TYPE_DOUBLE : + internalTypeChar == '%' ? "%" : + internalTypeChar == ClassConstants.TYPE_CLASS_START ? externalClassName(internalType.substring(1, internalType.indexOf(ClassConstants.TYPE_CLASS_END))) : + null; if (externalType == null) { @@ -715,7 +752,7 @@ public class ClassUtil // Append the array part, if any. for (int count = 0; count < dimensionCount; count++) { - externalType += ClassConstants.EXTERNAL_TYPE_ARRAY; + externalType += JavaConstants.TYPE_ARRAY; } return externalType; @@ -732,7 +769,7 @@ public class ClassUtil */ public static boolean isInternalMethodDescriptor(String internalDescriptor) { - return internalDescriptor.charAt(0) == ClassConstants.INTERNAL_METHOD_ARGUMENTS_OPEN; + return internalDescriptor.charAt(0) == ClassConstants.METHOD_ARGUMENTS_OPEN; } @@ -747,7 +784,7 @@ public class ClassUtil */ public static boolean isExternalMethodNameAndArguments(String externalMemberNameAndArguments) { - return externalMemberNameAndArguments.indexOf(ClassConstants.EXTERNAL_METHOD_ARGUMENTS_OPEN) > 0; + return externalMemberNameAndArguments.indexOf(JavaConstants.METHOD_ARGUMENTS_OPEN) > 0; } @@ -780,7 +817,7 @@ public class ClassUtil String externalMethodNameAndArguments) { StringBuffer internalMethodDescriptor = new StringBuffer(); - internalMethodDescriptor.append(ClassConstants.INTERNAL_METHOD_ARGUMENTS_OPEN); + internalMethodDescriptor.append(ClassConstants.METHOD_ARGUMENTS_OPEN); ExternalTypeEnumeration externalTypeEnumeration = new ExternalTypeEnumeration(externalMethodNameAndArguments); @@ -790,7 +827,7 @@ public class ClassUtil internalMethodDescriptor.append(internalType(externalTypeEnumeration.nextType())); } - internalMethodDescriptor.append(ClassConstants.INTERNAL_METHOD_ARGUMENTS_CLOSE); + internalMethodDescriptor.append(ClassConstants.METHOD_ARGUMENTS_CLOSE); internalMethodDescriptor.append(internalType(externalReturnType)); return internalMethodDescriptor.toString(); @@ -811,14 +848,14 @@ public class ClassUtil List externalArguments) { StringBuffer internalMethodDescriptor = new StringBuffer(); - internalMethodDescriptor.append(ClassConstants.INTERNAL_METHOD_ARGUMENTS_OPEN); + internalMethodDescriptor.append(ClassConstants.METHOD_ARGUMENTS_OPEN); for (int index = 0; index < externalArguments.size(); index++) { internalMethodDescriptor.append(internalType((String)externalArguments.get(index))); } - internalMethodDescriptor.append(ClassConstants.INTERNAL_METHOD_ARGUMENTS_CLOSE); + internalMethodDescriptor.append(ClassConstants.METHOD_ARGUMENTS_CLOSE); internalMethodDescriptor.append(internalType(externalReturnType)); return internalMethodDescriptor.toString(); @@ -869,9 +906,9 @@ public class ClassUtil externalMethodReturnTypeAndName(internalClassName, internalMethodName, internalMethodDescriptor) + - ClassConstants.EXTERNAL_METHOD_ARGUMENTS_OPEN + + JavaConstants.METHOD_ARGUMENTS_OPEN + externalMethodArguments(internalMethodDescriptor) + - ClassConstants.EXTERNAL_METHOD_ARGUMENTS_CLOSE; + JavaConstants.METHOD_ARGUMENTS_CLOSE; } @@ -903,48 +940,48 @@ public class ClassUtil StringBuffer string = new StringBuffer(50); - if ((accessFlags & ClassConstants.INTERNAL_ACC_PUBLIC) != 0) + if ((accessFlags & ClassConstants.ACC_PUBLIC) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_PUBLIC).append(' '); + string.append(prefix).append(JavaConstants.ACC_PUBLIC).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_PRIVATE) != 0) + if ((accessFlags & ClassConstants.ACC_PRIVATE) != 0) { // Only in InnerClasses attributes. - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_PRIVATE).append(' '); + string.append(prefix).append(JavaConstants.ACC_PRIVATE).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_PROTECTED) != 0) + if ((accessFlags & ClassConstants.ACC_PROTECTED) != 0) { // Only in InnerClasses attributes. - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_PROTECTED).append(' '); + string.append(prefix).append(JavaConstants.ACC_PROTECTED).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_STATIC) != 0) + if ((accessFlags & ClassConstants.ACC_STATIC) != 0) { // Only in InnerClasses attributes. - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_STATIC).append(' '); + string.append(prefix).append(JavaConstants.ACC_STATIC).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_FINAL) != 0) + if ((accessFlags & ClassConstants.ACC_FINAL) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_FINAL).append(' '); + string.append(prefix).append(JavaConstants.ACC_FINAL).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_ANNOTATTION) != 0) + if ((accessFlags & ClassConstants.ACC_ANNOTATTION) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_ANNOTATION); + string.append(prefix).append(JavaConstants.ACC_ANNOTATION); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_INTERFACE) != 0) + if ((accessFlags & ClassConstants.ACC_INTERFACE) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_INTERFACE).append(' '); + string.append(prefix).append(JavaConstants.ACC_INTERFACE).append(' '); } - else if ((accessFlags & ClassConstants.INTERNAL_ACC_ENUM) != 0) + else if ((accessFlags & ClassConstants.ACC_ENUM) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_ENUM).append(' '); + string.append(prefix).append(JavaConstants.ACC_ENUM).append(' '); } - else if ((accessFlags & ClassConstants.INTERNAL_ACC_ABSTRACT) != 0) + else if ((accessFlags & ClassConstants.ACC_ABSTRACT) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_ABSTRACT).append(' '); + string.append(prefix).append(JavaConstants.ACC_ABSTRACT).append(' '); } - else if ((accessFlags & ClassConstants.INTERNAL_ACC_SYNTHETIC) != 0) + else if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_SYNTHETIC).append(' '); + string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' '); } return string.toString(); @@ -979,37 +1016,37 @@ public class ClassUtil StringBuffer string = new StringBuffer(50); - if ((accessFlags & ClassConstants.INTERNAL_ACC_PUBLIC) != 0) + if ((accessFlags & ClassConstants.ACC_PUBLIC) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_PUBLIC).append(' '); + string.append(prefix).append(JavaConstants.ACC_PUBLIC).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_PRIVATE) != 0) + if ((accessFlags & ClassConstants.ACC_PRIVATE) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_PRIVATE).append(' '); + string.append(prefix).append(JavaConstants.ACC_PRIVATE).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_PROTECTED) != 0) + if ((accessFlags & ClassConstants.ACC_PROTECTED) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_PROTECTED).append(' '); + string.append(prefix).append(JavaConstants.ACC_PROTECTED).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_STATIC) != 0) + if ((accessFlags & ClassConstants.ACC_STATIC) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_STATIC).append(' '); + string.append(prefix).append(JavaConstants.ACC_STATIC).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_FINAL) != 0) + if ((accessFlags & ClassConstants.ACC_FINAL) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_FINAL).append(' '); + string.append(prefix).append(JavaConstants.ACC_FINAL).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_VOLATILE) != 0) + if ((accessFlags & ClassConstants.ACC_VOLATILE) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_VOLATILE).append(' '); + string.append(prefix).append(JavaConstants.ACC_VOLATILE).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_TRANSIENT) != 0) + if ((accessFlags & ClassConstants.ACC_TRANSIENT) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_TRANSIENT).append(' '); + string.append(prefix).append(JavaConstants.ACC_TRANSIENT).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_SYNTHETIC) != 0) + if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_SYNTHETIC).append(' '); + string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' '); } return string.toString(); @@ -1044,53 +1081,100 @@ public class ClassUtil StringBuffer string = new StringBuffer(50); - if ((accessFlags & ClassConstants.INTERNAL_ACC_PUBLIC) != 0) + if ((accessFlags & ClassConstants.ACC_PUBLIC) != 0) + { + string.append(prefix).append(JavaConstants.ACC_PUBLIC).append(' '); + } + if ((accessFlags & ClassConstants.ACC_PRIVATE) != 0) + { + string.append(prefix).append(JavaConstants.ACC_PRIVATE).append(' '); + } + if ((accessFlags & ClassConstants.ACC_PROTECTED) != 0) + { + string.append(prefix).append(JavaConstants.ACC_PROTECTED).append(' '); + } + if ((accessFlags & ClassConstants.ACC_STATIC) != 0) + { + string.append(prefix).append(JavaConstants.ACC_STATIC).append(' '); + } + if ((accessFlags & ClassConstants.ACC_FINAL) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_PUBLIC).append(' '); + string.append(prefix).append(JavaConstants.ACC_FINAL).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_PRIVATE) != 0) + if ((accessFlags & ClassConstants.ACC_SYNCHRONIZED) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_PRIVATE).append(' '); + string.append(prefix).append(JavaConstants.ACC_SYNCHRONIZED).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_PROTECTED) != 0) + if ((accessFlags & ClassConstants.ACC_BRIDGE) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_PROTECTED).append(' '); + string.append(prefix).append(JavaConstants.ACC_BRIDGE).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_STATIC) != 0) + if ((accessFlags & ClassConstants.ACC_VARARGS) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_STATIC).append(' '); + string.append(prefix).append(JavaConstants.ACC_VARARGS).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_FINAL) != 0) + if ((accessFlags & ClassConstants.ACC_NATIVE) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_FINAL).append(' '); + string.append(prefix).append(JavaConstants.ACC_NATIVE).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_SYNCHRONIZED) != 0) + if ((accessFlags & ClassConstants.ACC_ABSTRACT) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_SYNCHRONIZED).append(' '); + string.append(prefix).append(JavaConstants.ACC_ABSTRACT).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_BRIDGE) != 0) + if ((accessFlags & ClassConstants.ACC_STRICT) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_BRIDGE).append(' '); + string.append(prefix).append(JavaConstants.ACC_STRICT).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_VARARGS) != 0) + if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_VARARGS).append(' '); + string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_NATIVE) != 0) + + return string.toString(); + } + + + /** + * Converts internal method parameter access flags into an external access + * description. + * @param accessFlags the method parameter access flags. + * @return the external method parameter access description, + * e.g. "<code>final mandated </code>". + */ + public static String externalParameterAccessFlags(int accessFlags) + { + return externalParameterAccessFlags(accessFlags, ""); + } + + + /** + * Converts internal method parameter access flags into an external access + * description. + * @param accessFlags the method parameter access flags. + * @param prefix a prefix that is added to each access modifier. + * @return the external method parameter access description, + * e.g. "final mandated ". + */ + public static String externalParameterAccessFlags(int accessFlags, String prefix) + { + if (accessFlags == 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_NATIVE).append(' '); + return EMPTY_STRING; } - if ((accessFlags & ClassConstants.INTERNAL_ACC_ABSTRACT) != 0) + + StringBuffer string = new StringBuffer(50); + + if ((accessFlags & ClassConstants.ACC_FINAL) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_ABSTRACT).append(' '); + string.append(prefix).append(JavaConstants.ACC_FINAL).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_STRICT) != 0) + if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_STRICT).append(' '); + string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_SYNTHETIC) != 0) + if ((accessFlags & ClassConstants.ACC_MANDATED) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_SYNTHETIC).append(' '); + string.append(prefix).append(JavaConstants.ACC_MANDATED).append(' '); } return string.toString(); @@ -1128,7 +1212,7 @@ public class ClassUtil String internalMethodName, String internalMethodDescriptor) { - return internalMethodName.equals(ClassConstants.INTERNAL_METHOD_NAME_INIT) ? + return internalMethodName.equals(ClassConstants.METHOD_NAME_INIT) ? externalShortClassName(externalClassName(internalClassName)) : (externalMethodReturnType(internalMethodDescriptor) + ' ' + @@ -1156,7 +1240,7 @@ public class ClassUtil externalMethodNameAndArguments.append(externalType(internalTypeEnumeration.nextType())); if (internalTypeEnumeration.hasMoreTypes()) { - externalMethodNameAndArguments.append(ClassConstants.EXTERNAL_METHOD_ARGUMENTS_SEPARATOR); + externalMethodNameAndArguments.append(JavaConstants.METHOD_ARGUMENTS_SEPARATOR); } } @@ -1190,7 +1274,7 @@ public class ClassUtil */ public static String internalPackagePrefix(String internalClassName) { - return internalClassName.substring(0, internalClassName.lastIndexOf(ClassConstants.INTERNAL_PACKAGE_SEPARATOR, + return internalClassName.substring(0, internalClassName.lastIndexOf(ClassConstants.PACKAGE_SEPARATOR, internalClassName.length() - 2) + 1); } @@ -1221,7 +1305,7 @@ public class ClassUtil */ public static String externalPackagePrefix(String externalClassName) { - return externalClassName.substring(0, externalClassName.lastIndexOf(ClassConstants.EXTERNAL_PACKAGE_SEPARATOR, + return externalClassName.substring(0, externalClassName.lastIndexOf(JavaConstants.PACKAGE_SEPARATOR, externalClassName.length() - 2) + 1); } } diff --git a/src/proguard/classfile/util/DescriptorClassEnumeration.java b/src/proguard/classfile/util/DescriptorClassEnumeration.java index 81590fa..b15d470 100644 --- a/src/proguard/classfile/util/DescriptorClassEnumeration.java +++ b/src/proguard/classfile/util/DescriptorClassEnumeration.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2014 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 @@ -20,7 +20,7 @@ */ package proguard.classfile.util; -import proguard.classfile.ClassConstants; +import proguard.classfile.*; import java.util.Stack; @@ -58,6 +58,8 @@ public class DescriptorClassEnumeration { int count = 0; + reset(); + nextFluff(); while (hasMoreClassNames()) { @@ -67,13 +69,26 @@ public class DescriptorClassEnumeration nextFluff(); } - index = 0; + reset(); return count; } /** + * Resets the enumeration. + */ + private void reset() + { + index = 0; + nestingLevel = 0; + isInnerClassName = false; + accumulatedClassName = null; + accumulatedClassNames = null; + } + + + /** * Returns whether the enumeration can provide more class names from the * descriptor. */ @@ -95,7 +110,7 @@ public class DescriptorClassEnumeration { switch (descriptor.charAt(index++)) { - case ClassConstants.INTERNAL_TYPE_GENERIC_START: + case ClassConstants.TYPE_GENERIC_START: { nestingLevel++; @@ -110,7 +125,7 @@ public class DescriptorClassEnumeration break; } - case ClassConstants.INTERNAL_TYPE_GENERIC_END: + case ClassConstants.TYPE_GENERIC_END: { nestingLevel--; @@ -120,42 +135,42 @@ public class DescriptorClassEnumeration continue loop; } - case ClassConstants.INTERNAL_TYPE_GENERIC_BOUND: + case ClassConstants.TYPE_GENERIC_BOUND: { continue loop; } - case ClassConstants.INTERNAL_TYPE_CLASS_START: + case ClassConstants.TYPE_CLASS_START: { // We've found the start of an ordinary class name. nestingLevel += 2; isInnerClassName = false; break loop; } - case ClassConstants.INTERNAL_TYPE_CLASS_END: + case ClassConstants.TYPE_CLASS_END: { nestingLevel -= 2; break; } - case ClassConstants.EXTERNAL_INNER_CLASS_SEPARATOR: + case JavaConstants.INNER_CLASS_SEPARATOR: { // We've found the start of an inner class name in a signature. isInnerClassName = true; break loop; } - case ClassConstants.INTERNAL_TYPE_GENERIC_VARIABLE_START: + case ClassConstants.TYPE_GENERIC_VARIABLE_START: { // We've found the start of a type identifier. Skip to the end. - while (descriptor.charAt(index++) != ClassConstants.INTERNAL_TYPE_CLASS_END); + while (descriptor.charAt(index++) != ClassConstants.TYPE_CLASS_END); break; } } if (nestingLevel == 1 && - descriptor.charAt(index) != ClassConstants.INTERNAL_TYPE_GENERIC_END) + descriptor.charAt(index) != ClassConstants.TYPE_GENERIC_END) { // We're at the start of a type parameter. Skip to the start // of the bounds. - while (descriptor.charAt(index++) != ClassConstants.INTERNAL_TYPE_GENERIC_BOUND); + while (descriptor.charAt(index++) != ClassConstants.TYPE_GENERIC_BOUND); } } @@ -175,9 +190,9 @@ public class DescriptorClassEnumeration { switch (descriptor.charAt(index)) { - case ClassConstants.INTERNAL_TYPE_GENERIC_START: - case ClassConstants.INTERNAL_TYPE_CLASS_END: - case ClassConstants.EXTERNAL_INNER_CLASS_SEPARATOR: + case ClassConstants.TYPE_GENERIC_START: + case ClassConstants.TYPE_CLASS_END: + case JavaConstants.INNER_CLASS_SEPARATOR: { break loop; } @@ -190,7 +205,7 @@ public class DescriptorClassEnumeration // Recompose the inner class name if necessary. accumulatedClassName = isInnerClassName ? - accumulatedClassName + ClassConstants.INTERNAL_INNER_CLASS_SEPARATOR + className : + accumulatedClassName + ClassConstants.INNER_CLASS_SEPARATOR + className : className; return accumulatedClassName; diff --git a/src/proguard/classfile/util/DynamicClassReferenceInitializer.java b/src/proguard/classfile/util/DynamicClassReferenceInitializer.java index 865e094..413d885 100644 --- a/src/proguard/classfile/util/DynamicClassReferenceInitializer.java +++ b/src/proguard/classfile/util/DynamicClassReferenceInitializer.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2014 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 @@ -66,21 +66,21 @@ implements InstructionVisitor, new MethodrefConstant(1, 2, null, null), new ClassConstant(3, null), new NameAndTypeConstant(4, 5), - new Utf8Constant(ClassConstants.INTERNAL_NAME_JAVA_LANG_CLASS), - new Utf8Constant(ClassConstants.INTERNAL_METHOD_NAME_CLASS_FOR_NAME), - new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_CLASS_FOR_NAME), + new Utf8Constant(ClassConstants.NAME_JAVA_LANG_CLASS), + new Utf8Constant(ClassConstants.METHOD_NAME_CLASS_FOR_NAME), + new Utf8Constant(ClassConstants.METHOD_TYPE_CLASS_FOR_NAME), // 6 new MethodrefConstant(1, 7, null, null), new NameAndTypeConstant(8, 9), - new Utf8Constant(ClassConstants.INTERNAL_METHOD_NAME_NEW_INSTANCE), - new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_NEW_INSTANCE), + new Utf8Constant(ClassConstants.METHOD_NAME_NEW_INSTANCE), + new Utf8Constant(ClassConstants.METHOD_TYPE_NEW_INSTANCE), // 10 new MethodrefConstant(1, 11, null, null), new NameAndTypeConstant(12, 13), - new Utf8Constant(ClassConstants.INTERNAL_METHOD_NAME_CLASS_GET_COMPONENT_TYPE), - new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_CLASS_GET_COMPONENT_TYPE), + new Utf8Constant(ClassConstants.METHOD_NAME_CLASS_GET_COMPONENT_TYPE), + new Utf8Constant(ClassConstants.METHOD_TYPE_CLASS_GET_COMPONENT_TYPE), }; // Class.forName("SomeClass"). @@ -103,15 +103,15 @@ implements InstructionVisitor, // { // new MethodrefConstant(A, 1, null, null), // new NameAndTypeConstant(2, 3), -// new Utf8Constant(ClassConstants.INTERNAL_METHOD_NAME_DOT_CLASS_JAVAC), -// new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_DOT_CLASS_JAVAC), +// new Utf8Constant(ClassConstants.METHOD_NAME_DOT_CLASS_JAVAC), +// new Utf8Constant(ClassConstants.METHOD_TYPE_DOT_CLASS_JAVAC), // }; private final Constant[] DOT_CLASS_JAVAC_CONSTANTS = new Constant[] { new MethodrefConstant(A, 1, null, null), new NameAndTypeConstant(B, 2), - new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_DOT_CLASS_JAVAC), + new Utf8Constant(ClassConstants.METHOD_TYPE_DOT_CLASS_JAVAC), }; // SomeClass.class = class$("SomeClass") (javac). @@ -126,15 +126,15 @@ implements InstructionVisitor, // { // new MethodrefConstant(A, 1, null, null), // new NameAndTypeConstant(2, 3), -// new Utf8Constant(ClassConstants.INTERNAL_METHOD_NAME_DOT_CLASS_JIKES), -// new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_DOT_CLASS_JIKES), +// new Utf8Constant(ClassConstants.METHOD_NAME_DOT_CLASS_JIKES), +// new Utf8Constant(ClassConstants.METHOD_TYPE_DOT_CLASS_JIKES), // }; private final Constant[] DOT_CLASS_JIKES_CONSTANTS = new Constant[] { new MethodrefConstant(A, 1, null, null), new NameAndTypeConstant(B, 2), - new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_DOT_CLASS_JIKES), + new Utf8Constant(ClassConstants.METHOD_TYPE_DOT_CLASS_JIKES), }; // SomeClass.class = class("SomeClass", false) (jikes). @@ -240,6 +240,19 @@ implements InstructionVisitor, public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) { + // Try to match the (SomeClass)Class.forName(someName).newInstance() + // construct. Apply this matcher first, so the next matcher can still + // reset it after the first instruction. + instruction.accept(clazz, method, codeAttribute, offset, + classForNameCastMatcher); + + // Did we find a match? + if (classForNameCastMatcher.isMatching()) + { + // Print out a note about the construct. + clazz.constantPoolEntryAccept(classForNameCastMatcher.matchedConstantIndex(X), this); + } + // Try to match the Class.forName("SomeClass") construct. instruction.accept(clazz, method, codeAttribute, offset, constantClassForNameMatcher); @@ -254,18 +267,6 @@ implements InstructionVisitor, classForNameCastMatcher.reset(); } - // Try to match the (SomeClass)Class.forName(someName).newInstance() - // construct. - instruction.accept(clazz, method, codeAttribute, offset, - classForNameCastMatcher); - - // Did we find a match? - if (classForNameCastMatcher.isMatching()) - { - // Print out a note about the construct. - clazz.constantPoolEntryAccept(classForNameCastMatcher.matchedConstantIndex(X), this); - } - // Try to match the javac .class construct. instruction.accept(clazz, method, codeAttribute, offset, dotClassJavacMatcher); @@ -336,15 +337,15 @@ implements InstructionVisitor, String methodType = methodrefConstant.getType(clazz); // Do the method's class and type match? - if (methodType.equals(ClassConstants.INTERNAL_METHOD_TYPE_DOT_CLASS_JAVAC) || - methodType.equals(ClassConstants.INTERNAL_METHOD_TYPE_DOT_CLASS_JIKES)) + if (methodType.equals(ClassConstants.METHOD_TYPE_DOT_CLASS_JAVAC) || + methodType.equals(ClassConstants.METHOD_TYPE_DOT_CLASS_JIKES)) { String methodName = methodrefConstant.getName(clazz); // Does the method's name match one of the special names? isClassForNameInvocation = - methodName.equals(ClassConstants.INTERNAL_METHOD_NAME_DOT_CLASS_JAVAC) || - methodName.equals(ClassConstants.INTERNAL_METHOD_NAME_DOT_CLASS_JIKES); + methodName.equals(ClassConstants.METHOD_NAME_DOT_CLASS_JAVAC) || + methodName.equals(ClassConstants.METHOD_NAME_DOT_CLASS_JIKES); if (isClassForNameInvocation) { diff --git a/src/proguard/classfile/util/DynamicMemberReferenceInitializer.java b/src/proguard/classfile/util/DynamicMemberReferenceInitializer.java index 23c8d40..e35063c 100644 --- a/src/proguard/classfile/util/DynamicMemberReferenceInitializer.java +++ b/src/proguard/classfile/util/DynamicMemberReferenceInitializer.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2014 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 @@ -22,7 +22,6 @@ package proguard.classfile.util; import proguard.classfile.*; import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.visitor.AttributeVisitor; import proguard.classfile.constant.*; import proguard.classfile.constant.visitor.ConstantVisitor; import proguard.classfile.instruction.*; @@ -54,10 +53,10 @@ implements InstructionVisitor, ConstantVisitor, MemberVisitor { - /* - private static boolean DEBUG = true; - /*/ + //* private static final boolean DEBUG = false; + /*/ + private static boolean DEBUG = true; //*/ public static final int CLASS_INDEX = InstructionSequenceMatcher.X; @@ -75,9 +74,9 @@ implements InstructionVisitor, new MethodrefConstant(1, 2, null, null), new ClassConstant(3, null), new NameAndTypeConstant(4, 5), - new Utf8Constant(ClassConstants.INTERNAL_NAME_JAVA_LANG_CLASS), - new Utf8Constant(ClassConstants.INTERNAL_METHOD_NAME_CLASS_GET_FIELD), - new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_CLASS_GET_FIELD), + new Utf8Constant(ClassConstants.NAME_JAVA_LANG_CLASS), + new Utf8Constant(ClassConstants.METHOD_NAME_CLASS_GET_FIELD), + new Utf8Constant(ClassConstants.METHOD_TYPE_CLASS_GET_FIELD), }; private final Constant[] GET_DECLARED_FIELD_CONSTANTS = new Constant[] @@ -85,9 +84,9 @@ implements InstructionVisitor, new MethodrefConstant(1, 2, null, null), new ClassConstant(3, null), new NameAndTypeConstant(4, 5), - new Utf8Constant(ClassConstants.INTERNAL_NAME_JAVA_LANG_CLASS), - new Utf8Constant(ClassConstants.INTERNAL_METHOD_NAME_CLASS_GET_DECLARED_FIELD), - new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_CLASS_GET_DECLARED_FIELD), + new Utf8Constant(ClassConstants.NAME_JAVA_LANG_CLASS), + new Utf8Constant(ClassConstants.METHOD_NAME_CLASS_GET_DECLARED_FIELD), + new Utf8Constant(ClassConstants.METHOD_TYPE_CLASS_GET_DECLARED_FIELD), }; private final Constant[] GET_CONSTRUCTOR_CONSTANTS = new Constant[] @@ -95,9 +94,9 @@ implements InstructionVisitor, new MethodrefConstant(1, 2, null, null), new ClassConstant(3, null), new NameAndTypeConstant(4, 5), - new Utf8Constant(ClassConstants.INTERNAL_NAME_JAVA_LANG_CLASS), - new Utf8Constant(ClassConstants.INTERNAL_CONSTRUCTOR_NAME_CLASS_GET_CONSTRUCTOR), - new Utf8Constant(ClassConstants.INTERNAL_CONSTRUCTOR_TYPE_CLASS_GET_CONSTRUCTOR), + new Utf8Constant(ClassConstants.NAME_JAVA_LANG_CLASS), + new Utf8Constant(ClassConstants.CONSTRUCTOR_NAME_CLASS_GET_CONSTRUCTOR), + new Utf8Constant(ClassConstants.CONSTRUCTOR_TYPE_CLASS_GET_CONSTRUCTOR), }; private final Constant[] GET_DECLARED_CONSTRUCTOR_CONSTANTS = new Constant[] @@ -105,9 +104,9 @@ implements InstructionVisitor, new MethodrefConstant(1, 2, null, null), new ClassConstant(3, null), new NameAndTypeConstant(4, 5), - new Utf8Constant(ClassConstants.INTERNAL_NAME_JAVA_LANG_CLASS), - new Utf8Constant(ClassConstants.INTERNAL_CONSTRUCTOR_NAME_CLASS_GET_DECLARED_CONSTRUCTOR), - new Utf8Constant(ClassConstants.INTERNAL_CONSTRUCTOR_TYPE_CLASS_GET_DECLARED_CONSTRUCTOR), + new Utf8Constant(ClassConstants.NAME_JAVA_LANG_CLASS), + new Utf8Constant(ClassConstants.CONSTRUCTOR_NAME_CLASS_GET_DECLARED_CONSTRUCTOR), + new Utf8Constant(ClassConstants.CONSTRUCTOR_TYPE_CLASS_GET_DECLARED_CONSTRUCTOR), }; private final Constant[] GET_METHOD_CONSTANTS = new Constant[] @@ -115,9 +114,9 @@ implements InstructionVisitor, new MethodrefConstant(1, 2, null, null), new ClassConstant(3, null), new NameAndTypeConstant(4, 5), - new Utf8Constant(ClassConstants.INTERNAL_NAME_JAVA_LANG_CLASS), - new Utf8Constant(ClassConstants.INTERNAL_METHOD_NAME_CLASS_GET_METHOD), - new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_CLASS_GET_METHOD), + new Utf8Constant(ClassConstants.NAME_JAVA_LANG_CLASS), + new Utf8Constant(ClassConstants.METHOD_NAME_CLASS_GET_METHOD), + new Utf8Constant(ClassConstants.METHOD_TYPE_CLASS_GET_METHOD), }; private final Constant[] GET_DECLARED_METHOD_CONSTANTS = new Constant[] @@ -125,9 +124,9 @@ implements InstructionVisitor, new MethodrefConstant(1, 2, null, null), new ClassConstant(3, null), new NameAndTypeConstant(4, 5), - new Utf8Constant(ClassConstants.INTERNAL_NAME_JAVA_LANG_CLASS), - new Utf8Constant(ClassConstants.INTERNAL_METHOD_NAME_CLASS_GET_DECLARED_METHOD), - new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_CLASS_GET_DECLARED_METHOD), + new Utf8Constant(ClassConstants.NAME_JAVA_LANG_CLASS), + new Utf8Constant(ClassConstants.METHOD_NAME_CLASS_GET_DECLARED_METHOD), + new Utf8Constant(ClassConstants.METHOD_TYPE_CLASS_GET_DECLARED_METHOD), }; private final Constant[] NEW_INTEGER_UPDATER_CONSTANTS = new Constant[] @@ -135,9 +134,9 @@ implements InstructionVisitor, new MethodrefConstant(1, 2, null, null), new ClassConstant(3, null), new NameAndTypeConstant(4, 5), - new Utf8Constant(ClassConstants.INTERNAL_NAME_JAVA_UTIL_CONCURRENT_ATOMIC_ATOMIC_INTEGER_FIELD_UPDATER), - new Utf8Constant(ClassConstants.INTERNAL_METHOD_NAME_NEW_UPDATER), - new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_NEW_INTEGER_UPDATER), + new Utf8Constant(ClassConstants.NAME_JAVA_UTIL_CONCURRENT_ATOMIC_ATOMIC_INTEGER_FIELD_UPDATER), + new Utf8Constant(ClassConstants.METHOD_NAME_NEW_UPDATER), + new Utf8Constant(ClassConstants.METHOD_TYPE_NEW_INTEGER_UPDATER), }; private final Constant[] NEW_LONG_UPDATER_CONSTANTS = new Constant[] @@ -145,9 +144,9 @@ implements InstructionVisitor, new MethodrefConstant(1, 2, null, null), new ClassConstant(3, null), new NameAndTypeConstant(4, 5), - new Utf8Constant(ClassConstants.INTERNAL_NAME_JAVA_UTIL_CONCURRENT_ATOMIC_ATOMIC_LONG_FIELD_UPDATER), - new Utf8Constant(ClassConstants.INTERNAL_METHOD_NAME_NEW_UPDATER), - new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_NEW_LONG_UPDATER), + new Utf8Constant(ClassConstants.NAME_JAVA_UTIL_CONCURRENT_ATOMIC_ATOMIC_LONG_FIELD_UPDATER), + new Utf8Constant(ClassConstants.METHOD_NAME_NEW_UPDATER), + new Utf8Constant(ClassConstants.METHOD_TYPE_NEW_LONG_UPDATER), }; private final Constant[] NEW_REFERENCE_UPDATER_CONSTANTS = new Constant[] @@ -155,9 +154,9 @@ implements InstructionVisitor, new MethodrefConstant(1, 2, null, null), new ClassConstant(3, null), new NameAndTypeConstant(4, 5), - new Utf8Constant(ClassConstants.INTERNAL_NAME_JAVA_UTIL_CONCURRENT_ATOMIC_ATOMIC_REFERENCE_FIELD_UPDATER), - new Utf8Constant(ClassConstants.INTERNAL_METHOD_NAME_NEW_UPDATER), - new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_NEW_REFERENCE_UPDATER), + new Utf8Constant(ClassConstants.NAME_JAVA_UTIL_CONCURRENT_ATOMIC_ATOMIC_REFERENCE_FIELD_UPDATER), + new Utf8Constant(ClassConstants.METHOD_NAME_NEW_UPDATER), + new Utf8Constant(ClassConstants.METHOD_TYPE_NEW_REFERENCE_UPDATER), }; // SomeClass.class.get[Declared]Field("someField"). @@ -549,42 +548,42 @@ implements InstructionVisitor, // matchGetMember(clazz, method, codeAttribute, offset, instruction, // cnull, //onstantGetConstructorMatcher0, // getConstructorMatcher0, false, false, -// ClassConstants.INTERNAL_METHOD_NAME_INIT, null); +// ClassConstants.METHOD_NAME_INIT, null); // // // Try to match the SomeClass.class.getDeclaredConstructor(new Class[] // // {}) construct. // matchGetMember(clazz, method, codeAttribute, offset, instruction, // null, //constantGetDeclaredConstructorMatcher0, // getDeclaredConstructorMatcher0, false, true, -// ClassConstants.INTERNAL_METHOD_NAME_INIT, null); +// ClassConstants.METHOD_NAME_INIT, null); // Try to match the SomeClass.class.getConstructor(new Class[] // { A.class }) construct. matchGetMember(clazz, method, codeAttribute, offset, instruction, null, //constantGetConstructorMatcher1, getConstructorMatcher1, false, false, - ClassConstants.INTERNAL_METHOD_NAME_INIT, null); + ClassConstants.METHOD_NAME_INIT, null); // Try to match the SomeClass.class.getDeclaredConstructor(new Class[] // { A.class }) construct. matchGetMember(clazz, method, codeAttribute, offset, instruction, null, //constantGetDeclaredConstructorMatcher1, getDeclaredConstructorMatcher1, false, true, - ClassConstants.INTERNAL_METHOD_NAME_INIT, null); + ClassConstants.METHOD_NAME_INIT, null); // Try to match the SomeClass.class.getConstructor(new Class[] // { A.class, B.class }) construct. matchGetMember(clazz, method, codeAttribute, offset, instruction, null, //constantGetConstructorMatcher2, getConstructorMatcher2, false, false, - ClassConstants.INTERNAL_METHOD_NAME_INIT, null); + ClassConstants.METHOD_NAME_INIT, null); // Try to match the SomeClass.class.getDeclaredConstructor(new Class[] // { A.class, B.class }) construct. matchGetMember(clazz, method, codeAttribute, offset, instruction, null, //constantGetDeclaredConstructorMatcher2, getDeclaredConstructorMatcher2, false, true, - ClassConstants.INTERNAL_METHOD_NAME_INIT, null); + ClassConstants.METHOD_NAME_INIT, null); // Try to match the SomeClass.class.getMethod("someMethod", new Class[] // {}) construct. @@ -627,14 +626,14 @@ implements InstructionVisitor, matchGetMember(clazz, method, codeAttribute, offset, instruction, constantGetIntegerUpdaterMatcher, getIntegerUpdaterMatcher, true, false, null, - "" + ClassConstants.INTERNAL_TYPE_INT); + "" + ClassConstants.TYPE_INT); // Try to match the AtomicLongFieldUpdater.newUpdater( // SomeClass.class, "someField") construct. matchGetMember(clazz, method, codeAttribute, offset, instruction, constantGetLongUpdaterMatcher, getLongUpdaterMatcher, true, false, null, - "" + ClassConstants.INTERNAL_TYPE_LONG); + "" + ClassConstants.TYPE_LONG); // Try to match the AtomicReferenceFieldUpdater.newUpdater( // SomeClass.class, SomeClass.class, "someField") construct. @@ -840,7 +839,7 @@ implements InstructionVisitor, " accesses a " + (isDeclared ? "declared " : "") + (isField ? "field" : - memberName.equals(ClassConstants.INTERNAL_METHOD_NAME_INIT) ? + memberName.equals(ClassConstants.METHOD_NAME_INIT) ? "constructor" : "method") + " '" + externalMemberDescription + diff --git a/src/proguard/classfile/util/EnumFieldReferenceInitializer.java b/src/proguard/classfile/util/EnumFieldReferenceInitializer.java index dae6db2..c856893 100644 --- a/src/proguard/classfile/util/EnumFieldReferenceInitializer.java +++ b/src/proguard/classfile/util/EnumFieldReferenceInitializer.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2014 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 @@ -24,13 +24,12 @@ import proguard.classfile.*; import proguard.classfile.attribute.CodeAttribute; import proguard.classfile.attribute.annotation.*; import proguard.classfile.attribute.annotation.visitor.ElementValueVisitor; -import proguard.classfile.attribute.visitor.*; +import proguard.classfile.attribute.visitor.AllAttributeVisitor; import proguard.classfile.constant.*; import proguard.classfile.constant.visitor.ConstantVisitor; import proguard.classfile.instruction.*; import proguard.classfile.instruction.visitor.*; -import proguard.classfile.visitor.*; -import proguard.util.StringMatcher; +import proguard.classfile.visitor.MemberVisitor; /** * This ElementValueVisitor initializes the field references of the @@ -44,10 +43,10 @@ implements ElementValueVisitor, InstructionVisitor, ConstantVisitor { - /* - private static boolean DEBUG = true; - /*/ + //* private static final boolean DEBUG = false; + /*/ + private static boolean DEBUG = true; //*/ private MemberVisitor enumFieldFinder = new AllAttributeVisitor( @@ -80,8 +79,8 @@ implements ElementValueVisitor, enumTypeName = enumConstantElementValue.getTypeName(clazz); enumConstantName = enumConstantElementValue.getConstantName(clazz); referencedEnumField = null; - referencedEnumClass.methodAccept(ClassConstants.INTERNAL_METHOD_NAME_CLINIT, - ClassConstants.INTERNAL_METHOD_TYPE_CLINIT, + referencedEnumClass.methodAccept(ClassConstants.METHOD_NAME_CLINIT, + ClassConstants.METHOD_TYPE_CLINIT, enumFieldFinder); // Otherwise try to find the enum field through its name. diff --git a/src/proguard/classfile/util/ExternalTypeEnumeration.java b/src/proguard/classfile/util/ExternalTypeEnumeration.java index e5b7067..b96a80e 100644 --- a/src/proguard/classfile/util/ExternalTypeEnumeration.java +++ b/src/proguard/classfile/util/ExternalTypeEnumeration.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2014 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 @@ -20,7 +20,7 @@ */ package proguard.classfile.util; -import proguard.classfile.ClassConstants; +import proguard.classfile.*; /** @@ -61,7 +61,7 @@ public class ExternalTypeEnumeration public void reset() { - index = descriptor.indexOf(ClassConstants.EXTERNAL_METHOD_ARGUMENTS_OPEN) + 1; + index = descriptor.indexOf(JavaConstants.METHOD_ARGUMENTS_OPEN) + 1; if (index < 1) { @@ -81,13 +81,13 @@ public class ExternalTypeEnumeration int startIndex = index; // Find the next separating comma. - index = descriptor.indexOf(ClassConstants.EXTERNAL_METHOD_ARGUMENTS_SEPARATOR, + index = descriptor.indexOf(JavaConstants.METHOD_ARGUMENTS_SEPARATOR, startIndex); // Otherwise find the closing parenthesis. if (index < 0) { - index = descriptor.indexOf(ClassConstants.EXTERNAL_METHOD_ARGUMENTS_CLOSE, + index = descriptor.indexOf(JavaConstants.METHOD_ARGUMENTS_CLOSE, startIndex); if (index < 0) { @@ -101,6 +101,6 @@ public class ExternalTypeEnumeration public String methodName() { - return descriptor.substring(0, descriptor.indexOf(ClassConstants.EXTERNAL_METHOD_ARGUMENTS_OPEN)).trim(); + return descriptor.substring(0, descriptor.indexOf(JavaConstants.METHOD_ARGUMENTS_OPEN)).trim(); } } diff --git a/src/proguard/classfile/util/InstructionSequenceMatcher.java b/src/proguard/classfile/util/InstructionSequenceMatcher.java index 8c529a9..dc021ee 100644 --- a/src/proguard/classfile/util/InstructionSequenceMatcher.java +++ b/src/proguard/classfile/util/InstructionSequenceMatcher.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2014 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 @@ -41,12 +41,12 @@ extends SimplifiedVisitor implements InstructionVisitor, ConstantVisitor { - /* - public static boolean DEBUG = true; - public static boolean DEBUG_MORE = true; - /*/ + //* private static final boolean DEBUG = false; private static final boolean DEBUG_MORE = false; + /*/ + public static boolean DEBUG = true; + public static boolean DEBUG_MORE = true; //*/ public static final int X = 0x40000000; diff --git a/src/proguard/classfile/util/InternalTypeEnumeration.java b/src/proguard/classfile/util/InternalTypeEnumeration.java index 9c63ad9..53538d1 100644 --- a/src/proguard/classfile/util/InternalTypeEnumeration.java +++ b/src/proguard/classfile/util/InternalTypeEnumeration.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2014 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 @@ -45,8 +45,8 @@ public class InternalTypeEnumeration public InternalTypeEnumeration(String descriptor) { this.descriptor = descriptor; - this.firstIndex = descriptor.indexOf(ClassConstants.INTERNAL_METHOD_ARGUMENTS_OPEN); - this.lastIndex = descriptor.indexOf(ClassConstants.INTERNAL_METHOD_ARGUMENTS_CLOSE); + this.firstIndex = descriptor.indexOf(ClassConstants.METHOD_ARGUMENTS_OPEN); + this.lastIndex = descriptor.indexOf(ClassConstants.METHOD_ARGUMENTS_CLOSE); this.index = firstIndex + 1; if (lastIndex < 0) @@ -57,6 +57,15 @@ public class InternalTypeEnumeration /** + * Returns whether the type is a method signature. + */ + public boolean isMethodSignature() + { + return firstIndex >= 0; + } + + + /** * Returns the formal type parameters from the descriptor, assuming it's a * method descriptor. */ @@ -88,13 +97,13 @@ public class InternalTypeEnumeration char c = descriptor.charAt(index++); switch (c) { - case ClassConstants.INTERNAL_TYPE_CLASS_START: - case ClassConstants.INTERNAL_TYPE_GENERIC_VARIABLE_START: + case ClassConstants.TYPE_CLASS_START: + case ClassConstants.TYPE_GENERIC_VARIABLE_START: { skipClass(); break; } - case ClassConstants.INTERNAL_TYPE_GENERIC_START: + case ClassConstants.TYPE_GENERIC_START: { skipGeneric(); break; @@ -119,7 +128,7 @@ public class InternalTypeEnumeration private void skipArray() { - while (descriptor.charAt(index) == ClassConstants.INTERNAL_TYPE_ARRAY) + while (descriptor.charAt(index) == ClassConstants.TYPE_ARRAY) { index++; } @@ -133,11 +142,11 @@ public class InternalTypeEnumeration char c = descriptor.charAt(index++); switch (c) { - case ClassConstants.INTERNAL_TYPE_GENERIC_START: + case ClassConstants.TYPE_GENERIC_START: skipGeneric(); break; - case ClassConstants.INTERNAL_TYPE_CLASS_END: + case ClassConstants.TYPE_CLASS_END: return; } } @@ -153,11 +162,11 @@ public class InternalTypeEnumeration char c = descriptor.charAt(index++); switch (c) { - case ClassConstants.INTERNAL_TYPE_GENERIC_START: + case ClassConstants.TYPE_GENERIC_START: nestingLevel++; break; - case ClassConstants.INTERNAL_TYPE_GENERIC_END: + case ClassConstants.TYPE_GENERIC_END: nestingLevel--; break; } diff --git a/src/proguard/classfile/util/MemberFinder.java b/src/proguard/classfile/util/MemberFinder.java index 36c0003..dc2724e 100644 --- a/src/proguard/classfile/util/MemberFinder.java +++ b/src/proguard/classfile/util/MemberFinder.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2014 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 @@ -126,7 +126,7 @@ implements MemberVisitor clazz.hierarchyAccept(false, false, false, true, new NamedMethodVisitor(name, descriptor, - new MemberAccessFilter(0, ClassConstants.INTERNAL_ACC_PRIVATE, this))); + new MemberAccessFilter(0, ClassConstants.ACC_PRIVATE, this))); } catch (MemberFoundException ex) { @@ -155,7 +155,7 @@ implements MemberVisitor this.member = null; clazz.hierarchyAccept(false, false, false, true, new NamedFieldVisitor(name, descriptor, - new MemberAccessFilter(0, ClassConstants.INTERNAL_ACC_PRIVATE, this))); + new MemberAccessFilter(0, ClassConstants.ACC_PRIVATE, this))); } catch (MemberFoundException ex) { diff --git a/src/proguard/classfile/util/MethodLinker.java b/src/proguard/classfile/util/MethodLinker.java index 56b6723..4b4afa2 100644 --- a/src/proguard/classfile/util/MethodLinker.java +++ b/src/proguard/classfile/util/MethodLinker.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2014 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 @@ -51,7 +51,7 @@ implements ClassVisitor, // Collect all non-private members in this class hierarchy. clazz.hierarchyAccept(true, true, true, false, new AllMethodVisitor( - new MemberAccessFilter(0, ClassConstants.INTERNAL_ACC_PRIVATE | ClassConstants.INTERNAL_ACC_STATIC, + new MemberAccessFilter(0, ClassConstants.ACC_PRIVATE | ClassConstants.ACC_STATIC, this))); // Clean up for the next class hierarchy. @@ -69,8 +69,7 @@ implements ClassVisitor, // Special cases: <clinit> and <init> are always kept unchanged. // We can ignore them here. - if (name.equals(ClassConstants.INTERNAL_METHOD_NAME_CLINIT) || - name.equals(ClassConstants.INTERNAL_METHOD_NAME_INIT)) + if (ClassUtil.isInitializer(name)) { return; } diff --git a/src/proguard/classfile/util/SimplifiedVisitor.java b/src/proguard/classfile/util/SimplifiedVisitor.java index aed46eb..e662061 100644 --- a/src/proguard/classfile/util/SimplifiedVisitor.java +++ b/src/proguard/classfile/util/SimplifiedVisitor.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2014 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 @@ -23,6 +23,7 @@ package proguard.classfile.util; import proguard.classfile.*; import proguard.classfile.attribute.*; import proguard.classfile.attribute.annotation.*; +import proguard.classfile.attribute.annotation.target.*; import proguard.classfile.attribute.preverification.*; import proguard.classfile.constant.*; import proguard.classfile.instruction.*; @@ -357,6 +358,12 @@ public abstract class SimplifiedVisitor } + public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute methodParametersAttribute) + { + visitAnyAttribute(clazz, methodParametersAttribute); + } + + public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) { visitAnyAttribute(clazz, exceptionsAttribute); @@ -483,6 +490,81 @@ public abstract class SimplifiedVisitor } + /** + * Visits any type of TypeAnnotationsAttribute of a class. + */ + public void visitAnyTypeAnnotationsAttribute(Clazz clazz, TypeAnnotationsAttribute typeAnnotationsAttribute) + { + visitAnyAnnotationsAttribute(clazz, typeAnnotationsAttribute); + } + + + public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) + { + visitAnyTypeAnnotationsAttribute(clazz, runtimeVisibleTypeAnnotationsAttribute); + } + + + /** + * Visits the given RuntimeVisibleTypeAnnotationsAttribute of any type of class member. + */ + public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Member member, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) + { + visitRuntimeVisibleTypeAnnotationsAttribute(clazz, runtimeVisibleTypeAnnotationsAttribute); + } + + + public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) + { + visitRuntimeVisibleTypeAnnotationsAttribute(clazz, (Member)field, runtimeVisibleTypeAnnotationsAttribute); + } + + + public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) + { + visitRuntimeVisibleTypeAnnotationsAttribute(clazz, (Member)method, runtimeVisibleTypeAnnotationsAttribute); + } + + + public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) + { + visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, runtimeVisibleTypeAnnotationsAttribute); + } + + + public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) + { + visitAnyTypeAnnotationsAttribute(clazz, runtimeInvisibleTypeAnnotationsAttribute); + } + + + /** + * Visits the given RuntimeInvisibleTypeAnnotationsAttribute of any type of class member. + */ + public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Member member, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) + { + visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, runtimeInvisibleTypeAnnotationsAttribute); + } + + + public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) + { + visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, (Member)field, runtimeInvisibleTypeAnnotationsAttribute); + } + + + public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) + { + visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, (Member)method, runtimeInvisibleTypeAnnotationsAttribute); + } + + + public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) + { + visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, runtimeInvisibleTypeAnnotationsAttribute); + } + + public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) { visitAnyAttribute(clazz, annotationDefaultAttribute); @@ -795,8 +877,206 @@ public abstract class SimplifiedVisitor } + public void visitAnnotation(Clazz clazz, Method method, CodeAttribute codeAttribute, Annotation annotation) + { + visitAnnotation(clazz, method, annotation); + } + + + // Simplifications for TypeAnnotationVisitor. + + public void visitTypeAnnotation(Clazz clazz, TypeAnnotation typeAnnotation) + { + throw new UnsupportedOperationException("Method must be overridden in ["+this.getClass().getName()+"] if ever called"); + } + + + /** + * Visits the given TypeAnnotation of any type of class member. + */ + public void visitTypeAnnotation(Clazz clazz, Member member, TypeAnnotation typeAnnotation) + { + visitTypeAnnotation(clazz, typeAnnotation); + } + + + public void visitTypeAnnotation(Clazz clazz, Field field, TypeAnnotation typeAnnotation) + { + visitTypeAnnotation(clazz, (Member)field, typeAnnotation); + } + + + public void visitTypeAnnotation(Clazz clazz, Method method, TypeAnnotation typeAnnotation) + { + visitTypeAnnotation(clazz, (Member)method, typeAnnotation); + } + + + public void visitTypeAnnotation(Clazz clazz, Method method, int parameterIndex, TypeAnnotation typeAnnotation) + { + visitTypeAnnotation(clazz, method, typeAnnotation); + } + + + public void visitTypeAnnotation(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation) + { + visitTypeAnnotation(clazz, method, typeAnnotation); + } + + + // Simplifications for TargetInfoVisitor. + + /** + * Visits any type of TargetInfo. + */ + public void visitAnyTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfo targetInfo) + { + throw new UnsupportedOperationException("Method must be overridden in ["+this.getClass().getName()+"] if ever called"); + } + + + public void visitTypeParameterTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, TypeParameterTargetInfo typeParameterTargetInfo) + { + visitAnyTargetInfo(clazz, typeAnnotation, typeParameterTargetInfo); + } + + + public void visitTypeParameterTargetInfo(Clazz clazz, Method method, TypeAnnotation typeAnnotation, TypeParameterTargetInfo typeParameterTargetInfo) + { + visitTypeParameterTargetInfo(clazz, typeAnnotation, typeParameterTargetInfo); + } + + + public void visitSuperTypeTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, SuperTypeTargetInfo superTypeTargetInfo) + { + visitAnyTargetInfo(clazz, typeAnnotation, superTypeTargetInfo); + } + + + public void visitTypeParameterBoundTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, TypeParameterBoundTargetInfo typeParameterBoundTargetInfo) + { + visitAnyTargetInfo(clazz, typeAnnotation, typeParameterBoundTargetInfo); + } + + + /** + * Visits the given TypeParameterBoundTargetInfo of any type of class member. + */ + public void visitTypeParameterBoundTargetInfo(Clazz clazz, Member member, TypeAnnotation typeAnnotation, TypeParameterBoundTargetInfo typeParameterBoundTargetInfo) + { + visitTypeParameterBoundTargetInfo(clazz, typeAnnotation, typeParameterBoundTargetInfo); + } + + + public void visitTypeParameterBoundTargetInfo(Clazz clazz, Field field, TypeAnnotation typeAnnotation, TypeParameterBoundTargetInfo typeParameterBoundTargetInfo) + { + visitTypeParameterBoundTargetInfo(clazz, (Member)field, typeAnnotation, typeParameterBoundTargetInfo); + } + + + public void visitTypeParameterBoundTargetInfo(Clazz clazz, Method method, TypeAnnotation typeAnnotation, TypeParameterBoundTargetInfo typeParameterBoundTargetInfo) + { + visitTypeParameterBoundTargetInfo(clazz, (Member)method, typeAnnotation, typeParameterBoundTargetInfo); + } + + + /** + * Visits the given EmptyTargetInfo of any type of class member. + */ + public void visitEmptyTargetInfo(Clazz clazz, Member member, TypeAnnotation typeAnnotation, EmptyTargetInfo emptyTargetInfo) + { + visitAnyTargetInfo(clazz, typeAnnotation, emptyTargetInfo); + } + + + public void visitEmptyTargetInfo(Clazz clazz, Field field, TypeAnnotation typeAnnotation, EmptyTargetInfo emptyTargetInfo) + { + visitEmptyTargetInfo(clazz, (Member)field, typeAnnotation, emptyTargetInfo); + } + + + public void visitEmptyTargetInfo(Clazz clazz, Method method, TypeAnnotation typeAnnotation, EmptyTargetInfo emptyTargetInfo) + { + visitEmptyTargetInfo(clazz, (Member)method, typeAnnotation, emptyTargetInfo); + } + + + public void visitFormalParameterTargetInfo(Clazz clazz, Method method, TypeAnnotation typeAnnotation, FormalParameterTargetInfo formalParameterTargetInfo) + { + visitAnyTargetInfo(clazz, typeAnnotation, formalParameterTargetInfo); + } + + + public void visitThrowsTargetInfo(Clazz clazz, Method method, TypeAnnotation typeAnnotation, ThrowsTargetInfo throwsTargetInfo) + { + visitAnyTargetInfo(clazz, typeAnnotation, throwsTargetInfo); + } + + + public void visitLocalVariableTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, LocalVariableTargetInfo localVariableTargetInfo) + { + visitAnyTargetInfo(clazz, typeAnnotation, localVariableTargetInfo); + } + + + public void visitCatchTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, CatchTargetInfo catchTargetInfo) + { + visitAnyTargetInfo(clazz, typeAnnotation, catchTargetInfo); + } + + + public void visitOffsetTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, OffsetTargetInfo offsetTargetInfo) + { + visitAnyTargetInfo(clazz, typeAnnotation, offsetTargetInfo); + } + + + public void visitTypeArgumentTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TypeArgumentTargetInfo typeArgumentTargetInfo) + { + visitAnyTargetInfo(clazz, typeAnnotation, typeArgumentTargetInfo); + } + + + // Simplifications for TypePathInfoVisitor. + + public void visitTypePathInfo(Clazz clazz, TypeAnnotation typeAnnotation, TypePathInfo typePathInfo) + { + throw new UnsupportedOperationException("Method must be overridden in ["+this.getClass().getName()+"] if ever called"); + } + + + /** + * Visits the given TypePathInfo of any type of class member. + */ + public void visitTypePathInfo(Clazz clazz, Member member, TypeAnnotation typeAnnotation, TypePathInfo typePathInfo) + { + visitTypePathInfo(clazz, typeAnnotation, typePathInfo); + } + + + public void visitTypePathInfo(Clazz clazz, Field field, TypeAnnotation typeAnnotation, TypePathInfo typePathInfo) + { + visitTypePathInfo(clazz, (Member)field, typeAnnotation, typePathInfo); + } + + + public void visitTypePathInfo(Clazz clazz, Method method, TypeAnnotation typeAnnotation, TypePathInfo typePathInfo) + { + visitTypePathInfo(clazz, (Member)method, typeAnnotation, typePathInfo); + } + + + public void visitTypePathInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TypePathInfo typePathInfo) + { + visitTypePathInfo(clazz, method, typeAnnotation, typePathInfo); + } + + // Simplifications for ElementValueVisitor. + /** + * Visits any type of ElementValue. + */ public void visitAnyElementValue(Clazz clazz, Annotation annotation, ElementValue elementValue) { throw new UnsupportedOperationException("Method must be overridden in ["+this.getClass().getName()+"] if ever called"); diff --git a/src/proguard/classfile/util/StringReferenceInitializer.java b/src/proguard/classfile/util/StringReferenceInitializer.java index f00f0d3..4d96aa4 100644 --- a/src/proguard/classfile/util/StringReferenceInitializer.java +++ b/src/proguard/classfile/util/StringReferenceInitializer.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2014 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/classfile/util/StringSharer.java b/src/proguard/classfile/util/StringSharer.java index dacb2d1..5ef231e 100644 --- a/src/proguard/classfile/util/StringSharer.java +++ b/src/proguard/classfile/util/StringSharer.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2014 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/classfile/util/WarningPrinter.java b/src/proguard/classfile/util/WarningPrinter.java index 39172dd..4f5c477 100644 --- a/src/proguard/classfile/util/WarningPrinter.java +++ b/src/proguard/classfile/util/WarningPrinter.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2014 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 |