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