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.