org.objectweb.asm.attrs
public class StackMapTableAttribute extends Attribute
ulocalvar
represents the type u2; otherwise ulocalvar represents the type u4. If the
maximum size of the operand stack is 65535 or less, then ustack
represents the type u2; otherwise ustack represents the type u4.
stack_map { // attribute StackMapTable u2 attribute_name_index; u4 attribute_length uoffset number_of_entries; stack_map_frame entries[number_of_entries]; }Each stack_map_frame structure specifies the type state at a particular byte code offset. Each frame type specifies (explicitly or implicitly) a value, offset_delta, that is used to calulate the actual byte code offset at which it applies. The byte code offset at which the frame applies is given by adding
1 + offset_delta
to the offset
of the
previous frame, unless the previous frame is the initial frame of the method,
in which case the byte code offset is offset_delta
. offset_delta + 1
for all explicit frames, we guarantee
the absence of duplicates. union stack_map_frame { same_frame; same_locals_1_stack_item_frame; chop_frame; same_frame_extended; append_frame; full_frame; }The frame type same_frame is represented by tags in the range [0-63]. If the frame type is same_frame, it means the frame has exactly the same locals as the previous stack map frame and that the number of stack items is zero. The offset_delta value for the frame is the value of the tag field, frame_type. The form of such a frame is then:
same_frame { u1 frame_type = SAME; // 0-63 }The frame type same_locals_1_stack_item_frame is represented by tags in the range [64, 127]. If the frame_type is same_locals_1_stack_item_frame, it means the frame has exactly the same locals as the previous stack map frame and that the number of stack items is 1. The offset_delta value for the frame is the value (frame_type - 64). There is a verification_type_info following the frame_type for the one stack item. The form of such a frame is then:
same_locals_1_stack_item_frame { u1 frame_type = SAME_LOCALS_1_STACK_ITEM; // 64-127 verification_type_info stack[1]; }Tags in the range [128-247] are reserved for future use.
chop_frame { u1 frame_type=CHOP; // 248-250 uoffset offset_delta; }The frame type same_frame_extended is represented by the tag value 251. If the frame type is same_frame_extended, it means the frame has exactly the same locals as the previous stack map frame and that the number of stack items is zero. The form of such a frame is then:
same_frame_extended { u1 frame_type = SAME_FRAME_EXTENDED; // 251 uoffset offset_delta; }The frame type append_frame is represented by tags in the range [252-254]. If the frame_type is append_frame, it means that the current locals are the same as the locals in the previous frame, except that k additional locals are defined. The value of k is given by the formula frame_type-251.
append_frame { u1 frame_type =APPEND; // 252-254 uoffset offset_delta; verification_type_info locals[frame_type -251]; }The 0th entry in locals represents the type of the first additional local variable. If locals[M] represents local variable N, then locals[M+1] represents local variable N+1 if locals[M] is one of Top_variable_info, Integer_variable_info, Float_variable_info, Null_variable_info, UninitializedThis_variable_info, Object_variable_info, or Uninitialized_variable_info, otherwise locals[M+1] represents local variable N+2. It is an error if, for any index i, locals[i] represents a local variable whose index is greater than the maximum number of local variables for the method.
full_frame { u1 frame_type = FULL_FRAME; // 255 uoffset offset_delta; ulocalvar number_of_locals; verification_type_info locals[number_of_locals]; ustack number_of_stack_items; verification_type_info stack[number_of_stack_items]; }The 0th entry in locals represents the type of local variable 0. If locals[M] represents local variable N, then locals[M+1] represents local variable N+1 if locals[M] is one of Top_variable_info, Integer_variable_info, Float_variable_info, Null_variable_info, UninitializedThis_variable_info, Object_variable_info, or Uninitialized_variable_info, otherwise locals[M+1] represents local variable N+2. It is an error if, for any index i, locals[i] represents a local variable whose index is greater than the maximum number of local variables for the method.
union verification_type_info { Top_variable_info; Integer_variable_info; Float_variable_info; Long_variable_info; Double_variable_info; Null_variable_info; UninitializedThis_variable_info; Object_variable_info; Uninitialized_variable_info; }The Top_variable_info type indicates that the local variable has the verification type top (T.)
Top_variable_info { u1 tag = ITEM_Top; // 0 }The Integer_variable_info type indicates that the location contains the verification type int.
Integer_variable_info { u1 tag = ITEM_Integer; // 1 }The Float_variable_info type indicates that the location contains the verification type float.
Float_variable_info { u1 tag = ITEM_Float; // 2 }The Long_variable_info type indicates that the location contains the verification type long. If the location is a local variable, then:
Long_variable_info { u1 tag = ITEM_Long; // 4 }The Double_variable_info type indicates that the location contains the verification type double. If the location is a local variable, then:
Double_variable_info { u1 tag = ITEM_Double; // 3 }The Null_variable_info type indicates that location contains the verification type null.
Null_variable_info { u1 tag = ITEM_Null; // 5 }The UninitializedThis_variable_info type indicates that the location contains the verification type uninitializedThis.
UninitializedThis_variable_info { u1 tag = ITEM_UninitializedThis; // 6 }The Object_variable_info type indicates that the location contains an instance of the class referenced by the constant pool entry.
Object_variable_info { u1 tag = ITEM_Object; // 7 u2 cpool_index; }The Uninitialized_variable_info indicates that the location contains the verification type uninitialized(offset). The offset item indicates the offset of the new instruction that created the object being stored in the location.
Uninitialized_variable_info { u1 tag = ITEM_Uninitialized // 8 uoffset offset; }
See Also: "ClassFileFormat-Java6.fm Page 138 Friday, April 15, 2005 3:22 PM"
Field Summary | |
---|---|
static int | APPEND_FRAME
Frame where current locals are the same as the locals in the previous
frame, except that k additional locals are defined. |
static int | CHOP_FRAME
Frame where current locals are the same as the locals in the previous
frame, except that the k last locals are absent. |
static int | FULL_FRAME
Full frame |
static int | RESERVED
Reserved for future use |
static int | SAME_FRAME
Frame has exactly the same locals as the previous stack map frame and
number of stack items is zero. |
static int | SAME_FRAME_EXTENDED
Frame has exactly the same locals as the previous stack map frame and
number of stack items is zero. |
static int | SAME_LOCALS_1_STACK_ITEM_FRAME
Frame has exactly the same locals as the previous stack map frame and
number of stack items is 1 |
static int | SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED
Frame has exactly the same locals as the previous stack map frame and
number of stack items is 1. |
Constructor Summary | |
---|---|
StackMapTableAttribute() | |
StackMapTableAttribute(List frames) |
Method Summary | |
---|---|
static List | calculateLocals(String className, int access, String methodName, String methodDesc)
Use method signature and access flags to resolve initial locals state.
|
StackMapFrame | getFrame(Label label) |
List | getFrames() |
static int | getMethodOff(ClassReader cr, int codeOff, char[] buf) |
boolean | isCodeAttribute() |
boolean | isUnknown() |
protected Attribute | read(ClassReader cr, int off, int len, char[] buf, int codeOff, Label[] labels) |
String | toString() |
protected ByteVector | write(ClassWriter cw, byte[] code, int len, int maxStack, int maxLocals) |
Parameters: className name of the method's owner class. access access flags of the method. methodName name of the method. methodDesc descriptor of the method.
Returns: list of StackMapType
instances representing locals
for an initial frame.