(1)StackMapTable属性的说明 https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.7.4
(2)StackMapTable属性的作用及理解 https://blog.csdn.net/lijingyao8206/article/details/46715405
(3)Java Eye http://hllvm.group.iteye.com/group/topic/26545
(4)ppt http://www.nimret.org/seajug/past/2014/nov/stack-map-frames.pdf
StackMapTable的结构定义如下:
StackMapTable_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 number_of_entries;
stack_map_frame entries[number_of_entries];
}
(1)attribute_name_index:对应的是常量池表的一个有效索引。也即CONSTANT_Utf8_info结构中表示“StackMapTable”的索引。
(2)attribute_length:标识当前属性的长度(排除前六个字节)
(3)number_of_entries:表示entries表的成员数量。entries表中的所有成员都是一个stack_map_frame结构。
(4)entries[]:entries表中的每一项都表示本方法的一个stack map frame,并且表中每一项都是有序的。
A stack map frame specifies (either explicitly or implicitly) the bytecode offset at which it applies, and the verification types of local variables and operand stack entries for that offset.
栈帧的结构如下:
Tags in the range [128-246] are reserved for future use.
关于stack map frame的几点:
(1)Every basic block should start with a stack map frame.
(2)Every instruction immediately following an unconditional branch (it's a start of a basic block) should have a stack map frame.
(3)The algorithm to create the stack map frame by ASM. Section 3.5 of ASM doc
1、解释an unconditional branch:
在java的控制执行流程中,条件控制分支包括if-else、while、do-while、for,而无条件分支控制包括return、break和continue。
在java中有多个关键词表示无条件分支,它们只是表示这个分支无需任何测试即可发生。这些关键字包括return、break和continue和一种与其他语言中的goto类似的跳转到标号语句的方式。
2、解释basic block 基本块
一个“基本块”(basic block)就是一个方法中的代码最长的直线型一段段代码序列。“直线型”也就是说代码序列中除了末尾之外不能有控制流(跳转)指令。
一个基本块的开头可以是方法的开头,也可以是某条跳转指令的跳转目标;
一个基本块的结尾可以是方法的末尾,也可以是某条跳转指令(Java中就是goto、if*系列等;invoke*系列的方法调用指令不算在跳转指令中)。