attr
Class codeAttr

java.lang.Object
  |
  +--util.dataRead
        |
        +--attr.attrInfo
              |
              +--attr.codeAttr

public class codeAttr
extends attrInfo

Attribute for the byte code for a Java method. The attribute name for the codeAttr is "Code". Note that if the method is native or abstract, then it can't have a "Code" attribute.

The structure of a Code attribute is:

Code_attribute {
u2 name_index;
u4 total_length;
u2 max_stack;
u2 max_locals;
u4 code_length;
u1 code[ code_length ];
u2 exceptions_table_length;
exceptInfo except[ exceptions_table_length ];
u2 attributes_count;
attribute_info attributes[ attributes_count ];
}

Where

exceptInfo {
u2 start_pc;
U2 end_pc;
u2 handler_pc;
u2 catch_type;
}

The attribute_name_index and attribute length are read by the attrFactory.allocAttr method. These values are passed into the class constructor.

In the exceptInfo the catch_type is an index into the constant pool. The object at this index must be a CONSTANT_Class_info object (e.g., constClass_or_String) for an exception class that this exception is designated to catch. This class must be the class Throwable or one of its subclasses.

Although code_length is 32-bits wide, its value must be less than 0x10000 (65536) (see JVM Spec 4.8.1).

The max_stack value is the size of the operand stack. This in in word units, where an int is one word and a long or double is two: At any point in time an operand stack has an associated depth, where a value of type long or double contributes two units to the depth and a value of any other type contributes one unit. (JVM Spec 3.6.2) The max_locals value is the size of the local frame allocated on entry to the method. This frame will hold local variables and method arguments. As with max_stack, the units are words. Like the stack, the frame is word aligned so a boolean or a byte occupies a word and a long or a double occupies two words (JVM Spec 3.6.1). If max_locals is zero, then there are no local variables. If debug is turned and the method has local variables then the codeAttributes table will contain a LocalVariableTable attribute. This attribute in turn contains a table of local variable information.

Author:
Ian Kaplan

Inner Class Summary
(package private)  class codeAttr.exceptInfo
           
 
Field Summary
private  attrInfo[] codeAttributes
           
private  byte[] codeBuf
           
private  codeAttr.exceptInfo[] exceptTab
           
private  int max_locals
           
private  int max_stack
           
 
Fields inherited from class attr.attrInfo
attrName, len
 
Fields inherited from class util.dataRead
bytesRead
 
Constructor Summary
codeAttr(java.lang.String name, int length, java.io.DataInputStream dStream, constPool constPoolSec)
          codeAttr constructor
 
Method Summary
 java.util.Vector getLocalVarVec()
          If there are local variables in the method, return a vector containing the local variable name declarations.
 int getMax_locals()
           
 int getMax_stack()
           
 
Methods inherited from class attr.attrInfo
getName, pr
 
Methods inherited from class util.dataRead
getBytesRead, readU1, readU2, readU4
 
Methods inherited from class java.lang.Object
, clone, equals, finalize, getClass, hashCode, notify, notifyAll, registerNatives, toString, wait, wait, wait
 

Field Detail

max_stack

private int max_stack

max_locals

private int max_locals

codeBuf

private byte[] codeBuf

exceptTab

private codeAttr.exceptInfo[] exceptTab

codeAttributes

private attrInfo[] codeAttributes
Constructor Detail

codeAttr

public codeAttr(java.lang.String name,
                int length,
                java.io.DataInputStream dStream,
                constPool constPoolSec)
codeAttr constructor

Here the length argument is the attribute length (e.g., the total length of the attribute).

Method Detail

getLocalVarVec

public java.util.Vector getLocalVarVec()
If there are local variables in the method, return a vector containing the local variable name declarations. There should be only one localVarTabAttr in the codeAttributes table.

getMax_locals

public int getMax_locals()

getMax_stack

public int getMax_stack()