Author: markt Date: Sun Oct 14 00:16:10 2012 New Revision: 1397972 URL: http://svn.apache.org/viewvc?rev=1397972&view=rev Log: Restore incorrectly removed reads when parsing
Modified: tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/StackMapEntry.java tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/StackMapTableEntry.java Modified: tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/StackMapEntry.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/StackMapEntry.java?rev=1397972&r1=1397971&r2=1397972&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/StackMapEntry.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/StackMapEntry.java Sun Oct 14 00:16:10 2012 @@ -35,9 +35,38 @@ public final class StackMapEntry impleme private static final long serialVersionUID = 1L; + private int number_of_locals; + private StackMapType[] types_of_locals; + private int number_of_stack_items; + private StackMapType[] types_of_stack_items; + + + /** + * Construct object from file stream. + * @param file Input stream + * @throws IOException + */ StackMapEntry(DataInputStream file) throws IOException { - file.readShort(); // Unused byte_code_offset - file.readShort(); // Unused number_of_locals + this(file.readShort(), file.readShort(), null, -1, null); + types_of_locals = new StackMapType[number_of_locals]; + for (int i = 0; i < number_of_locals; i++) { + types_of_locals[i] = new StackMapType(file); + } + number_of_stack_items = file.readShort(); + types_of_stack_items = new StackMapType[number_of_stack_items]; + for (int i = 0; i < number_of_stack_items; i++) { + types_of_stack_items[i] = new StackMapType(file); + } + } + + + public StackMapEntry(int byte_code_offset, int number_of_locals, + StackMapType[] types_of_locals, int number_of_stack_items, + StackMapType[] types_of_stack_items) { + this.number_of_locals = number_of_locals; + this.types_of_locals = types_of_locals; + this.number_of_stack_items = number_of_stack_items; + this.types_of_stack_items = types_of_stack_items; } Modified: tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/StackMapTableEntry.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/StackMapTableEntry.java?rev=1397972&r1=1397971&r2=1397972&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/StackMapTableEntry.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/StackMapTableEntry.java Sun Oct 14 00:16:10 2012 @@ -21,6 +21,8 @@ import java.io.DataInputStream; import java.io.IOException; import java.io.Serializable; +import org.apache.tomcat.util.bcel.Constants; + /** * This class represents a stack map entry recording the types of * local variables and the the of stack items at a given byte code offset. @@ -35,6 +37,12 @@ public final class StackMapTableEntry im private static final long serialVersionUID = 1L; + private int frame_type; + private int number_of_locals; + private StackMapType[] types_of_locals; + private int number_of_stack_items; + private StackMapType[] types_of_stack_items; + /** * Construct object from file stream. @@ -42,7 +50,57 @@ public final class StackMapTableEntry im * @throws IOException */ StackMapTableEntry(DataInputStream file) throws IOException { - file.read(); // Unused frame_type + this(file.read(), -1, null, -1, null); + + if (frame_type >= Constants.SAME_FRAME && frame_type <= Constants.SAME_FRAME_MAX) { + // NO-OP + } else if (frame_type >= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME && frame_type <= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_MAX) { + number_of_stack_items = 1; + types_of_stack_items = new StackMapType[1]; + types_of_stack_items[0] = new StackMapType(file); + } else if (frame_type == Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) { + file.readShort(); // Unused byte_code_offset_delta + number_of_stack_items = 1; + types_of_stack_items = new StackMapType[1]; + types_of_stack_items[0] = new StackMapType(file); + } else if (frame_type >= Constants.CHOP_FRAME && frame_type <= Constants.CHOP_FRAME_MAX) { + file.readShort(); // Unused byte_code_offset_delta + } else if (frame_type == Constants.SAME_FRAME_EXTENDED) { + file.readShort(); // Unused byte_code_offset_delta + } else if (frame_type >= Constants.APPEND_FRAME && frame_type <= Constants.APPEND_FRAME_MAX) { + file.readShort(); // Unused byte_code_offset_delta + number_of_locals = frame_type - 251; + types_of_locals = new StackMapType[number_of_locals]; + for (int i = 0; i < number_of_locals; i++) { + types_of_locals[i] = new StackMapType(file); + } + } else if (frame_type == Constants.FULL_FRAME) { + file.readShort(); // Unused byte_code_offset_delta + number_of_locals = file.readShort(); + types_of_locals = new StackMapType[number_of_locals]; + for (int i = 0; i < number_of_locals; i++) { + types_of_locals[i] = new StackMapType(file); + } + number_of_stack_items = file.readShort(); + types_of_stack_items = new StackMapType[number_of_stack_items]; + for (int i = 0; i < number_of_stack_items; i++) { + types_of_stack_items[i] = new StackMapType(file); + } + } else { + /* Can't happen */ + throw new ClassFormatException ("Invalid frame type found while parsing stack map table: " + frame_type); + } + } + + + public StackMapTableEntry(int tag, int number_of_locals, + StackMapType[] types_of_locals, int number_of_stack_items, + StackMapType[] types_of_stack_items) { + this.frame_type = tag; + this.number_of_locals = number_of_locals; + this.types_of_locals = types_of_locals; + this.number_of_stack_items = number_of_stack_items; + this.types_of_stack_items = types_of_stack_items; } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org