svn commit: r386056 [3/28] - in /jakarta/bcel/trunk: examples/ examples/Mini/ src/java/org/apache/bcel/ src/java/org/apache/bcel/classfile/ src/java/org/apache/bcel/generic/ src/java/org/apache/bcel/util/ src/java/org/apache/bcel/verifier/ src/java/org...

[email protected]
Newsgroups gmane.comp.jakarta.bcel.devel
Message-ID <[email protected]>
Modified: jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/Attribute.java
URL: http://svn.apache.org/viewcvs/jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/Attribute.java?rev=386056&r1=386055&r2=386056&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/Attribute.java (original)
+++ jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/Attribute.java Wed Mar 15 03:31:56 2006
@@ -45,238 +45,234 @@
  * @see     Synthetic
  * @see     Deprecated
  * @see     Signature
-*/
+ */
 public abstract class Attribute implements Cloneable, Node, Serializable {
-  protected int          name_index; // Points to attribute name in constant pool
-  protected int          length;     // Content length of attribute field
-  protected byte         tag;        // Tag to distiguish subclasses
-  protected ConstantPool constant_pool;
-
-  protected Attribute(byte tag, int name_index, int length,
-		      ConstantPool constant_pool) {
-    this.tag           = tag;
-    this.name_index    = name_index;
-    this.length        = length;
-    this.constant_pool = constant_pool;
-  }
-
-  /**
-   * Called by objects that are traversing the nodes of the tree implicitely
-   * defined by the contents of a Java class. I.e., the hierarchy of methods,
-   * fields, attributes, etc. spawns a tree of objects.
-   *
-   * @param v Visitor object
-   */
-  public abstract void accept(Visitor v);    
-
-  /**
-   * Dump attribute to file stream in binary format.
-   *
-   * @param file Output file stream
-   * @throws IOException
-   */
-  public void dump(DataOutputStream file) throws IOException
-  {
-    file.writeShort(name_index);
-    file.writeInt(length);
-  }
-
-  private static Map readers = new HashMap();
-
-  /** Add an Attribute reader capable of parsing (user-defined) attributes
-   * named "name". You should not add readers for the standard attributes
-   * such as "LineNumberTable", because those are handled internally.
-   *
-   * @param name the name of the attribute as stored in the class file
-   * @param r the reader object
-   */ 
-  public static void addAttributeReader(String name, AttributeReader r) {
-    readers.put(name, r);
-  }
-
-  /** Remove attribute reader
-   *
-   * @param name the name of the attribute as stored in the class file
-   */
-  public static void removeAttributeReader(String name) {
-    readers.remove(name);
-  }
-
-  /* Class method reads one attribute from the input data stream.
-   * This method must not be accessible from the outside.  It is
-   * called by the Field and Method constructor methods.
-   *
-   * @see    Field
-   * @see    Method
-   * @param  file Input stream
-   * @param  constant_pool Array of constants
-   * @return Attribute
-   * @throws  IOException
-   * @throws  ClassFormatException
-   */
-  public static final Attribute readAttribute(DataInputStream file,
-					      ConstantPool constant_pool)
-    throws IOException, ClassFormatException
-  {
-    ConstantUtf8 c;
-    String       name;
-    int          name_index;
-    int          length;
-    byte         tag = Constants.ATTR_UNKNOWN; // Unknown attribute
-
-    // Get class name from constant pool via `name_index' indirection
-    name_index = file.readUnsignedShort();
-    c          = (ConstantUtf8)constant_pool.getConstant(name_index, 
-							 Constants.CONSTANT_Utf8);
-    name       = c.getBytes();
-
-    // Length of data in bytes
-    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:
-      AttributeReader r = (AttributeReader)readers.get(name);
-
-      if(r != null)
-    	  return r.createAttribute(name_index, length, file, constant_pool);
-	  return new Unknown(name_index, length, file, constant_pool);
-
-    case Constants.ATTR_CONSTANT_VALUE:
-      return new ConstantValue(name_index, length, file, constant_pool);
-
-    case Constants.ATTR_SOURCE_FILE:
-      return new SourceFile(name_index, length, file, constant_pool);
-	  
-    case Constants.ATTR_CODE:
-      return new Code(name_index, length, file, constant_pool);
-	  
-    case Constants.ATTR_EXCEPTIONS:
-      return new ExceptionTable(name_index, length, file, constant_pool);
-	  
-    case Constants.ATTR_LINE_NUMBER_TABLE:
-      return new LineNumberTable(name_index, length, file, constant_pool);
-	  
-    case Constants.ATTR_LOCAL_VARIABLE_TABLE:
-      return new LocalVariableTable(name_index, length, file, constant_pool);
-
-    case Constants.ATTR_INNER_CLASSES:
-      return new InnerClasses(name_index, length, file, constant_pool);
-
-    case Constants.ATTR_SYNTHETIC:
-      return new Synthetic(name_index, length, file, constant_pool);
-
-    case Constants.ATTR_DEPRECATED:
-      return new Deprecated(name_index, length, file, constant_pool);
-
-    case Constants.ATTR_PMG:
-      return new PMGClass(name_index, length, file, constant_pool);
-
-    case Constants.ATTR_SIGNATURE:
-      return new Signature(name_index, length, file, constant_pool);
-
-    case Constants.ATTR_STACK_MAP:
-      return new StackMap(name_index, length, file, constant_pool);
-
-//    case Constants.ATTR_RUNTIMEVISIBLE_ANNOTATIONS:
-//      return new RuntimeVisibleAnnotations(name_index, length, file, constant_pool);
-        
-//    case Constants.ATTR_RUNTIMEINVISIBLE_ANNOTATIONS:
-//      return new RuntimeInvisibleAnnotations(name_index, length, file, constant_pool);
-      
-//    case Constants.ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS:
-//      return new RuntimeVisibleParameterAnnotations(name_index, length, file, constant_pool);
-    
-//    case Constants.ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS:
-//      return new RuntimeInvisibleParameterAnnotations(name_index, length, file, constant_pool);
-
-//    case Constants.ATTR_ANNOTATION_DEFAULT:
-//      return new AnnotationDefault(name_index, length, file, constant_pool);
-
-    default: // Never reached
-      throw new IllegalStateException("Ooops! default case reached.");
-    }
-  }    
-
-  /**
-   * @return Length of attribute field in bytes.
-   */  
-  public final int   getLength()    { return length; }    
-
-  /**
-   * @param length length in bytes.
-   */
-  public final void setLength(int length) {
-    this.length = length;
-  }    
-
-  /**
-   * @param name_index of attribute.
-   */
-  public final void setNameIndex(int name_index) {
-    this.name_index = name_index;
-  }    
-
-  /**
-   * @return Name index in constant pool of attribute name.
-   */  
-  public final int getNameIndex() { return name_index; }    
-
-  /**
-   * @return Tag of attribute, i.e., its type. Value may not be altered, thus
-   * there is no setTag() method.
-   */
-  public final byte  getTag()       { return tag; }    
-
-  /**
-   * @return Constant pool used by this object.
-   * @see ConstantPool
-   */   
-  public final ConstantPool getConstantPool() { return constant_pool; }    
-
-  /**
-   * @param constant_pool Constant pool to be used for this object.
-   * @see ConstantPool
-   */   
-  public final void setConstantPool(ConstantPool constant_pool) {
-    this.constant_pool = constant_pool;
-  }
-  
-  /**
-   * Use copy() if you want to have a deep copy(), i.e., with all references
-   * copied correctly.
-   *
-   * @return shallow copy of this attribute
-   */
-  public Object clone() {
-    Object o = null;
-
-    try {
-      o = super.clone();
-    } catch(CloneNotSupportedException e) {
-      e.printStackTrace(); // Never occurs
-    }
-
-    return o;
-  }
-
-  /**
-   * @return deep copy of this attribute
-   */
-  public abstract Attribute copy(ConstantPool _constant_pool);
-
-  /**
-   * @return attribute name.
-   */ 
-  public String toString() {
-    return Constants.ATTRIBUTE_NAMES[tag];
-  }
+
+    protected int name_index; // Points to attribute name in constant pool
+    protected int length; // Content length of attribute field
+    protected byte tag; // Tag to distiguish subclasses
+    protected ConstantPool constant_pool;
+
+
+    protected Attribute(byte tag, int name_index, int length, ConstantPool constant_pool) {
+        this.tag = tag;
+        this.name_index = name_index;
+        this.length = length;
+        this.constant_pool = constant_pool;
+    }
+
+
+    /**
+     * Called by objects that are traversing the nodes of the tree implicitely
+     * defined by the contents of a Java class. I.e., the hierarchy of methods,
+     * fields, attributes, etc. spawns a tree of objects.
+     *
+     * @param v Visitor object
+     */
+    public abstract void accept( Visitor v );
+
+
+    /**
+     * Dump attribute to file stream in binary format.
+     *
+     * @param file Output file stream
+     * @throws IOException
+     */
+    public void dump( DataOutputStream file ) throws IOException {
+        file.writeShort(name_index);
+        file.writeInt(length);
+    }
+
+    private static Map readers = new HashMap();
+
+
+    /** Add an Attribute reader capable of parsing (user-defined) attributes
+     * named "name". You should not add readers for the standard attributes
+     * such as "LineNumberTable", because those are handled internally.
+     *
+     * @param name the name of the attribute as stored in the class file
+     * @param r the reader object
+     */
+    public static void addAttributeReader( String name, AttributeReader r ) {
+        readers.put(name, r);
+    }
+
+
+    /** Remove attribute reader
+     *
+     * @param name the name of the attribute as stored in the class file
+     */
+    public static void removeAttributeReader( String name ) {
+        readers.remove(name);
+    }
+
+
+    /* Class method reads one attribute from the input data stream.
+     * This method must not be accessible from the outside.  It is
+     * called by the Field and Method constructor methods.
+     *
+     * @see    Field
+     * @see    Method
+     * @param  file Input stream
+     * @param  constant_pool Array of constants
+     * @return Attribute
+     * @throws  IOException
+     * @throws  ClassFormatException
+     */
+    public static final Attribute readAttribute( DataInputStream file, ConstantPool constant_pool )
+            throws IOException, ClassFormatException {
+        ConstantUtf8 c;
+        String name;
+        int name_index;
+        int length;
+        byte tag = Constants.ATTR_UNKNOWN; // Unknown attribute
+        // Get class name from constant pool via `name_index' indirection
+        name_index = file.readUnsignedShort();
+        c = (ConstantUtf8) constant_pool.getConstant(name_index, Constants.CONSTANT_Utf8);
+        name = c.getBytes();
+        // Length of data in bytes
+        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:
+                AttributeReader r = (AttributeReader) readers.get(name);
+                if (r != null) {
+                    return r.createAttribute(name_index, length, file, constant_pool);
+                }
+                return new Unknown(name_index, length, file, constant_pool);
+            case Constants.ATTR_CONSTANT_VALUE:
+                return new ConstantValue(name_index, length, file, constant_pool);
+            case Constants.ATTR_SOURCE_FILE:
+                return new SourceFile(name_index, length, file, constant_pool);
+            case Constants.ATTR_CODE:
+                return new Code(name_index, length, file, constant_pool);
+            case Constants.ATTR_EXCEPTIONS:
+                return new ExceptionTable(name_index, length, file, constant_pool);
+            case Constants.ATTR_LINE_NUMBER_TABLE:
+                return new LineNumberTable(name_index, length, file, constant_pool);
+            case Constants.ATTR_LOCAL_VARIABLE_TABLE:
+                return new LocalVariableTable(name_index, length, file, constant_pool);
+            case Constants.ATTR_INNER_CLASSES:
+                return new InnerClasses(name_index, length, file, constant_pool);
+            case Constants.ATTR_SYNTHETIC:
+                return new Synthetic(name_index, length, file, constant_pool);
+            case Constants.ATTR_DEPRECATED:
+                return new Deprecated(name_index, length, file, constant_pool);
+            case Constants.ATTR_PMG:
+                return new PMGClass(name_index, length, file, constant_pool);
+            case Constants.ATTR_SIGNATURE:
+                return new Signature(name_index, length, file, constant_pool);
+            case Constants.ATTR_STACK_MAP:
+                return new StackMap(name_index, length, file, constant_pool);
+                //    case Constants.ATTR_RUNTIMEVISIBLE_ANNOTATIONS:
+                //      return new RuntimeVisibleAnnotations(name_index, length, file, constant_pool);
+                //    case Constants.ATTR_RUNTIMEINVISIBLE_ANNOTATIONS:
+                //      return new RuntimeInvisibleAnnotations(name_index, length, file, constant_pool);
+                //    case Constants.ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS:
+                //      return new RuntimeVisibleParameterAnnotations(name_index, length, file, constant_pool);
+                //    case Constants.ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS:
+                //      return new RuntimeInvisibleParameterAnnotations(name_index, length, file, constant_pool);
+                //    case Constants.ATTR_ANNOTATION_DEFAULT:
+                //      return new AnnotationDefault(name_index, length, file, constant_pool);
+            default: // Never reached
+                throw new IllegalStateException("Ooops! default case reached.");
+        }
+    }
+
+
+    /**
+     * @return Length of attribute field in bytes.
+     */
+    public final int getLength() {
+        return length;
+    }
+
+
+    /**
+     * @param length length in bytes.
+     */
+    public final void setLength( int length ) {
+        this.length = length;
+    }
+
+
+    /**
+     * @param name_index of attribute.
+     */
+    public final void setNameIndex( int name_index ) {
+        this.name_index = name_index;
+    }
+
+
+    /**
+     * @return Name index in constant pool of attribute name.
+     */
+    public final int getNameIndex() {
+        return name_index;
+    }
+
+
+    /**
+     * @return Tag of attribute, i.e., its type. Value may not be altered, thus
+     * there is no setTag() method.
+     */
+    public final byte getTag() {
+        return tag;
+    }
+
+
+    /**
+     * @return Constant pool used by this object.
+     * @see ConstantPool
+     */
+    public final ConstantPool getConstantPool() {
+        return constant_pool;
+    }
+
+
+    /**
+     * @param constant_pool Constant pool to be used for this object.
+     * @see ConstantPool
+     */
+    public final void setConstantPool( ConstantPool constant_pool ) {
+        this.constant_pool = constant_pool;
+    }
+
+
+    /**
+     * Use copy() if you want to have a deep copy(), i.e., with all references
+     * copied correctly.
+     *
+     * @return shallow copy of this attribute
+     */
+    public Object clone() {
+        Object o = null;
+        try {
+            o = super.clone();
+        } catch (CloneNotSupportedException e) {
+            e.printStackTrace(); // Never occurs
+        }
+        return o;
+    }
+
+
+    /**
+     * @return deep copy of this attribute
+     */
+    public abstract Attribute copy( ConstantPool _constant_pool );
+
+
+    /**
+     * @return attribute name.
+     */
+    public String toString() {
+        return Constants.ATTRIBUTE_NAMES[tag];
+    }
 }

