在ASM中F_SAME到底是什么?我在Java虚拟机指令集中查找了这个助记符,但没有找到任何相关的。
我理解堆栈图帧,它们节省空间。
但是,为什么这个助记符恰好用于跳转目标、异常处理程序或遵循无条件跳跃指令?
尽管如此,还是无法"预测"。堆栈内容的类型?
必须使用这个吗?
我搜索了很多关于这个,但我找不到任何相关的东西几乎在任何地方。
谢谢!
这不是一个真正的操作码。源代码中的注释解释了它:ASM特定的堆栈映射帧类型,在{@link ClassVisitor#visitFrame}中使用。请记住,注释是错误的,并且visitFrame方法在MethodVisitor中。
我想也许你想知道为什么帧出现在跳跃目标,等等。StackMapTableAttribute用于加速字节码验证。验证器执行流分析以确保操作数堆栈和局部变量在所有基本块入口点是一致的。在基本块中,操作数堆栈和局部变量随着每条指令的访问而递增地更新。这些增量更新的成本很低,因此没有必要冗余地记录这些信息。
在Java 1.6之前,验证器不使用StackMapTableAttribute,但这迫使它在代码上执行更多的传递,以确保访问了所有的执行路径。
一个更精确的回答你的问题,为什么F_SAME存在?因为就像你说的,它比编码一整帧要小。
如果您使用ASM生成代码,那么您应该使用compute_max和COMPUTE_FRAMES选项,这样您就不需要担心这种混乱。如果你想使用更简单的东西,可以使用我写的Cojen/Maker库。