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 2012/10/14 02:16:10 UTC
svn commit: r1397972 - in
/tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile:
StackMapEntry.java StackMapTableEntry.java
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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org