Modified: jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/AttributeReader.java
URL: http://svn.apache.org/viewcvs/jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/AttributeReader.java?rev=386056&r1=386055&r2=386056&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/AttributeReader.java (original)
+++ jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/AttributeReader.java Wed Mar 15 03:31:56 2006
@@ -16,7 +16,6 @@
  */
 package org.apache.bcel.classfile;
 
-
 /**
  * Unknown (non-standard) attributes may be read via user-defined factory
  * objects that can be registered with the Attribute.addAttributeReader
@@ -27,7 +26,8 @@
  * @author  <A HREF="mailto:[email protected]">M. Dahm</A>
  */
 public interface AttributeReader {
-  /**
+
+    /**
      When this attribute reader is added via the static method
      Attribute.addAttributeReader, an attribute name is associated with it.
      As the class file parser parses attributes, it will call various
@@ -52,9 +52,7 @@
      returned which will cause the parsing of the class file to fail.
 
      @see Attribute#addAttributeReader( String, AttributeReader )
-  */
-  public Attribute createAttribute(int name_index, 
-				   int length,
-				   java.io.DataInputStream file,
-				   ConstantPool constant_pool);
+     */
+    public Attribute createAttribute( int name_index, int length, java.io.DataInputStream file,
+            ConstantPool constant_pool );
 }

Modified: jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/ClassFormatException.java
URL: http://svn.apache.org/viewcvs/jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/ClassFormatException.java?rev=386056&r1=386055&r2=386056&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/ClassFormatException.java (original)
+++ jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/ClassFormatException.java Wed Mar 15 03:31:56 2006
@@ -16,7 +16,6 @@
  */
 package org.apache.bcel.classfile;
 
-
 /** 
  * Thrown when the BCEL attempts to read a class file and determines
  * that the file is malformed or otherwise cannot be interpreted as a
@@ -26,7 +25,13 @@
  * @author  <A HREF="mailto:[email protected]">M. Dahm</A>
  */
 public class ClassFormatException extends RuntimeException {
-  public ClassFormatException() { super(); }
-  public ClassFormatException(String s) { super(s); }
-}
 
+    public ClassFormatException() {
+        super();
+    }
+
+
+    public ClassFormatException(String s) {
+        super(s);
+    }
+}

