几乎所有字节码都知道在运行时将在堆栈上找到它们的操作数的类型,字节码验证器将检查只有这些类型在运行时(对于每一条路径)实际被找到,这样解释器就可以继续弹出它期望的值,并且所有这些类型都应该是好的。
然而,有一些指令需要知道操作数的类型,例如,如果其中一些操作数是第2类(长和双),则一些“dup”字节码具有不同的形式。在验证过程中,这很容易,因为以前的推送指令使用伪验证类型,其中long被推送为' long‘类型,类型'top’,因此验证dup知道有一个long(因为它也找到了'top')。
但是运行时是如何确定这一点的呢?
大家好,最初的问题说“一些'dup‘字节”应该是更具体的,即'dup_x2’、'dup_2‘、’dup_2_x1‘和'dup2_x2’--不同的形式取决于堆栈上的发现,如果遇到长或双,它们会做不同的事情。
我的问题是,运行时如何确定值是1条目int还是2值长/双值,并作出相应的响应。谢谢
发布于 2015-01-10 19:28:47
dup指令不关心类型。它们只是盲目地复制x个堆栈槽,并适当地放置它们。dup2将复制2个ints (或浮点数和引用或其他任何内容),并且只复制一个长。
有一点要注意的是,验证者仍然必须验证长/双中的单个单词是不分裂的。但这并不是dup指令所独有的。
字节码中每个点的每个堆栈或本地槽都有一个由验证器的数据流分析定义的隐式类型。(在后来的字节码版本中,类文件中也有类型注释(不要与Java级别的注释混淆),以提高验证器的效率)。
https://stackoverflow.com/questions/27879893
复制相似问题