You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2014/09/11 12:18:55 UTC
svn commit: r1624252 -
/tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/Utility.java
Author: markt
Date: Thu Sep 11 10:18:55 2014
New Revision: 1624252
URL: http://svn.apache.org/r1624252
Log:
Improve efficiency of swallowFieldOrMethod()
Modified:
tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/Utility.java
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=1624252&r1=1624251&r2=1624252&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 Thu Sep 11 10:18:55 2014
@@ -77,14 +77,14 @@ final class Utility {
static void swallowStackMap(DataInput file) throws IOException {
int map_length = file.readUnsignedShort();
for (int i = 0; i < map_length; i++) {
- Utility.swallowStackMapEntry(file);
+ swallowStackMapEntry(file);
}
}
static void swallowStackMapTable(DataInputStream file) throws IOException {
int map_length = file.readUnsignedShort();
for (int i = 0; i < map_length; i++) {
- Utility.swallowStackMapTableEntry(file);
+ swallowStackMapTableEntry(file);
}
}
@@ -103,11 +103,11 @@ final class Utility {
file.readShort(); // Unused byte_code_offset
int number_of_locals = file.readShort();
for (int i = 0; i < number_of_locals; i++) {
- Utility.swallowStackMapType(file);
+ swallowStackMapType(file);
}
int number_of_stack_items = file.readShort();
for (int i = 0; i < number_of_stack_items; i++) {
- Utility.swallowStackMapType(file);
+ swallowStackMapType(file);
}
}
@@ -118,10 +118,10 @@ final class Utility {
// NO-OP
} else if (frame_type >= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME &&
frame_type <= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_MAX) {
- Utility.swallowStackMapType(file); // Unused single stack item
+ swallowStackMapType(file); // Unused single stack item
} else if (frame_type == Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) {
file.readShort(); // Unused byte_code_offset_delta
- Utility.swallowStackMapType(file); // Unused single stack item
+ swallowStackMapType(file); // Unused single stack item
} else if (frame_type >= Constants.CHOP_FRAME &&
frame_type <= Constants.CHOP_FRAME_MAX) {
file.readShort(); // Unused byte_code_offset_delta
@@ -132,17 +132,17 @@ final class Utility {
file.readShort(); // Unused byte_code_offset_delta
int number_of_locals = frame_type - 251;
for (int i = 0; i < number_of_locals; i++) {
- Utility.swallowStackMapType(file);
+ swallowStackMapType(file);
}
} else if (frame_type == Constants.FULL_FRAME) {
file.readShort(); // Unused byte_code_offset_delta
int number_of_locals = file.readShort();
for (int i = 0; i < number_of_locals; i++) {
- Utility.swallowStackMapType(file);
+ swallowStackMapType(file);
}
int number_of_stack_items = file.readShort();
for (int i = 0; i < number_of_stack_items; i++) {
- Utility.swallowStackMapType(file);
+ swallowStackMapType(file);
}
} else {
/* Can't happen */
@@ -206,7 +206,7 @@ final class Utility {
*/
int exception_table_length = file.readUnsignedShort();
for (int i = 0; i < exception_table_length; i++) {
- Utility.swallowCodeException(file);
+ swallowCodeException(file);
}
/* Read all attributes, currently `LineNumberTable' and
* `LocalVariableTable'
@@ -227,28 +227,28 @@ final class Utility {
static void swallowLineNumberTable(DataInput file) throws IOException {
int line_number_table_length = (file.readUnsignedShort());
for (int i = 0; i < line_number_table_length; i++) {
- Utility.swallowLineNumber(file);
+ swallowLineNumber(file);
}
}
static void swallowLocalVariableTable(DataInput file) throws IOException {
int local_variable_table_length = (file.readUnsignedShort());
for (int i = 0; i < local_variable_table_length; i++) {
- Utility.swallowLocalVariable(file);
+ swallowLocalVariable(file);
}
}
static void swallowLocalVariableTypeTable(DataInput file) throws IOException {
int local_variable_type_table_length = (file.readUnsignedShort());
for(int i=0; i < local_variable_type_table_length; i++) {
- Utility.swallowLocalVariable(file);
+ swallowLocalVariable(file);
}
}
static void swallowInnerClasses(DataInput file) throws IOException {
int number_of_classes = file.readUnsignedShort();
for (int i = 0; i < number_of_classes; i++) {
- Utility.swallowInnerClass(file);
+ swallowInnerClass(file);
}
}
@@ -358,7 +358,99 @@ final class Utility {
int attributes_count = file.readUnsignedShort();
for (int i = 0; i < attributes_count; i++) {
- Attribute.readAttribute(file, constant_pool);
+ swallowAttribute(file, constant_pool);
+ }
+ }
+
+ static void swallowAttribute(DataInputStream file, ConstantPool constant_pool)
+ throws IOException {
+ byte tag = Constants.ATTR_UNKNOWN; // Unknown attribute
+ // Get class name from constant pool via `name_index' indirection
+ int name_index = file.readUnsignedShort();
+ ConstantUtf8 c =
+ (ConstantUtf8) constant_pool.getConstant(name_index, Constants.CONSTANT_Utf8);
+ String name = c.getBytes();
+ // Length of data in bytes
+ int length = file.readInt();
+ // Compare strings to find known attribute
+ for (byte i = 0; i < Constants.KNOWN_ATTRIBUTES; i++) {
+ if (name.equals(Constants.ATTRIBUTE_NAMES[i])) {
+ tag = i; // found!
+ break;
+ }
}
+ // Call proper constructor, depending on `tag'
+ switch (tag)
+ {
+ case Constants.ATTR_UNKNOWN:
+ swallowUnknownAttribute(file, length);
+ break;
+ case Constants.ATTR_CONSTANT_VALUE:
+ swallowConstantValue(file);
+ break;
+ case Constants.ATTR_SOURCE_FILE:
+ swallowSourceFile(file);
+ break;
+ case Constants.ATTR_CODE:
+ swallowCode(file, constant_pool);
+ break;
+ case Constants.ATTR_EXCEPTIONS:
+ swallowExceptionTable(file);
+ break;
+ case Constants.ATTR_LINE_NUMBER_TABLE:
+ swallowLineNumberTable(file);
+ break;
+ case Constants.ATTR_LOCAL_VARIABLE_TABLE:
+ swallowLocalVariableTable(file);
+ break;
+ case Constants.ATTR_INNER_CLASSES:
+ swallowInnerClasses(file);
+ break;
+ case Constants.ATTR_SYNTHETIC:
+ swallowSynthetic(length);
+ break;
+ case Constants.ATTR_DEPRECATED:
+ swallowDeprecated(length);
+ break;
+ case Constants.ATTR_PMG:
+ swallowPMCClass(file);
+ break;
+ case Constants.ATTR_SIGNATURE:
+ swallowSignature(file);
+ break;
+ case Constants.ATTR_STACK_MAP:
+ swallowStackMap(file);
+ break;
+ case Constants.ATTR_RUNTIME_VISIBLE_ANNOTATIONS:
+ case Constants.ATTR_RUNTIME_INVISIBLE_ANNOTATIONS:
+ case Constants.ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS:
+ case Constants.ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS:
+ swallowAnnotations(file);
+ break;
+ case Constants.ATTR_ANNOTATION_DEFAULT:
+ swallowAnnotationDefault(file);
+ break;
+ case Constants.ATTR_LOCAL_VARIABLE_TYPE_TABLE:
+ swallowLocalVariableTypeTable(file);
+ break;
+ case Constants.ATTR_ENCLOSING_METHOD:
+ swallowEnclosingMethod(file);
+ break;
+ case Constants.ATTR_STACK_MAP_TABLE:
+ swallowStackMapTable(file);
+ break;
+ case Constants.ATTR_BOOTSTRAP_METHODS:
+ swallowBootstrapMethods(file);
+ break;
+ case Constants.ATTR_METHOD_PARAMETERS:
+ swallowMethodParameters(file);
+ break;
+ default: // Never reached
+ throw new IllegalStateException("Unrecognized attribute type tag parsed: " + tag);
+ }
+ }
+
+ static void swallowAnnotationDefault(DataInput file) throws IOException {
+ swallowElementValue(file);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org