Modified: jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/ClassParser.java
URL: http://svn.apache.org/viewcvs/jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/ClassParser.java?rev=386056&r1=386055&r2=386056&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/ClassParser.java (original)
+++ jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/ClassParser.java Wed Mar 15 03:31:56 2006
@@ -41,267 +41,255 @@
  * @author <A HREF="mailto:[email protected]">M. Dahm</A> 
  */
 public final class ClassParser {
-  private DataInputStream file;
-  private boolean 		  fileOwned;
-  private String          file_name;
-  private String          zip_file;
-  private int             class_name_index, superclass_name_index;
-  private int             major, minor; // Compiler version
-  private int             access_flags; // Access rights of parsed class
-  private int[]           interfaces; // Names of implemented interfaces
-  private ConstantPool    constant_pool; // collection of constants
-  private Field[]         fields; // class fields, i.e., its variables
-  private Method[]        methods; // methods defined in the class
-  private Attribute[]     attributes; // attributes defined in the class
-  private boolean         is_zip; // Loaded from zip file
-
-  private static final int BUFSIZE = 8192;
-
-  /**
-   * Parse class from the given stream.
-   *
-   * @param file Input stream
-   * @param file_name File name
-   */
-  public ClassParser(InputStream file, String file_name) {
-    this.file_name = file_name;
-    fileOwned = false;
-    String clazz = file.getClass().getName(); // Not a very clean solution ...
-    is_zip = clazz.startsWith("java.util.zip.") || clazz.startsWith("java.util.jar.");
-
-    if(file instanceof DataInputStream) // Is already a data stream
-      this.file = (DataInputStream)file;
-    else
-      this.file = new DataInputStream(new BufferedInputStream(file, BUFSIZE));
-  }
-
-  /** Parse class from given .class file.
-   *
-   * @param file_name file name
-   */
-  public ClassParser(String file_name) throws IOException 
-  {    
-    is_zip = false;
-    this.file_name = file_name;
-    fileOwned = true;
-  }
-
-  /** Parse class from given .class file in a ZIP-archive
-   *
-   * @param zip_file zip file name
-   * @param file_name file name
-   */
-  public ClassParser(String zip_file, String file_name)
-  {    
-    is_zip = true;
-    fileOwned = true;  
-    this.zip_file = zip_file;
-    this.file_name = file_name;
-  }
-
-  /**
-   * Parse the given Java class file and return an object that represents
-   * the contained data, i.e., constants, methods, fields and commands.
-   * A <em>ClassFormatException</em> is raised, if the file is not a valid
-   * .class file. (This does not include verification of the byte code as it
-   * is performed by the java interpreter).
-   *
-   * @return Class object representing the parsed class file
-   * @throws  IOException
-   * @throws  ClassFormatException
-   */  
-  public JavaClass parse() throws IOException, ClassFormatException
-  {
-    ZipFile         zip = null;
-    
-  	try {
-  		if (fileOwned) {
-  			if (is_zip) {
-  			    zip = new ZipFile(zip_file);
-  			    ZipEntry entry = zip.getEntry(file_name);
-  			    file = new DataInputStream(new BufferedInputStream(zip.getInputStream(entry),
-					       BUFSIZE));
-  			} else {
-  			    file = new DataInputStream(new BufferedInputStream
-  				       (new FileInputStream(file_name), BUFSIZE));
-  			}
-  		}
-	    /****************** Read headers ********************************/
-	    // Check magic tag of class file
-	    readID();
-	
-	    // Get compiler version
-	    readVersion();
-	
-	    /****************** Read constant pool and related **************/
-	    // Read constant pool entries
-	    readConstantPool();
-		
-	    // Get class information
-	    readClassInfo();
-	
-	    // Get interface information, i.e., implemented interfaces
-	    readInterfaces();
-	
-	    /****************** Read class fields and methods ***************/ 
-	    // Read class fields, i.e., the variables of the class
-	    readFields();
-	
-	    // Read class methods, i.e., the functions in the class
-	    readMethods();
-	
-	    // Read class attributes
-	    readAttributes();
-	
-	    // Check for unknown variables
-	    //Unknown[] u = Unknown.getUnknownAttributes();
-	    //for(int i=0; i < u.length; i++)
-	    //  System.err.println("WARNING: " + u[i]);
-	
-	    // Everything should have been read now
-	    //      if(file.available() > 0) {
-	    //        int bytes = file.available();
-	    //        byte[] buf = new byte[bytes];
-	    //        file.read(buf);
-	    
-	    //        if(!(is_zip && (buf.length == 1))) {
-	    //  	System.err.println("WARNING: Trailing garbage at end of " + file_name);
-	    //  	System.err.println(bytes + " extra bytes: " + Utility.toHexString(buf));
-	    //        }
-	    //      }
-  	} finally {
-	    // Read everything of interest, so close the file
-  		if (fileOwned) {
-  			file.close();
-  			if (zip != null)
-  				zip.close();
-  		}
-  	}
-
-    // Return the information we have gathered in a new object
-    return new JavaClass(class_name_index, superclass_name_index, 
-			 file_name, major, minor, access_flags,
-			 constant_pool, interfaces, fields,
-			 methods, attributes, is_zip? JavaClass.ZIP : JavaClass.FILE);
-  }
-
-  /**
-   * Read information about the attributes of the class.
-   * @throws  IOException
-   * @throws  ClassFormatException
-   */
-  private final void readAttributes() throws IOException, ClassFormatException
-  {
-    int attributes_count;
-
-    attributes_count = file.readUnsignedShort();
-    attributes       = new Attribute[attributes_count];
-
-    for(int i=0; i < attributes_count; i++)
-      attributes[i] = Attribute.readAttribute(file, constant_pool);
-  }
-
-  /**
-   * Read information about the class and its super class.
-   * @throws  IOException
-   * @throws  ClassFormatException
-   */
-  private final void readClassInfo() throws IOException, ClassFormatException
-  {
-    access_flags = file.readUnsignedShort();
-
-    /* Interfaces are implicitely abstract, the flag should be set
-     * according to the JVM specification.
-     */
-    if((access_flags & Constants.ACC_INTERFACE) != 0)
-      access_flags |= Constants.ACC_ABSTRACT;
-
-    if(((access_flags & Constants.ACC_ABSTRACT) != 0) && 
-       ((access_flags & Constants.ACC_FINAL)    != 0 ))
-      throw new ClassFormatException("Class can't be both final and abstract");
-
-    class_name_index      = file.readUnsignedShort();
-    superclass_name_index = file.readUnsignedShort();
-  }    
-  /**
-   * Read constant pool entries.
-   * @throws  IOException
-   * @throws  ClassFormatException
-   */
-  private final void readConstantPool() throws IOException, ClassFormatException
-  {
-    constant_pool = new ConstantPool(file);
-  }    
-
-  /**
-   * Read information about the fields of the class, i.e., its variables.
-   * @throws  IOException
-   * @throws  ClassFormatException
-   */
-  private final void readFields() throws IOException, ClassFormatException
-  {
-    int fields_count;
-
-    fields_count = file.readUnsignedShort();
-    fields       = new Field[fields_count];
-
-    for(int i=0; i < fields_count; i++)
-      fields[i] = new Field(file, constant_pool);
-  }    
-
-  /******************** Private utility methods **********************/
-
-  /**
-   * Check whether the header of the file is ok.
-   * Of course, this has to be the first action on successive file reads.
-   * @throws  IOException
-   * @throws  ClassFormatException
-   */
-  private final void readID() throws IOException, ClassFormatException
-  {
-    int magic = 0xCAFEBABE;
-
-    if(file.readInt() != magic)
-      throw new ClassFormatException(file_name + " is not a Java .class file");
-  }    
-  /**
-   * Read information about the interfaces implemented by this class.
-   * @throws  IOException
-   * @throws  ClassFormatException
-   */
-  private final void readInterfaces() throws IOException, ClassFormatException
-  {
-    int interfaces_count;
-
-    interfaces_count = file.readUnsignedShort();
-    interfaces       = new int[interfaces_count];
-
-    for(int i=0; i < interfaces_count; i++)
-      interfaces[i] = file.readUnsignedShort();
-  }     
-  /**
-   * Read information about the methods of the class.
-   * @throws  IOException
-   * @throws  ClassFormatException
-   */
-  private final void readMethods() throws IOException, ClassFormatException
-  {
-    int methods_count;
-
-    methods_count = file.readUnsignedShort();
-    methods       = new Method[methods_count];
-
-    for(int i=0; i < methods_count; i++)
-      methods[i] = new Method(file, constant_pool);
-  }      
-  /**
-   * Read major and minor version of compiler which created the file.
-   * @throws  IOException
-   * @throws  ClassFormatException
-   */
-  private final void readVersion() throws IOException, ClassFormatException
-  {
-    minor = file.readUnsignedShort();
-    major = file.readUnsignedShort();
-  }    
+
+    private DataInputStream file;
+    private boolean fileOwned;
+    private String file_name;
+    private String zip_file;
+    private int class_name_index, superclass_name_index;
+    private int major, minor; // Compiler version
+    private int access_flags; // Access rights of parsed class
+    private int[] interfaces; // Names of implemented interfaces
+    private ConstantPool constant_pool; // collection of constants
+    private Field[] fields; // class fields, i.e., its variables
+    private Method[] methods; // methods defined in the class
+    private Attribute[] attributes; // attributes defined in the class
+    private boolean is_zip; // Loaded from zip file
+    private static final int BUFSIZE = 8192;
+
+
+    /**
+     * Parse class from the given stream.
+     *
+     * @param file Input stream
+     * @param file_name File name
+     */
+    public ClassParser(InputStream file, String file_name) {
+        this.file_name = file_name;
+        fileOwned = false;
+        String clazz = file.getClass().getName(); // Not a very clean solution ...
+        is_zip = clazz.startsWith("java.util.zip.") || clazz.startsWith("java.util.jar.");
+        if (file instanceof DataInputStream) {
+            this.file = (DataInputStream) file;
+        } else {
+            this.file = new DataInputStream(new BufferedInputStream(file, BUFSIZE));
+        }
+    }
+
+
+    /** Parse class from given .class file.
+     *
+     * @param file_name file name
+     */
+    public ClassParser(String file_name) throws IOException {
+        is_zip = false;
+        this.file_name = file_name;
+        fileOwned = true;
+    }
+
+
+    /** Parse class from given .class file in a ZIP-archive
+     *
+     * @param zip_file zip file name
+     * @param file_name file name
+     */
+    public ClassParser(String zip_file, String file_name) {
+        is_zip = true;
+        fileOwned = true;
+        this.zip_file = zip_file;
+        this.file_name = file_name;
+    }
+
+
+    /**
+     * Parse the given Java class file and return an object that represents
+     * the contained data, i.e., constants, methods, fields and commands.
+     * A <em>ClassFormatException</em> is raised, if the file is not a valid
+     * .class file. (This does not include verification of the byte code as it
+     * is performed by the java interpreter).
+     *
+     * @return Class object representing the parsed class file
+     * @throws  IOException
+     * @throws  ClassFormatException
+     */
+    public JavaClass parse() throws IOException, ClassFormatException {
+        ZipFile zip = null;
+        try {
+            if (fileOwned) {
+                if (is_zip) {
+                    zip = new ZipFile(zip_file);
+                    ZipEntry entry = zip.getEntry(file_name);
+                    file = new DataInputStream(new BufferedInputStream(zip.getInputStream(entry),
+                            BUFSIZE));
+                } else {
+                    file = new DataInputStream(new BufferedInputStream(new FileInputStream(
+                            file_name), BUFSIZE));
+                }
+            }
+            /****************** Read headers ********************************/
+            // Check magic tag of class file
+            readID();
+            // Get compiler version
+            readVersion();
+            /****************** Read constant pool and related **************/
+            // Read constant pool entries
+            readConstantPool();
+            // Get class information
+            readClassInfo();
+            // Get interface information, i.e., implemented interfaces
+            readInterfaces();
+            /****************** Read class fields and methods ***************/
+            // Read class fields, i.e., the variables of the class
+            readFields();
+            // Read class methods, i.e., the functions in the class
+            readMethods();
+            // Read class attributes
+            readAttributes();
+            // Check for unknown variables
+            //Unknown[] u = Unknown.getUnknownAttributes();
+            //for(int i=0; i < u.length; i++)
+            //  System.err.println("WARNING: " + u[i]);
+            // Everything should have been read now
+            //      if(file.available() > 0) {
+            //        int bytes = file.available();
+            //        byte[] buf = new byte[bytes];
+            //        file.read(buf);
+            //        if(!(is_zip && (buf.length == 1))) {
+            //  	System.err.println("WARNING: Trailing garbage at end of " + file_name);
+            //  	System.err.println(bytes + " extra bytes: " + Utility.toHexString(buf));
+            //        }
+            //      }
+        } finally {
+            // Read everything of interest, so close the file
+            if (fileOwned) {
+                file.close();
+                if (zip != null) {
+                    zip.close();
+                }
+            }
+        }
+        // Return the information we have gathered in a new object
+        return new JavaClass(class_name_index, superclass_name_index, file_name, major, minor,
+                access_flags, constant_pool, interfaces, fields, methods, attributes, is_zip
+                        ? JavaClass.ZIP
+                        : JavaClass.FILE);
+    }
+
+
+    /**
+     * Read information about the attributes of the class.
+     * @throws  IOException
+     * @throws  ClassFormatException
+     */
+    private final void readAttributes() throws IOException, ClassFormatException {
+        int attributes_count;
+        attributes_count = file.readUnsignedShort();
+        attributes = new Attribute[attributes_count];
+        for (int i = 0; i < attributes_count; i++) {
+            attributes[i] = Attribute.readAttribute(file, constant_pool);
+        }
+    }
+
+
+    /**
+     * Read information about the class and its super class.
+     * @throws  IOException
+     * @throws  ClassFormatException
+     */
+    private final void readClassInfo() throws IOException, ClassFormatException {
+        access_flags = file.readUnsignedShort();
+        /* Interfaces are implicitely abstract, the flag should be set
+         * according to the JVM specification.
+         */
+        if ((access_flags & Constants.ACC_INTERFACE) != 0) {
+            access_flags |= Constants.ACC_ABSTRACT;
+        }
+        if (((access_flags & Constants.ACC_ABSTRACT) != 0)
+                && ((access_flags & Constants.ACC_FINAL) != 0)) {
+            throw new ClassFormatException("Class can't be both final and abstract");
+        }
+        class_name_index = file.readUnsignedShort();
+        superclass_name_index = file.readUnsignedShort();
+    }
+
+
+    /**
+     * Read constant pool entries.
+     * @throws  IOException
+     * @throws  ClassFormatException
+     */
+    private final void readConstantPool() throws IOException, ClassFormatException {
+        constant_pool = new ConstantPool(file);
+    }
+
+
+    /**
+     * Read information about the fields of the class, i.e., its variables.
+     * @throws  IOException
+     * @throws  ClassFormatException
+     */
+    private final void readFields() throws IOException, ClassFormatException {
+        int fields_count;
+        fields_count = file.readUnsignedShort();
+        fields = new Field[fields_count];
+        for (int i = 0; i < fields_count; i++) {
+            fields[i] = new Field(file, constant_pool);
+        }
+    }
+
+
+    /******************** Private utility methods **********************/
+    /**
+     * Check whether the header of the file is ok.
+     * Of course, this has to be the first action on successive file reads.
+     * @throws  IOException
+     * @throws  ClassFormatException
+     */
+    private final void readID() throws IOException, ClassFormatException {
+        int magic = 0xCAFEBABE;
+        if (file.readInt() != magic) {
+            throw new ClassFormatException(file_name + " is not a Java .class file");
+        }
+    }
+
+
+    /**
+     * Read information about the interfaces implemented by this class.
+     * @throws  IOException
+     * @throws  ClassFormatException
+     */
+    private final void readInterfaces() throws IOException, ClassFormatException {
+        int interfaces_count;
+        interfaces_count = file.readUnsignedShort();
+        interfaces = new int[interfaces_count];
+        for (int i = 0; i < interfaces_count; i++) {
+            interfaces[i] = file.readUnsignedShort();
+        }
+    }
+
+
+    /**
+     * Read information about the methods of the class.
+     * @throws  IOException
+     * @throws  ClassFormatException
+     */
+    private final void readMethods() throws IOException, ClassFormatException {
+        int methods_count;
+        methods_count = file.readUnsignedShort();
+        methods = new Method[methods_count];
+        for (int i = 0; i < methods_count; i++) {
+            methods[i] = new Method(file, constant_pool);
+        }
+    }
+
+
+    /**
+     * Read major and minor version of compiler which created the file.
+     * @throws  IOException
+     * @throws  ClassFormatException
+     */
+    private final void readVersion() throws IOException, ClassFormatException {
+        minor = file.readUnsignedShort();
+        major = file.readUnsignedShort();
+    }
 }

