几乎所有字节码都知道在运行时在堆栈上找到的操作数的类型,字节码验证器将检查在运行时(实际上每个路径)实际上只能找到这些类型,因此解释器可以继续弹出它期望的价值,一切都应该是好的。
然而,有一些指令需要知道操作数的类型,例如一些' dup'如果某些操作数是类别2(longs& double),则字节码具有不同的形式。在验证期间,这很容易,因为先前的推送指令使用伪验证类型,其中长按被推送为类型长的'和一个类型'顶部'所以验证dup知道有一个很长的(因为它也找到了一个' top')。
但运行时如何确定?
大家好,原始问题是"其中一些' dup'字节码"应该更具体,即更复杂的字符串' dup_x2',' dup_2',' dup2_x1'和' dup2_x2&#39 ;如果不同的形式取决于堆栈上的内容,如果遇到长篇或双打,它们会做不同的事情。
我的问题是运行时如何确定值是1个条目int还是2个值long / double并相应地做出响应。感谢
答案 0 :(得分:1)
复制说明并不关心类型。他们只是盲目地复制x个堆栈槽并适当放置它们。 dup2
将复制2个整数(或浮点数和引用或其他)以及单个长整数。
一个警告是,验证者仍然必须验证长/双的单个单词是否未被分割。但这并非dup
指令所独有。
字节码中每个点的每个堆栈或本地插槽都有一个由验证器的数据流分析定义的隐式类型。 (在后面的字节码版本中,类文件中还有类型注释(不要与Java级别注释混淆),以使验证者更有效率。)