JVM 如何确定堆栈条目是 int 还是 long

How can the JVM determine if a stack entry is an int or a long

几乎所有字节码都知道在运行时要在堆栈上找到它们的操作数的类型,字节码验证器将检查在运行时(对于每个路径)实际上只有这些类型会被找到,因此解释器可以直接去提前弹出它期望的值,一切都应该很好。

但是有一些指令需要知道操作数的类型,例如如果某些操作数是类别 2(长整数和双整数),则某些 'dup' 字节码具有不同的形式。在验证期间,这很容易,因为之前的推送指令使用伪验证类型,其中将 long 作为类型 'long' 和类型 'top' 推送,因此验证 dup 知道有一个 long(因为它还找到了一个'top')。

但是运行时如何确定这一点?

大家好,最初的问题是 "some of the 'dup' bytecodes",应该更具体一些,即更复杂的 'dup_x2'、'dup_2'、'dup2_x1' 和 'dup2_x2' 不同的形式取决于在堆栈中找到的内容,如果遇到 long 或 double,它们将做不同的事情。

我的问题是运行时如何确定值是 1 entry int 还是 2 valued long/double 并做出相应的响应。谢谢

dup 指令不关心类型。他们只是盲目地复制 x 个堆栈槽并适当放置它们。 dup2 将复制 2 个整数(或一个浮点数和一个引用或其他)以及一个长整数。

需要注意的是,验证者仍然必须验证 long/double 中的单个单词没有被拆分。但这并不是 dup 指令独有的。

字节码中每个点的每个堆栈或本地槽都有一个由验证者的数据流分析定义的隐式类型。 (在以后的字节码版本中,classfile中也有类型注解(不要与Java级注解混淆),使验证器更高效)。