Author: markt Date: Thu Sep 11 10:08:12 2014 New Revision: 1624246 URL: http://svn.apache.org/r1624246 Log: Improve efficiency of swallowAnnotations()
Modified: tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/Attribute.java tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/Utility.java Modified: tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/Attribute.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/Attribute.java?rev=1624246&r1=1624245&r2=1624246&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/Attribute.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/Attribute.java Thu Sep 11 10:08:12 2014 @@ -133,13 +133,13 @@ public abstract class Attribute implemen return new RuntimeVisibleAnnotations(name_index, length, file, constant_pool); case Constants.ATTR_RUNTIME_INVISIBLE_ANNOTATIONS: - Utility.swallowAnnotations(file, constant_pool); + Utility.swallowAnnotations(file); return null; case Constants.ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS: return new RuntimeVisibleParameterAnnotations(name_index, length, file, constant_pool); case Constants.ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS: - Utility.swallowAnnotations(file, constant_pool); + Utility.swallowAnnotations(file); return null; case Constants.ATTR_ANNOTATION_DEFAULT: return new AnnotationDefault(name_index, length, file, 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=1624246&r1=1624245&r2=1624246&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:08:12 2014 @@ -296,11 +296,57 @@ final class Utility { file.readUnsignedShort(); // Unused name_and_type_index } - static void swallowAnnotations(DataInputStream file, ConstantPool constant_pool) + static void swallowAnnotations(DataInput file) throws IOException { final int annotation_table_length = (file.readUnsignedShort()); for (int i = 0; i < annotation_table_length; i++) { - AnnotationEntry.read(file, constant_pool); + swallowAnnotationEntry(file); + } + } + + static void swallowAnnotationEntry(DataInput file) + throws IOException { + file.readUnsignedShort(); // Unused type index + final int num_element_value_pairs = (file.readUnsignedShort()); + for (int i = 0; i < num_element_value_pairs; i++) { + file.readUnsignedShort(); // Unused name index + swallowElementValue(file); + } + } + + static void swallowElementValue(DataInput file) throws IOException { + + byte type = file.readByte(); + switch (type) { + case 'B': // byte + case 'C': // char + case 'D': // double + case 'F': // float + case 'I': // int + case 'J': // long + case 'S': // short + case 'Z': // boolean + case 's': // String + case 'c': // Class + file.readUnsignedShort(); // Unused value index + break; + case 'e': // Enum constant + file.readUnsignedShort(); // Unused type_index + file.readUnsignedShort(); // Unused value index + break; + case '@': // Annotation + swallowAnnotationEntry(file); + break; + case '[': // Array + int numArrayVals = file.readUnsignedShort(); + for (int j = 0; j < numArrayVals; j++) + { + swallowElementValue(file); + } + break; + default: + throw new RuntimeException( + "Unexpected element value kind in annotation: " + type); } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org