Modified: jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/Code.java
URL: http://svn.apache.org/viewcvs/jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/Code.java?rev=386056&r1=386055&r2=386056&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/Code.java (original)
+++ jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/Code.java Wed Mar 15 03:31:56 2006
@@ -41,305 +41,312 @@
  * @see LocalVariableTable
  */
 public final class Code extends Attribute {
-  private int             max_stack;   // Maximum size of stack used by this method
-  private int             max_locals;  // Number of local variables
-  private int             code_length; // Length of code in bytes
-  private byte[]          code;        // Actual byte code
-
-  private int             exception_table_length;
-  private CodeException[] exception_table;  // Table of handled exceptions
-  private int             attributes_count; // Attributes of code: LineNumber
-  private Attribute[]     attributes;       // or LocalVariable
-
-  /**
-   * Initialize from another object. Note that both objects use the same
-   * references (shallow copy). Use copy() for a physical copy.
-   */
-  public Code(Code c) {
-    this(c.getNameIndex(), c.getLength(), c.getMaxStack(), c.getMaxLocals(),
-	 c.getCode(), c.getExceptionTable(), c.getAttributes(), 
-	 c.getConstantPool());
-  }
-
-  /**
-   * @param name_index Index pointing to the name <em>Code</em>
-   * @param length Content length in bytes
-   * @param file Input stream
-   * @param constant_pool Array of constants
-   */
-  Code(int name_index, int length, DataInputStream file,
-       ConstantPool constant_pool) throws IOException
-  {
-    // Initialize with some default values which will be overwritten later
-    this(name_index, length,
-	 file.readUnsignedShort(), file.readUnsignedShort(),
-	 (byte[])null, (CodeException[])null, (Attribute[])null,
-	 constant_pool);
-
-    code_length = file.readInt();
-    code = new byte[code_length]; // Read byte code
-    file.readFully(code);
-
-    /* Read exception table that contains all regions where an exception
-     * handler is active, i.e., a try { ... } catch() block.
-     */
-    exception_table_length = file.readUnsignedShort();
-    exception_table        = new CodeException[exception_table_length];
-
-    for(int i=0; i < exception_table_length; i++)
-      exception_table[i] = new CodeException(file);
-
-    /* Read all attributes, currently `LineNumberTable' and
-     * `LocalVariableTable'
-     */
-    attributes_count = file.readUnsignedShort();
-    attributes = new Attribute[attributes_count];
-    for(int i=0; i < attributes_count; i++)
-      attributes[i] = Attribute.readAttribute(file, constant_pool);
-
-    /* Adjust length, because of setAttributes in this(), s.b.  length
-     * is incorrect, because it didn't take the internal attributes
-     * into account yet! Very subtle bug, fixed in 3.1.1.
-     */
-    this.length = length;
-  }
-
-  /**
-   * @param name_index Index pointing to the name <em>Code</em>
-   * @param length Content length in bytes
-   * @param max_stack Maximum size of stack
-   * @param max_locals Number of local variables
-   * @param code Actual byte code
-   * @param exception_table Table of handled exceptions
-   * @param attributes Attributes of code: LineNumber or LocalVariable
-   * @param constant_pool Array of constants
-   */
-  public Code(int name_index, int length, 
-	      int max_stack,  int max_locals,
-	      byte[]          code,
-	      CodeException[] exception_table,
-	      Attribute[]     attributes,
-	      ConstantPool    constant_pool)
-  {
-    super(Constants.ATTR_CODE, name_index, length, constant_pool);
-
-    this.max_stack         = max_stack;
-    this.max_locals        = max_locals;
-
-    setCode(code);
-    setExceptionTable(exception_table);
-    setAttributes(attributes); // Overwrites length!
-  }    
-
-  /**
-   * Called by objects that are traversing the nodes of the tree implicitely
-   * defined by the contents of a Java class. I.e., the hierarchy of methods,
-   * fields, attributes, etc. spawns a tree of objects.
-   *
-   * @param v Visitor object
-   */
-  public void accept(Visitor v) {
-    v.visitCode(this);
-  }
-
-  /**
-   * Dump code attribute to file stream in binary format.
-   *
-   * @param file Output file stream
-   * @throws IOException
-   */ 
-  public final void dump(DataOutputStream file) throws IOException
-  {
-    super.dump(file);
-
-    file.writeShort(max_stack);
-    file.writeShort(max_locals);
-    file.writeInt(code_length);
-    file.write(code, 0, code_length);
-
-    file.writeShort(exception_table_length);
-    for(int i=0; i < exception_table_length; i++)
-      exception_table[i].dump(file);
-	
-    file.writeShort(attributes_count);
-    for(int i=0; i < attributes_count; i++)
-      attributes[i].dump(file);
-  }
-
-  /**
-   * @return Collection of code attributes.
-   * @see Attribute
-   */   
-  public final Attribute[] getAttributes()         { return attributes; }    
-
-  /**
-   * @return LineNumberTable of Code, if it has one
-   */
-  public LineNumberTable getLineNumberTable() {
-    for(int i=0; i < attributes_count; i++)
-      if(attributes[i] instanceof LineNumberTable)
-	return (LineNumberTable)attributes[i];
-
-    return null;
-  }
-
-  /**
-   * @return LocalVariableTable of Code, if it has one
-   */
-  public LocalVariableTable getLocalVariableTable() {
-    for(int i=0; i < attributes_count; i++)
-      if(attributes[i] instanceof LocalVariableTable)
-	return (LocalVariableTable)attributes[i];
-
-    return null;
-  }
-
-  /**
-   * @return Actual byte code of the method.
-   */  
-  public final byte[] getCode()      { return code; }
-
-  /**
-   * @return Table of handled exceptions.
-   * @see CodeException
-   */  
-  public final CodeException[] getExceptionTable() { return exception_table; }
-
-  /**
-   * @return Number of local variables.
-   */  
-  public final int  getMaxLocals() { return max_locals; }
-
-  /**
-   * @return Maximum size of stack used by this method.
-   */
-
-  public final int  getMaxStack()  { return max_stack; }    
-
-  /**
-   * @return the internal length of this code attribute (minus the first 6 bytes) 
-   * and excluding all its attributes
-   */
-  private final int getInternalLength() {
-    return 2 /*max_stack*/ + 2 /*max_locals*/ + 4 /*code length*/ 
-      + code_length /*byte-code*/
-      + 2 /*exception-table length*/ 
-      + 8 * exception_table_length /* exception table */
-      + 2 /* attributes count */;
-  }
-
-  /**
-   * @return the full size of this code attribute, minus its first 6 bytes,
-   * including the size of all its contained attributes
-   */
-  private final int calculateLength() {
-    int len = 0;
-
-    for(int i=0; i < attributes_count; i++)
-      len += attributes[i].length + 6 /*attribute header size*/;
-
-    return len + getInternalLength();
-  }
-
-  /**
-   * @param attributes the attributes to set for this Code
-   */
-  public final void setAttributes(Attribute[] attributes) {
-    this.attributes  = attributes;
-    attributes_count = (attributes == null)? 0 : attributes.length;
-    length = calculateLength(); // Adjust length
-  }
-
-  /**
-   * @param code byte code
-   */
-  public final void setCode(byte[] code) {
-    this.code   = code;
-    code_length = (code == null)? 0 : code.length;
-  }    
-
-  /**
-   * @param exception_table exception table
-   */
-  public final void setExceptionTable(CodeException[] exception_table) {
-    this.exception_table   = exception_table;
-    exception_table_length = (exception_table == null)? 0 :
-      exception_table.length;
-  }
-
-  /**
-   * @param max_locals maximum number of local variables
-   */
-  public final void setMaxLocals(int max_locals) {
-    this.max_locals = max_locals;
-  }
-
-  /**
-   * @param max_stack maximum stack size
-   */
-  public final void setMaxStack(int max_stack) {
-    this.max_stack = max_stack;
-  }
-
-  /**
-   * @return String representation of code chunk.
-   */ 
-  public final String toString(boolean verbose) {
-    StringBuffer buf;
-
-    buf = new StringBuffer(100);
-    buf.append("Code(max_stack = ").append(max_stack)
-			   .append(", max_locals = ").append(max_locals)
-			   .append(", code_length = ").append(code_length).append(")\n")
-			   .append(Utility.codeToString(code, constant_pool, 0, -1, verbose));
-
-    if(exception_table_length > 0) {
-      buf.append("\nException handler(s) = \n").append("From\tTo\tHandler\tType\n");
-
-      for(int i=0; i < exception_table_length; i++)
-        buf.append(exception_table[i].toString(constant_pool, verbose)).append("\n");
-    }
-
-    if(attributes_count > 0) {
-      buf.append("\nAttribute(s) = \n");
-
-      for(int i=0; i < attributes_count; i++)
-        buf.append(attributes[i].toString()).append("\n");
-    }
-
-    return buf.toString();    
-  }
-
-  /**
-   * @return String representation of code chunk.
-   */ 
-  public final String toString() {
-    return toString(true);
-  }
-
-  /**
-   * @return deep copy of this attribute
-   * 
-   * @param _constant_pool the constant pool to duplicate
-   */
-  public Attribute copy(ConstantPool _constant_pool) {
-    Code c = (Code) clone();
-
-    if (code != null) {
-        c.code = new byte[code.length];
-        System.arraycopy(code, 0, c.code, 0, code.length);
-    }
-
-    c.constant_pool = _constant_pool;
-  
-    c.exception_table = new CodeException[exception_table_length];
-    for(int i=0; i < exception_table_length; i++)
-      c.exception_table[i] = exception_table[i].copy();
-
-    c.attributes = new Attribute[attributes_count];
-    for(int i=0; i < attributes_count; i++)
-      c.attributes[i] = attributes[i].copy(_constant_pool);
 
-    return c;
-  }
+    private int max_stack; // Maximum size of stack used by this method
+    private int max_locals; // Number of local variables
+    private int code_length; // Length of code in bytes
+    private byte[] code; // Actual byte code
+    private int exception_table_length;
+    private CodeException[] exception_table; // Table of handled exceptions
+    private int attributes_count; // Attributes of code: LineNumber
+    private Attribute[] attributes; // or LocalVariable
+
+
+    /**
+     * Initialize from another object. Note that both objects use the same
+     * references (shallow copy). Use copy() for a physical copy.
+     */
+    public Code(Code c) {
+        this(c.getNameIndex(), c.getLength(), c.getMaxStack(), c.getMaxLocals(), c.getCode(), c
+                .getExceptionTable(), c.getAttributes(), c.getConstantPool());
+    }
+
+
+    /**
+     * @param name_index Index pointing to the name <em>Code</em>
+     * @param length Content length in bytes
+     * @param file Input stream
+     * @param constant_pool Array of constants
+     */
+    Code(int name_index, int length, DataInputStream file, ConstantPool constant_pool)
+            throws IOException {
+        // Initialize with some default values which will be overwritten later
+        this(name_index, length, file.readUnsignedShort(), file.readUnsignedShort(), (byte[]) null,
+                (CodeException[]) null, (Attribute[]) null, constant_pool);
+        code_length = file.readInt();
+        code = new byte[code_length]; // Read byte code
+        file.readFully(code);
+        /* Read exception table that contains all regions where an exception
+         * handler is active, i.e., a try { ... } catch() block.
+         */
+        exception_table_length = file.readUnsignedShort();
+        exception_table = new CodeException[exception_table_length];
+        for (int i = 0; i < exception_table_length; i++) {
+            exception_table[i] = new CodeException(file);
+        }
+        /* Read all attributes, currently `LineNumberTable' and
+         * `LocalVariableTable'
+         */
+        attributes_count = file.readUnsignedShort();
+        attributes = new Attribute[attributes_count];
+        for (int i = 0; i < attributes_count; i++) {
+            attributes[i] = Attribute.readAttribute(file, constant_pool);
+        }
+        /* Adjust length, because of setAttributes in this(), s.b.  length
+         * is incorrect, because it didn't take the internal attributes
+         * into account yet! Very subtle bug, fixed in 3.1.1.
+         */
+        this.length = length;
+    }
+
+
+    /**
+     * @param name_index Index pointing to the name <em>Code</em>
+     * @param length Content length in bytes
+     * @param max_stack Maximum size of stack
+     * @param max_locals Number of local variables
+     * @param code Actual byte code
+     * @param exception_table Table of handled exceptions
+     * @param attributes Attributes of code: LineNumber or LocalVariable
+     * @param constant_pool Array of constants
+     */
+    public Code(int name_index, int length, int max_stack, int max_locals, byte[] code,
+            CodeException[] exception_table, Attribute[] attributes, ConstantPool constant_pool) {
+        super(Constants.ATTR_CODE, name_index, length, constant_pool);
+        this.max_stack = max_stack;
+        this.max_locals = max_locals;
+        setCode(code);
+        setExceptionTable(exception_table);
+        setAttributes(attributes); // Overwrites length!
+    }
+
+
+    /**
+     * Called by objects that are traversing the nodes of the tree implicitely
+     * defined by the contents of a Java class. I.e., the hierarchy of methods,
+     * fields, attributes, etc. spawns a tree of objects.
+     *
+     * @param v Visitor object
+     */
+    public void accept( Visitor v ) {
+        v.visitCode(this);
+    }
+
+
+    /**
+     * Dump code attribute to file stream in binary format.
+     *
+     * @param file Output file stream
+     * @throws IOException
+     */
+    public final void dump( DataOutputStream file ) throws IOException {
+        super.dump(file);
+        file.writeShort(max_stack);
+        file.writeShort(max_locals);
+        file.writeInt(code_length);
+        file.write(code, 0, code_length);
+        file.writeShort(exception_table_length);
+        for (int i = 0; i < exception_table_length; i++) {
+            exception_table[i].dump(file);
+        }
+        file.writeShort(attributes_count);
+        for (int i = 0; i < attributes_count; i++) {
+            attributes[i].dump(file);
+        }
+    }
+
+
+    /**
+     * @return Collection of code attributes.
+     * @see Attribute
+     */
+    public final Attribute[] getAttributes() {
+        return attributes;
+    }
+
+
+    /**
+     * @return LineNumberTable of Code, if it has one
+     */
+    public LineNumberTable getLineNumberTable() {
+        for (int i = 0; i < attributes_count; i++) {
+            if (attributes[i] instanceof LineNumberTable) {
+                return (LineNumberTable) attributes[i];
+            }
+        }
+        return null;
+    }
+
+
+    /**
+     * @return LocalVariableTable of Code, if it has one
+     */
+    public LocalVariableTable getLocalVariableTable() {
+        for (int i = 0; i < attributes_count; i++) {
+            if (attributes[i] instanceof LocalVariableTable) {
+                return (LocalVariableTable) attributes[i];
+            }
+        }
+        return null;
+    }
+
+
+    /**
+     * @return Actual byte code of the method.
+     */
+    public final byte[] getCode() {
+        return code;
+    }
+
+
+    /**
+     * @return Table of handled exceptions.
+     * @see CodeException
+     */
+    public final CodeException[] getExceptionTable() {
+        return exception_table;
+    }
+
+
+    /**
+     * @return Number of local variables.
+     */
+    public final int getMaxLocals() {
+        return max_locals;
+    }
+
+
+    /**
+     * @return Maximum size of stack used by this method.
+     */
+    public final int getMaxStack() {
+        return max_stack;
+    }
+
+
+    /**
+     * @return the internal length of this code attribute (minus the first 6 bytes) 
+     * and excluding all its attributes
+     */
+    private final int getInternalLength() {
+        return 2 /*max_stack*/+ 2 /*max_locals*/+ 4 /*code length*/
+                + code_length /*byte-code*/
+                + 2 /*exception-table length*/
+                + 8 * exception_table_length /* exception table */
+                + 2 /* attributes count */;
+    }
+
+
+    /**
+     * @return the full size of this code attribute, minus its first 6 bytes,
+     * including the size of all its contained attributes
+     */
+    private final int calculateLength() {
+        int len = 0;
+        for (int i = 0; i < attributes_count; i++) {
+            len += attributes[i].length + 6 /*attribute header size*/;
+        }
+        return len + getInternalLength();
+    }
+
+
+    /**
+     * @param attributes the attributes to set for this Code
+     */
+    public final void setAttributes( Attribute[] attributes ) {
+        this.attributes = attributes;
+        attributes_count = (attributes == null) ? 0 : attributes.length;
+        length = calculateLength(); // Adjust length
+    }
+
+
+    /**
+     * @param code byte code
+     */
+    public final void setCode( byte[] code ) {
+        this.code = code;
+        code_length = (code == null) ? 0 : code.length;
+    }
+
+
+    /**
+     * @param exception_table exception table
+     */
+    public final void setExceptionTable( CodeException[] exception_table ) {
+        this.exception_table = exception_table;
+        exception_table_length = (exception_table == null) ? 0 : exception_table.length;
+    }
+
+
+    /**
+     * @param max_locals maximum number of local variables
+     */
+    public final void setMaxLocals( int max_locals ) {
+        this.max_locals = max_locals;
+    }
+
+
+    /**
+     * @param max_stack maximum stack size
+     */
+    public final void setMaxStack( int max_stack ) {
+        this.max_stack = max_stack;
+    }
+
+
+    /**
+     * @return String representation of code chunk.
+     */
+    public final String toString( boolean verbose ) {
+        StringBuffer buf;
+        buf = new StringBuffer(100);
+        buf.append("Code(max_stack = ").append(max_stack).append(", max_locals = ").append(
+                max_locals).append(", code_length = ").append(code_length).append(")\n").append(
+                Utility.codeToString(code, constant_pool, 0, -1, verbose));
+        if (exception_table_length > 0) {
+            buf.append("\nException handler(s) = \n").append("From\tTo\tHandler\tType\n");
+            for (int i = 0; i < exception_table_length; i++) {
+                buf.append(exception_table[i].toString(constant_pool, verbose)).append("\n");
+            }
+        }
+        if (attributes_count > 0) {
+            buf.append("\nAttribute(s) = \n");
+            for (int i = 0; i < attributes_count; i++) {
+                buf.append(attributes[i].toString()).append("\n");
+            }
+        }
+        return buf.toString();
+    }
+
+
+    /**
+     * @return String representation of code chunk.
+     */
+    public final String toString() {
+        return toString(true);
+    }
+
+
+    /**
+     * @return deep copy of this attribute
+     * 
+     * @param _constant_pool the constant pool to duplicate
+     */
+    public Attribute copy( ConstantPool _constant_pool ) {
+        Code c = (Code) clone();
+        if (code != null) {
+            c.code = new byte[code.length];
+            System.arraycopy(code, 0, c.code, 0, code.length);
+        }
+        c.constant_pool = _constant_pool;
+        c.exception_table = new CodeException[exception_table_length];
+        for (int i = 0; i < exception_table_length; i++) {
+            c.exception_table[i] = exception_table[i].copy();
+        }
+        c.attributes = new Attribute[attributes_count];
+        for (int i = 0; i < attributes_count; i++) {
+            c.attributes[i] = attributes[i].copy(_constant_pool);
+        }
+        return c;
+    }
 }

