求助大佬,这块看不懂,他是如何帮助jvm验证字节码类型的
https://hllvm-group.iteye.com... 有片r大的 参考,顺便 我的回复7是错的 slot本身就是共享,但是 并不是因为slot共享才有的stackMapFrame R大的帖子 对于这块也只是 提了下 有了StackMapTable之后,JVM在做Class文件的字节码校验时就可以比较方便的做类型检查 ,具体怎么方便或者说 1.7前身的类型推导->类型检查的演变过程原理还是一脸懵逼,望有大佬指点下
3 回答655 阅读✓ 已解决
2 回答456 阅读✓ 已解决
这个要说整个原理内容有点多,我简单点说...
StackMapTable
主要用来验证跳转前后locals、stack中的类型和大小一致。StackMapTable
有多个StackMapFrame
组成,第一个StackMapFrame
也就是init_frame
不在StackMapTable
中,后一个frame需要依赖前一个frame来得到完整的信息。一个frame中包含的信息有 locals、stack、offset等,具体的数据结构可以参考规范jvms-4。有几种frame我们会经常碰到,same_frame、same_frame_extended 、append_frame
,例如append_frame就是和前面一个frame相比,这个frame增加了局部变量,这也是前面说的后一个frame要依靠前一个frame来获取完整信息。 我举个包含这几种frame的例子:一般编译器碰到一个跳转指令(ifxx/goto等)就会生成一个frame来描述跳转处的locals情况
好,到了链接时校验方法字节码的时候会把方法的所有指令都线性扫一遍,碰到store类指令(istroe、fstore等)就会把在
init_frame.locals
中保存一个type,碰到跳转指令就会把init_frame
和StackMapTable
中对应offset的frame对比看看locals stack 类型 大小是否一致来判断跳转前后局部变量是否发生变化