一、问题背景
在做语句块级别的动态插桩工具时,需要获取方法中的控制流信息,需要解析jvm指令。像for、while等循环,解除语法糖后会变成if、goto语句,这其中比较难解析的是tableSwitch与lookupswitch指令,他们对应Java语法中的Switch语句。
二、指令分析
- 这两个字节码指令后都会跟0-3个nop空白填充,目的是为了让操作数能够4字节对齐
- 其中tableSwitch对齐填充后会跟三个32位有符号整数,即default地址、low值、high值。再然后会跟high-low+1个32位有符号整数作为偏移量offset,这些偏移量构成了
0基址跳转表
。当指令执行时,要比较的index从操作数栈中出栈,若index<low或>high,会用default作为目标地址进行跳转。否则,在跳转表中将index-low的地址值当做目标地址进行跳转 - lookupswitch对齐填充后会跟2个32位有符号整数,其中一个是default地址,另一个数npairs代表match-offset对的数量。再然后会跟npairs个match-offset对。这些match-offset对按照match值升序存放,当指令执行时,要比较的index从操作数栈中出栈,跟每一个match值进行比较,如果有相同的就以对应的offset值作为目标跳转地址,若没有相同的,就以default作为目标跳转地址