Modified: jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/CodeException.java
URL: http://svn.apache.org/viewcvs/jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/CodeException.java?rev=386056&r1=386055&r2=386056&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/CodeException.java (original)
+++ jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/CodeException.java Wed Mar 15 03:31:56 2006
@@ -16,7 +16,6 @@
  */
 package org.apache.bcel.classfile;
 
-
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
@@ -32,164 +31,184 @@
  * @author  <A HREF="mailto:[email protected]">M. Dahm</A>
  * @see     Code
  */
-public final class CodeException
-  implements Cloneable, Constants, Node, Serializable
-{
-  private int start_pc;   // Range in the code the exception handler is
-  private int end_pc;     // active. start_pc is inclusive, end_pc exclusive
-  private int handler_pc; /* Starting address of exception handler, i.e.,
-			   * an offset from start of code.
-			   */
-  private int catch_type; /* If this is zero the handler catches any
-			   * exception, otherwise it points to the
-			   * exception class which is to be caught.
-			   */
-  /**
-   * Initialize from another object.
-   */
-  public CodeException(CodeException c) {
-    this(c.getStartPC(), c.getEndPC(), c.getHandlerPC(), c.getCatchType());
-  }
-
-  /**
-   * Construct object from file stream.
-   * @param file Input stream
-   * @throws IOException
-   */  
-  CodeException(DataInputStream file) throws IOException
-  {
-    this(file.readUnsignedShort(), file.readUnsignedShort(),
-	 file.readUnsignedShort(), file.readUnsignedShort());
-  }
-
-  /**
-   * @param start_pc Range in the code the exception handler is active,
-   * start_pc is inclusive while
-   * @param end_pc is exclusive
-   * @param handler_pc Starting address of exception handler, i.e.,
-   * an offset from start of code.
-   * @param catch_type If zero the handler catches any 
-   * exception, otherwise it points to the exception class which is 
-   * to be caught.
-   */
-  public CodeException(int start_pc, int end_pc, int handler_pc,
-		       int catch_type)
-  {
-    this.start_pc   = start_pc;
-    this.end_pc     = end_pc;
-    this.handler_pc = handler_pc;
-    this.catch_type = catch_type;
-  }
-
-  /**
-   * Called by objects that are traversing the nodes of the tree implicitely
-   * defined by the contents of a Java class. I.e., the hierarchy of methods,
-   * fields, attributes, etc. spawns a tree of objects.
-   *
-   * @param v Visitor object
-   */
-  public void accept(Visitor v) {
-    v.visitCodeException(this);
-  }    
-  /**
-   * Dump code exception to file stream in binary format.
-   *
-   * @param file Output file stream
-   * @throws IOException
-   */ 
-  public final void dump(DataOutputStream file) throws IOException
-  {
-    file.writeShort(start_pc);
-    file.writeShort(end_pc);
-    file.writeShort(handler_pc);
-    file.writeShort(catch_type);
-  }
-
-  /**
-   * @return 0, if the handler catches any exception, otherwise it points to
-   * the exception class which is to be caught.
-   */  
-  public final int getCatchType() { return catch_type; }    
-
-  /**
-   * @return Exclusive end index of the region where the handler is active.
-   */  
-  public final int getEndPC() { return end_pc; }
-
-  /**
-   * @return Starting address of exception handler, relative to the code.
-   */  
-  public final int getHandlerPC() { return handler_pc; }
-
-  /**
-   * @return Inclusive start index of the region where the handler is active.
-   */
-  public final int getStartPC() { return start_pc; }
-
-  /**
-   * @param catch_type the type of exception that is caught
-   */
-  public final void setCatchType(int catch_type) {
-    this.catch_type = catch_type;
-  }
-
-  /**
-   * @param end_pc end of handled block
-   */
-  public final void setEndPC(int end_pc) {
-    this.end_pc = end_pc;
-  }
-
-  /**
-   * @param handler_pc where the actual code is
-   */
-  public final void setHandlerPC(int handler_pc) {
-    this.handler_pc = handler_pc;
-  }
-
-  /**
-   * @param start_pc start of handled block
-   */
-  public final void setStartPC(int start_pc) {
-    this.start_pc = start_pc;
-  }    
-
-  /**
-   * @return String representation.
-   */ 
-  public final String toString() {
-    return "CodeException(start_pc = " + start_pc + 
-      ", end_pc = " + end_pc +
-      ", handler_pc = " + handler_pc + ", catch_type = " + catch_type + ")";
-  }    
-
-  /**
-   * @return String representation.
-   */ 
-  public final String toString(ConstantPool cp, boolean verbose) {
-    String str;
-
-    if(catch_type == 0)
-      str = "<Any exception>(0)";
-    else
-      str = Utility.compactClassName(cp.getConstantString(catch_type, CONSTANT_Class), false) +
-	(verbose? "(" + catch_type + ")" : "");
-
-    return start_pc + "\t" + end_pc + "\t" + handler_pc + "\t" + str;
-  }
-
-  public final String toString(ConstantPool cp) {
-    return toString(cp, true);
-  }
-
-  /**
-   * @return deep copy of this object
-   */
-  public CodeException copy() {
-    try {
-      return (CodeException)clone();
-    } catch(CloneNotSupportedException e) {}
+public final class CodeException implements Cloneable, Constants, Node, Serializable {
 
-    return null;
-  }
+    private int start_pc; // Range in the code the exception handler is
+    private int end_pc; // active. start_pc is inclusive, end_pc exclusive
+    private int handler_pc; /* Starting address of exception handler, i.e.,
+     * an offset from start of code.
+     */
+    private int catch_type; /* If this is zero the handler catches any
+     * exception, otherwise it points to the
+     * exception class which is to be caught.
+     */
+
+
+    /**
+     * Initialize from another object.
+     */
+    public CodeException(CodeException c) {
+        this(c.getStartPC(), c.getEndPC(), c.getHandlerPC(), c.getCatchType());
+    }
+
+
+    /**
+     * Construct object from file stream.
+     * @param file Input stream
+     * @throws IOException
+     */
+    CodeException(DataInputStream file) throws IOException {
+        this(file.readUnsignedShort(), file.readUnsignedShort(), file.readUnsignedShort(), file
+                .readUnsignedShort());
+    }
+
+
+    /**
+     * @param start_pc Range in the code the exception handler is active,
+     * start_pc is inclusive while
+     * @param end_pc is exclusive
+     * @param handler_pc Starting address of exception handler, i.e.,
+     * an offset from start of code.
+     * @param catch_type If zero the handler catches any 
+     * exception, otherwise it points to the exception class which is 
+     * to be caught.
+     */
+    public CodeException(int start_pc, int end_pc, int handler_pc, int catch_type) {
+        this.start_pc = start_pc;
+        this.end_pc = end_pc;
+        this.handler_pc = handler_pc;
+        this.catch_type = catch_type;
+    }
+
+
+    /**
+     * Called by objects that are traversing the nodes of the tree implicitely
+     * defined by the contents of a Java class. I.e., the hierarchy of methods,
+     * fields, attributes, etc. spawns a tree of objects.
+     *
+     * @param v Visitor object
+     */
+    public void accept( Visitor v ) {
+        v.visitCodeException(this);
+    }
+
+
+    /**
+     * Dump code exception to file stream in binary format.
+     *
+     * @param file Output file stream
+     * @throws IOException
+     */
+    public final void dump( DataOutputStream file ) throws IOException {
+        file.writeShort(start_pc);
+        file.writeShort(end_pc);
+        file.writeShort(handler_pc);
+        file.writeShort(catch_type);
+    }
+
+
+    /**
+     * @return 0, if the handler catches any exception, otherwise it points to
+     * the exception class which is to be caught.
+     */
+    public final int getCatchType() {
+        return catch_type;
+    }
+
+
+    /**
+     * @return Exclusive end index of the region where the handler is active.
+     */
+    public final int getEndPC() {
+        return end_pc;
+    }
+
+
+    /**
+     * @return Starting address of exception handler, relative to the code.
+     */
+    public final int getHandlerPC() {
+        return handler_pc;
+    }
+
+
+    /**
+     * @return Inclusive start index of the region where the handler is active.
+     */
+    public final int getStartPC() {
+        return start_pc;
+    }
+
+
+    /**
+     * @param catch_type the type of exception that is caught
+     */
+    public final void setCatchType( int catch_type ) {
+        this.catch_type = catch_type;
+    }
+
+
+    /**
+     * @param end_pc end of handled block
+     */
+    public final void setEndPC( int end_pc ) {
+        this.end_pc = end_pc;
+    }
+
+
+    /**
+     * @param handler_pc where the actual code is
+     */
+    public final void setHandlerPC( int handler_pc ) {
+        this.handler_pc = handler_pc;
+    }
+
+
+    /**
+     * @param start_pc start of handled block
+     */
+    public final void setStartPC( int start_pc ) {
+        this.start_pc = start_pc;
+    }
+
+
+    /**
+     * @return String representation.
+     */
+    public final String toString() {
+        return "CodeException(start_pc = " + start_pc + ", end_pc = " + end_pc + ", handler_pc = "
+                + handler_pc + ", catch_type = " + catch_type + ")";
+    }
+
+
+    /**
+     * @return String representation.
+     */
+    public final String toString( ConstantPool cp, boolean verbose ) {
+        String str;
+        if (catch_type == 0) {
+            str = "<Any exception>(0)";
+        } else {
+            str = Utility.compactClassName(cp.getConstantString(catch_type, CONSTANT_Class), false)
+                    + (verbose ? "(" + catch_type + ")" : "");
+        }
+        return start_pc + "\t" + end_pc + "\t" + handler_pc + "\t" + str;
+    }
+
+
+    public final String toString( ConstantPool cp ) {
+        return toString(cp, true);
+    }
+
+
+    /**
+     * @return deep copy of this object
+     */
+    public CodeException copy() {
+        try {
+            return (CodeException) clone();
+        } catch (CloneNotSupportedException e) {
+        }
+        return null;
+    }
 }

Modified: jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/Constant.java
URL: http://svn.apache.org/viewcvs/jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/Constant.java?rev=386056&r1=386055&r2=386056&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/Constant.java (original)
+++ jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/Constant.java Wed Mar 15 03:31:56 2006
@@ -32,133 +32,157 @@
  * @author  <A HREF="mailto:[email protected]">M. Dahm</A>
  */
 public abstract class Constant implements Cloneable, Node, Serializable {
-	private static BCELComparator _cmp = new BCELComparator() {
-		public boolean equals(Object o1, Object o2) {
-			Constant THIS = (Constant)o1;
-			Constant THAT = (Constant)o2;
-
-			return THIS.toString().equals(THAT.toString());
-		}
-
-		public int hashCode(Object o) {
-			Constant THIS = (Constant)o;
-			return THIS.toString().hashCode();
-		}
-	};
-
-  /* In fact this tag is redundant since we can distinguish different
-   * `Constant' objects by their type, i.e., via `instanceof'. In some
-   * places we will use the tag for switch()es anyway.
-   *
-   * First, we want match the specification as closely as possible. Second we
-   * need the tag as an index to select the corresponding class name from the 
-   * `CONSTANT_NAMES' array.
-   */
-  protected byte tag;
-
-  Constant(byte tag) { this.tag = tag; }
-
-  /**
-   * Called by objects that are traversing the nodes of the tree implicitely
-   * defined by the contents of a Java class. I.e., the hierarchy of methods,
-   * fields, attributes, etc. spawns a tree of objects.
-   *
-   * @param v Visitor object
-   */
-  public abstract void accept(Visitor v);    
-
-  public abstract void dump(DataOutputStream file) throws IOException;    
-
-  /**
-   * @return Tag of constant, i.e., its type. No setTag() method to avoid
-   * confusion.
-   */
-  public final byte getTag() { return tag; }
-
-  /**
-   * @return String representation.
-   */  
-  public String toString() {
-    return Constants.CONSTANT_NAMES[tag] + "[" + tag + "]";
-  }    
-
-  /**
-   * @return deep copy of this constant
-   */
-  public Constant copy() {
-    try {
-      return (Constant)super.clone();
-    } catch(CloneNotSupportedException e) {}
-
-    return null;
-  }
-
-  public Object clone() throws CloneNotSupportedException {
-    return super.clone();
-  }
-
-  /**
-   * Read one constant from the given file, the type depends on a tag byte.
-   *
-   * @param file Input stream
-   * @return Constant object
-   */
-  static final Constant readConstant(DataInputStream file)
-    throws IOException, ClassFormatException
-  {
-    byte b = file.readByte(); // Read tag byte
-
-    switch(b) {
-    case Constants.CONSTANT_Class:              return new ConstantClass(file);
-    case Constants.CONSTANT_Fieldref:           return new ConstantFieldref(file);
-    case Constants.CONSTANT_Methodref:          return new ConstantMethodref(file);
-    case Constants.CONSTANT_InterfaceMethodref: return new 
-					ConstantInterfaceMethodref(file);
-    case Constants.CONSTANT_String:             return new ConstantString(file);
-    case Constants.CONSTANT_Integer:            return new ConstantInteger(file);
-    case Constants.CONSTANT_Float:              return new ConstantFloat(file);
-    case Constants.CONSTANT_Long:               return new ConstantLong(file);
-    case Constants.CONSTANT_Double:             return new ConstantDouble(file);
-    case Constants.CONSTANT_NameAndType:        return new ConstantNameAndType(file);
-    case Constants.CONSTANT_Utf8:               return new ConstantUtf8(file);
-    default:                          
-      throw new ClassFormatException("Invalid byte tag in constant pool: " + b);
-    }
-  }
-  
-  
-	/**
-	 * @return Comparison strategy object
-	 */
-	public static BCELComparator getComparator() {
-		return _cmp;
-	}
-
-	/**
-	 * @param comparator Comparison strategy object
-	 */
-	public static void setComparator(BCELComparator comparator) {
-		_cmp = comparator;
-	}
-
-	/**
-	 * Return value as defined by given BCELComparator strategy.
-	 * By default two Constant objects are said to be equal when
-	 * the result of toString() is equal.
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		return _cmp.equals(this, obj);
-	}
-
-	/**
-	 * Return value as defined by given BCELComparator strategy.
-	 * By default return the hashcode of the result of toString().
-	 * 
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return _cmp.hashCode(this);
-	}
+
+    private static BCELComparator _cmp = new BCELComparator() {
+
+        public boolean equals( Object o1, Object o2 ) {
+            Constant THIS = (Constant) o1;
+            Constant THAT = (Constant) o2;
+            return THIS.toString().equals(THAT.toString());
+        }
+
+
+        public int hashCode( Object o ) {
+            Constant THIS = (Constant) o;
+            return THIS.toString().hashCode();
+        }
+    };
+    /* In fact this tag is redundant since we can distinguish different
+     * `Constant' objects by their type, i.e., via `instanceof'. In some
+     * places we will use the tag for switch()es anyway.
+     *
+     * First, we want match the specification as closely as possible. Second we
+     * need the tag as an index to select the corresponding class name from the 
+     * `CONSTANT_NAMES' array.
+     */
+    protected byte tag;
+
+
+    Constant(byte tag) {
+        this.tag = tag;
+    }
+
+
+    /**
+     * Called by objects that are traversing the nodes of the tree implicitely
+     * defined by the contents of a Java class. I.e., the hierarchy of methods,
+     * fields, attributes, etc. spawns a tree of objects.
+     *
+     * @param v Visitor object
+     */
+    public abstract void accept( Visitor v );
+
+
+    public abstract void dump( DataOutputStream file ) throws IOException;
+
+
+    /**
+     * @return Tag of constant, i.e., its type. No setTag() method to avoid
+     * confusion.
+     */
+    public final byte getTag() {
+        return tag;
+    }
+
+
+    /**
+     * @return String representation.
+     */
+    public String toString() {
+        return Constants.CONSTANT_NAMES[tag] + "[" + tag + "]";
+    }
+
+
+    /**
+     * @return deep copy of this constant
+     */
+    public Constant copy() {
+        try {
+            return (Constant) super.clone();
+        } catch (CloneNotSupportedException e) {
+        }
+        return null;
+    }
+
+
+    public Object clone() throws CloneNotSupportedException {
+        return super.clone();
+    }
+
+
+    /**
+     * Read one constant from the given file, the type depends on a tag byte.
+     *
+     * @param file Input stream
+     * @return Constant object
+     */
+    static final Constant readConstant( DataInputStream file ) throws IOException,
+            ClassFormatException {
+        byte b = file.readByte(); // Read tag byte
+        switch (b) {
+            case Constants.CONSTANT_Class:
+                return new ConstantClass(file);
+            case Constants.CONSTANT_Fieldref:
+                return new ConstantFieldref(file);
+            case Constants.CONSTANT_Methodref:
+                return new ConstantMethodref(file);
+            case Constants.CONSTANT_InterfaceMethodref:
+                return new ConstantInterfaceMethodref(file);
+            case Constants.CONSTANT_String:
+                return new ConstantString(file);
+            case Constants.CONSTANT_Integer:
+                return new ConstantInteger(file);
+            case Constants.CONSTANT_Float:
+                return new ConstantFloat(file);
+            case Constants.CONSTANT_Long:
+                return new ConstantLong(file);
+            case Constants.CONSTANT_Double:
+                return new ConstantDouble(file);
+            case Constants.CONSTANT_NameAndType:
+                return new ConstantNameAndType(file);
+            case Constants.CONSTANT_Utf8:
+                return new ConstantUtf8(file);
+            default:
+                throw new ClassFormatException("Invalid byte tag in constant pool: " + b);
+        }
+    }
+
+
+    /**
+     * @return Comparison strategy object
+     */
+    public static BCELComparator getComparator() {
+        return _cmp;
+    }
+
+
+    /**
+     * @param comparator Comparison strategy object
+     */
+    public static void setComparator( BCELComparator comparator ) {
+        _cmp = comparator;
+    }
+
+
+    /**
+     * Return value as defined by given BCELComparator strategy.
+     * By default two Constant objects are said to be equal when
+     * the result of toString() is equal.
+     * 
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    public boolean equals( Object obj ) {
+        return _cmp.equals(this, obj);
+    }
+
+
+    /**
+     * Return value as defined by given BCELComparator strategy.
+     * By default return the hashcode of the result of toString().
+     * 
+     * @see java.lang.Object#hashCode()
+     */
+    public int hashCode() {
+        return _cmp.hashCode(this);
+    }
 }

Modified: jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/ConstantCP.java
URL: http://svn.apache.org/viewcvs/jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/ConstantCP.java?rev=386056&r1=386055&r2=386056&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/ConstantCP.java (original)
+++ jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/ConstantCP.java Wed Mar 15 03:31:56 2006
@@ -31,89 +31,101 @@
  * @see     ConstantInterfaceMethodref
  */
 public abstract class ConstantCP extends Constant {
-  /** References to the constants containing the class and the field signature
-   */
-  protected int class_index, name_and_type_index; 
-
-  /**
-   * Initialize from another object.
-   */
-  public ConstantCP(ConstantCP c) {
-    this(c.getTag(), c.getClassIndex(), c.getNameAndTypeIndex());
-  }  
-  
-  /**
-   * Initialize instance from file data.
-   *
-   * @param tag  Constant type tag
-   * @param file Input stream
-   * @throws IOException
-   */
-  ConstantCP(byte tag, DataInputStream file) throws IOException
-  {
-    this(tag, file.readUnsignedShort(), file.readUnsignedShort());
-  }
-
-  /**
-   * @param class_index Reference to the class containing the field
-   * @param name_and_type_index and the field signature
-   */
-  protected ConstantCP(byte tag, int class_index, 
-		       int name_and_type_index) {
-    super(tag);
-    this.class_index         = class_index;
-    this.name_and_type_index = name_and_type_index;
-  }
-
-  /** 
-   * Dump constant field reference to file stream in binary format.
-   *
-   * @param file Output file stream
-   * @throws IOException
-   */ 
-  public final void dump(DataOutputStream file) throws IOException
-  {
-    file.writeByte(tag);
-    file.writeShort(class_index);
-    file.writeShort(name_and_type_index);
-  }    
-
-  /**
-   * @return Reference (index) to class this field or method belongs to.
-   */  
-  public final int getClassIndex()       { return class_index; }    
-
-  /**
-   * @return Reference (index) to signature of the field.
-   */  
-  public final int getNameAndTypeIndex() { return name_and_type_index; }    
-
-  /**
-   * @param class_index points to Constant_class 
-   */
-  public final void setClassIndex(int class_index) {
-    this.class_index = class_index;
-  }    
-
-  /**
-   * @return Class this field belongs to.
-   */  
-  public String getClass(ConstantPool cp) {
-    return cp.constantToString(class_index, Constants.CONSTANT_Class);
-  }
-
-  /**
-   * @param name_and_type_index points to Constant_NameAndType
-   */
-  public final void setNameAndTypeIndex(int name_and_type_index) {
-    this.name_and_type_index = name_and_type_index;
-  }
-
-  /**
-   * @return String representation.
-   */
-  public final String toString() {
-    return super.toString() + "(class_index = " + class_index +
-      ", name_and_type_index = " + name_and_type_index + ")";
-  }    
+
+    /** References to the constants containing the class and the field signature
+     */
+    protected int class_index, name_and_type_index;
+
+
+    /**
+     * Initialize from another object.
+     */
+    public ConstantCP(ConstantCP c) {
+        this(c.getTag(), c.getClassIndex(), c.getNameAndTypeIndex());
+    }
+
+
+    /**
+     * Initialize instance from file data.
+     *
+     * @param tag  Constant type tag
+     * @param file Input stream
+     * @throws IOException
+     */
+    ConstantCP(byte tag, DataInputStream file) throws IOException {
+        this(tag, file.readUnsignedShort(), file.readUnsignedShort());
+    }
+
+
+    /**
+     * @param class_index Reference to the class containing the field
+     * @param name_and_type_index and the field signature
+     */
+    protected ConstantCP(byte tag, int class_index, int name_and_type_index) {
+        super(tag);
+        this.class_index = class_index;
+        this.name_and_type_index = name_and_type_index;
+    }
+
+
+    /** 
+     * Dump constant field reference to file stream in binary format.
+     *
+     * @param file Output file stream
+     * @throws IOException
+     */
+    public final void dump( DataOutputStream file ) throws IOException {
+        file.writeByte(tag);
+        file.writeShort(class_index);
+        file.writeShort(name_and_type_index);
+    }
+
+
+    /**
+     * @return Reference (index) to class this field or method belongs to.
+     */
+    public final int getClassIndex() {
+        return class_index;
+    }
+
+
+    /**
+     * @return Reference (index) to signature of the field.
+     */
+    public final int getNameAndTypeIndex() {
+        return name_and_type_index;
+    }
+
+
+    /**
+     * @param class_index points to Constant_class 
+     */
+    public final void setClassIndex( int class_index ) {
+        this.class_index = class_index;
+    }
+
+
+    /**
+     * @return Class this field belongs to.
+     */
+    public String getClass( ConstantPool cp ) {
+        return cp.constantToString(class_index, Constants.CONSTANT_Class);
+    }
+
+
+    /**
+     * @param name_and_type_index points to Constant_NameAndType
+     */
+    public final void setNameAndTypeIndex( int name_and_type_index ) {
+        this.name_and_type_index = name_and_type_index;
+    }
+
+
+    /**
+     * @return String representation.
+     */
+    public final String toString() {
+        return super.toString() + "(class_index = " + class_index + ", name_and_type_index = "
+                + name_and_type_index + ")";
+    }
 }

Modified: jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/ConstantClass.java
URL: http://svn.apache.org/viewcvs/jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/ConstantClass.java?rev=386056&r1=386055&r2=386056&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/ConstantClass.java (original)
+++ jakarta/bcel/trunk/src/java/org/apache/bcel/classfile/ConstantClass.java Wed Mar 15 03:31:56 2006
@@ -31,88 +31,98 @@
  * @see     Constant
  */
 public final class ConstantClass extends Constant implements ConstantObject {
-  private int name_index; // Identical to ConstantString except for the name
 
-  /**
-   * Initialize from another object.
-   */
-  public ConstantClass(ConstantClass c) {
-    this(c.getNameIndex());
-  }    
-
-  /**
-   * Initialize instance from file data.
-   *
-   * @param file Input stream
-   * @throws IOException
-   */
-  ConstantClass(DataInputStream file) throws IOException
-  {    
-    this(file.readUnsignedShort());
-  }    
-
-  /**
-   * @param name_index Name index in constant pool.  Should refer to a
-   * ConstantUtf8.
-   */
-  public ConstantClass(int name_index) {
-    super(Constants.CONSTANT_Class);
-    this.name_index = name_index;
-  }    
-
-  /**
-   * Called by objects that are traversing the nodes of the tree implicitely
-   * defined by the contents of a Java class. I.e., the hierarchy of methods,
-   * fields, attributes, etc. spawns a tree of objects.
-   *
-   * @param v Visitor object
-   */
-  public void accept(Visitor v) {
-    v.visitConstantClass(this);
-  }    
-
-  /** 
-   * Dump constant class to file stream in binary format.
-   *
-   * @param file Output file stream
-   * @throws IOException
-   */ 
-  public final void dump(DataOutputStream file) throws IOException
-  {
-    file.writeByte(tag);
-    file.writeShort(name_index);
-  }    
-
-  /**
-   * @return Name index in constant pool of class name.
-   */  
-  public final int getNameIndex() { return name_index; }    
-
-  /**
-   * @param name_index the name index in the constant pool of this Constant Class
-   */
-  public final void setNameIndex(int name_index) {
-    this.name_index = name_index;
-  }    
-
-
-  /** @return String object
-   */
-  public Object getConstantValue(ConstantPool cp) {
-    Constant c = cp.getConstant(name_index, Constants.CONSTANT_Utf8);
-    return ((ConstantUtf8)c).getBytes();
-  }
-
-  /** @return dereferenced string
-   */
-  public String getBytes(ConstantPool cp) {
-    return (String)getConstantValue(cp);
-  }
-
-  /**
-   * @return String representation.
-   */
-  public final String toString() {
-    return super.toString() + "(name_index = " + name_index + ")";
-  }
+    private int name_index; // Identical to ConstantString except for the name
+
+
+    /**
+     * Initialize from another object.
+     */
+    public ConstantClass(ConstantClass c) {
+        this(c.getNameIndex());
+    }
+
+
+    /**
+     * Initialize instance from file data.
+     *
+     * @param file Input stream
+     * @throws IOException
+     */
+    ConstantClass(DataInputStream file) throws IOException {
+        this(file.readUnsignedShort());
+    }
+
+
+    /**
+     * @param name_index Name index in constant pool.  Should refer to a
+     * ConstantUtf8.
+     */
+    public ConstantClass(int name_index) {
+        super(Constants.CONSTANT_Class);
+        this.name_index = name_index;
+    }
+
+
+    /**
+     * Called by objects that are traversing the nodes of the tree implicitely
+     * defined by the contents of a Java class. I.e., the hierarchy of methods,
+     * fields, attributes, etc. spawns a tree of objects.
+     *
+     * @param v Visitor object
+     */
+    public void accept( Visitor v ) {
+        v.visitConstantClass(this);
+    }
+
+
+    /** 
+     * Dump constant class to file stream in binary format.
+     *
+     * @param file Output file stream
+     * @throws IOException
+     */
+    public final void dump( DataOutputStream file ) throws IOException {
+        file.writeByte(tag);
+        file.writeShort(name_index);
+    }
+
+
+    /**
+     * @return Name index in constant pool of class name.
+     */
+    public final int getNameIndex() {
+        return name_index;
+    }
+
+
+    /**
+     * @param name_index the name index in the constant pool of this Constant Class
+     */
+    public final void setNameIndex( int name_index ) {
+        this.name_index = name_index;
+    }
+
+
+    /** @return String object
+     */
+    public Object getConstantValue( ConstantPool cp ) {
+        Constant c = cp.getConstant(name_index, Constants.CONSTANT_Utf8);
+        return ((ConstantUtf8) c).getBytes();
+    }
+
+
+    /** @return dereferenced string
+     */
+    public String getBytes( ConstantPool cp ) {
+        return (String) getConstantValue(cp);
+    }
+
+
+    /**
+     * @return String representation.
+     */
+    public final String toString() {
+        return super.toString() + "(name_index = " + name_index + ")";
+    }
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.