StackMapTable属性说明

 

(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,并且表中每一项都是有序的。 

 

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.  

StackMapTable属性说明_第1张图片

 

 

关于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*系列的方法调用指令不算在跳转指令中)。

 

转载于:https://www.cnblogs.com/extjs4/p/9049599.html

你可能感兴趣的:(StackMapTable属性说明)