Codepublic final class Code extends Attribute This class represents a chunk of Java byte code contained in a
method. It is instantiated by the
Attribute.readAttribute() method. A Code
attribute contains informations about operand stack, local
variables, byte code and the exceptions handled within this
method.
This attribute has attributes itself, namely LineNumberTable which
is used for debugging purposes and LocalVariableTable which
contains information about the local variables. |
Fields Summary |
---|
private int | max_stack | private int | max_locals | private int | code_length | private byte[] | code | private int | exception_table_length | private CodeException[] | exception_table | private int | attributes_count | private Attribute[] | attributes |
Constructors Summary |
---|
public Code(Code c)Initialize from another object. Note that both objects use the same
references (shallow copy). Use copy() for a physical copy.
this(c.getNameIndex(), c.getLength(), c.getMaxStack(), c.getMaxLocals(),
c.getCode(), c.getExceptionTable(), c.getAttributes(),
c.getConstantPool());
| Code(int name_index, int length, DataInputStream file, ConstantPool constant_pool)
// 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;
| 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!
|
Methods Summary |
---|
public void | accept(com.sun.org.apache.bcel.internal.classfile.Visitor v)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.
v.visitCode(this);
| 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();
| public com.sun.org.apache.bcel.internal.classfile.Attribute | copy(com.sun.org.apache.bcel.internal.classfile.ConstantPool constant_pool)
Code c = (Code)clone();
c.code = (byte[])code.clone();
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;
| public final void | dump(java.io.DataOutputStream file)Dump code attribute to file stream in binary format.
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);
| public final com.sun.org.apache.bcel.internal.classfile.Attribute[] | getAttributes() return attributes;
| public final byte[] | getCode() return code;
| public final com.sun.org.apache.bcel.internal.classfile.CodeException[] | getExceptionTable() return exception_table;
| 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 */;
| public com.sun.org.apache.bcel.internal.classfile.LineNumberTable | getLineNumberTable()
for(int i=0; i < attributes_count; i++)
if(attributes[i] instanceof LineNumberTable)
return (LineNumberTable)attributes[i];
return null;
| public com.sun.org.apache.bcel.internal.classfile.LocalVariableTable | getLocalVariableTable()
for(int i=0; i < attributes_count; i++)
if(attributes[i] instanceof LocalVariableTable)
return (LocalVariableTable)attributes[i];
return null;
| public final int | getMaxLocals() return max_locals;
| public final int | getMaxStack() return max_stack;
| public final void | setAttributes(com.sun.org.apache.bcel.internal.classfile.Attribute[] attributes)
this.attributes = attributes;
attributes_count = (attributes == null)? 0 : attributes.length;
length = calculateLength(); // Adjust length
| public final void | setCode(byte[] code)
this.code = code;
code_length = (code == null)? 0 : code.length;
| public final void | setExceptionTable(com.sun.org.apache.bcel.internal.classfile.CodeException[] exception_table)
this.exception_table = exception_table;
exception_table_length = (exception_table == null)? 0 :
exception_table.length;
| public final void | setMaxLocals(int max_locals)
this.max_locals = max_locals;
| public final void | setMaxStack(int max_stack)
this.max_stack = max_stack;
| public final java.lang.String | toString(boolean verbose)
StringBuffer buf;
buf = new StringBuffer("Code(max_stack = " + max_stack +
", max_locals = " + max_locals +
", code_length = " + code_length + ")\n" +
Utility.codeToString(code, constant_pool, 0, -1, verbose));
if(exception_table_length > 0) {
buf.append("\nException handler(s) = \n" + "From\tTo\tHandler\tType\n");
for(int i=0; i < exception_table_length; i++)
buf.append(exception_table[i].toString(constant_pool, verbose) + "\n");
}
if(attributes_count > 0) {
buf.append("\nAttribute(s) = \n");
for(int i=0; i < attributes_count; i++)
buf.append(attributes[i].toString() + "\n");
}
return buf.toString();
| public final java.lang.String | toString()
return toString(true);
|
|