Author: kkolinko Date: Fri Sep 12 20:50:17 2014 New Revision: 1624642 URL: http://svn.apache.org/r1624642 Log: Move int -> String mapping for class and interface names from JavaClass to ClassParser. This avoids an intermediary int[] array. Move commons classname lookup and compact code into a helper method.
Modified: tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/ClassParser.java tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/JavaClass.java tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/Utility.java Modified: tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/ClassParser.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/ClassParser.java?rev=1624642&r1=1624641&r2=1624642&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/ClassParser.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/ClassParser.java Fri Sep 12 20:50:17 2014 @@ -44,13 +44,14 @@ public final class ClassParser { private final DataInputStream file; private final String file_name; - private int class_name_index, superclass_name_index; + private String class_name, superclass_name; private int access_flags; // Access rights of parsed class - private int[] interfaces; // Names of implemented interfaces + private String[] interface_names; // Names of implemented interfaces private ConstantPool constant_pool; // collection of constants private Annotations runtimeVisibleAnnotations; // "RuntimeVisibleAnnotations" attribute defined in the class private static final int BUFSIZE = 8192; + private static final String[] INTERFACES_EMPTY_ARRAY = new String[0]; /** * Parse class from the given stream. @@ -101,8 +102,8 @@ public final class ClassParser { readAttributes(); // Return the information we have gathered in a new object - return new JavaClass(class_name_index, superclass_name_index, - access_flags, constant_pool, interfaces, + return new JavaClass(class_name, superclass_name, + access_flags, constant_pool, interface_names, runtimeVisibleAnnotations); } @@ -159,8 +160,17 @@ public final class ClassParser { && ((access_flags & Constants.ACC_FINAL) != 0)) { throw new ClassFormatException("Class " + file_name + " can't be both final and abstract"); } - class_name_index = file.readUnsignedShort(); - superclass_name_index = file.readUnsignedShort(); + + int class_name_index = file.readUnsignedShort(); + class_name = Utility.getClassName(constant_pool, class_name_index); + + int superclass_name_index = file.readUnsignedShort(); + if (superclass_name_index > 0) { + // May be zero -> class is java.lang.Object + superclass_name = Utility.getClassName(constant_pool, superclass_name_index); + } else { + superclass_name = "java.lang.Object"; + } } @@ -210,10 +220,13 @@ public final class ClassParser { int interfaces_count; interfaces_count = file.readUnsignedShort(); if (interfaces_count > 0) { - interfaces = new int[interfaces_count]; + interface_names = new String[interfaces_count]; for (int i = 0; i < interfaces_count; i++) { - interfaces[i] = file.readUnsignedShort(); + int index = file.readUnsignedShort(); + interface_names[i] = Utility.getClassName(constant_pool, index); } + } else { + interface_names = INTERFACES_EMPTY_ARRAY; } } Modified: tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/JavaClass.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/JavaClass.java?rev=1624642&r1=1624641&r2=1624642&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/JavaClass.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/JavaClass.java Fri Sep 12 20:50:17 2014 @@ -17,8 +17,6 @@ */ package org.apache.tomcat.util.bcel.classfile; -import org.apache.tomcat.util.bcel.Constants; - /** * Represents a Java class, i.e., the data structures, constant pool, * fields, methods and commands contained in a Java .class file. @@ -36,50 +34,24 @@ public class JavaClass extends AccessFla private String[] interface_names; private Annotations runtimeVisibleAnnotations; // "RuntimeVisibleAnnotations" attribute defined in the class - private static final String[] INTERFACES_EMPTY_ARRAY = new String[0]; - /** * Constructor gets all contents as arguments. * - * @param class_name_index Index into constant pool referencing a - * ConstantClass that represents this class. - * @param superclass_name_index Index into constant pool referencing a - * ConstantClass that represents this class's superclass. + * @param class_name Name of this class. + * @param superclass_name Name of this class's superclass. * @param access_flags Access rights defined by bit flags * @param constant_pool Array of constants * @param interfaces Implemented interfaces * @param runtimeVisibleAnnotations "RuntimeVisibleAnnotations" attribute defined on the Class, or null */ - JavaClass(int class_name_index, int superclass_name_index, - int access_flags, ConstantPool constant_pool, int[] interfaces, + JavaClass(String class_name, String superclass_name, + int access_flags, ConstantPool constant_pool, String[] interface_names, Annotations runtimeVisibleAnnotations) { this.access_flags = access_flags; this.runtimeVisibleAnnotations = runtimeVisibleAnnotations; - - /* According to the specification the following entries must be of type - * `ConstantClass' but we check that anyway via the - * `ConstPool.getConstant' method. - */ - class_name = constant_pool.getConstantString(class_name_index, Constants.CONSTANT_Class); - class_name = Utility.compactClassName(class_name); - if (superclass_name_index > 0) { - // May be zero -> class is java.lang.Object - superclass_name = constant_pool.getConstantString(superclass_name_index, - Constants.CONSTANT_Class); - superclass_name = Utility.compactClassName(superclass_name); - } else { - superclass_name = "java.lang.Object"; - } - - if (interfaces == null) { - interface_names = INTERFACES_EMPTY_ARRAY; - } else { - interface_names = new String[interfaces.length]; - for (int i = 0; i < interfaces.length; i++) { - String str = constant_pool.getConstantString(interfaces[i], Constants.CONSTANT_Class); - interface_names[i] = Utility.compactClassName(str); - } - } + this.class_name = class_name; + this.superclass_name = superclass_name; + this.interface_names = interface_names; } /** Modified: tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/Utility.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/Utility.java?rev=1624642&r1=1624641&r2=1624642&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/Utility.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/Utility.java Fri Sep 12 20:50:17 2014 @@ -21,6 +21,8 @@ import java.io.DataInput; import java.io.EOFException; import java.io.IOException; +import org.apache.tomcat.util.bcel.Constants; + /** * Utility functions that do not really belong to any class in particular. * @@ -45,6 +47,11 @@ final class Utility { return str.replace('/', '.'); // Is `/' on all systems, even DOS } + static String getClassName(ConstantPool constant_pool, int index) { + String name = constant_pool.getConstantString(index, Constants.CONSTANT_Class); + return compactClassName(name); + } + static void skipFully(DataInput file, int length) throws IOException { int total = file.skipBytes(length); if (total != length) { --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org