summaryrefslogtreecommitdiffstats
path: root/src/proguard/classfile/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/proguard/classfile/util')
-rw-r--r--src/proguard/classfile/util/AccessUtil.java26
-rw-r--r--src/proguard/classfile/util/AllParameterVisitor.java239
-rw-r--r--src/proguard/classfile/util/ClassReferenceInitializer.java38
-rw-r--r--src/proguard/classfile/util/ClassSubHierarchyInitializer.java2
-rw-r--r--src/proguard/classfile/util/ClassSuperHierarchyInitializer.java2
-rw-r--r--src/proguard/classfile/util/ClassUtil.java496
-rw-r--r--src/proguard/classfile/util/DescriptorClassEnumeration.java49
-rw-r--r--src/proguard/classfile/util/DynamicClassReferenceInitializer.java61
-rw-r--r--src/proguard/classfile/util/DynamicMemberReferenceInitializer.java81
-rw-r--r--src/proguard/classfile/util/EnumFieldReferenceInitializer.java17
-rw-r--r--src/proguard/classfile/util/ExternalTypeEnumeration.java12
-rw-r--r--src/proguard/classfile/util/InstructionSequenceMatcher.java10
-rw-r--r--src/proguard/classfile/util/InternalTypeEnumeration.java31
-rw-r--r--src/proguard/classfile/util/MemberFinder.java6
-rw-r--r--src/proguard/classfile/util/MethodLinker.java7
-rw-r--r--src/proguard/classfile/util/SimplifiedVisitor.java282
-rw-r--r--src/proguard/classfile/util/StringReferenceInitializer.java2
-rw-r--r--src/proguard/classfile/util/StringSharer.java2
-rw-r--r--src/proguard/classfile/util/WarningPrinter.java2
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