繁体   English   中英

什么决定了 java 字节码 try catch 处理程序的堆栈图帧的局部变量?

[英]What determines the locals of a stackmap frame of a java bytecode try catch handler?

假设我们用 try catch 块包围了一些字节码指令,并且本地类型在 try catch 块范围之间变化(以前用于 int 类型的本地寄存器现在用于 TCB 内部的引用类型)。

此 try catch 块的处理程序只能有一帧(不允许拆分,java 字节码规则)。 但问题是,如果在本地类型更改之前抛出异常,指针框架会有所不同。

根据在 TCB 中引发异常时设置的本地类型,处理程序必须具有不同的帧,但这在 java 字节码中是不可能的。 因此我的问题是:处理程序框架对应于 TCB 中的哪个部分? 它会使用“超级类型”而不是选择一个(-> 未初始化)吗?

这是在JVMS §4.10.1.6中指定的:

如果指令的传出类型 state 是ExcStackFrame ,并且假设传入类型 state T ,处理程序的目标(处理程序代码的初始指令)是类型安全的,则指令满足异常处理程序。 state T类型派生自ExcStackFrame ,方法是将操作数堆栈替换为唯一元素是处理程序异常 class 的堆栈。

换句话说,由异常处理程序保护的所有指令的传出 state 必须具有可分配给异常处理程序变量的局部变量。

您(代码生成器)决定如何解决这个问题。 要么,通过声明一个具有所有可能类型的公共超类型的变量,要么通过删除局部变量,这相当于将变量的类型设置为top验证类型系统的根类型,它标记了一个不可用的变量。

对于普通的 Java 代码,不可能在关联的catch块内使用try块中声明的变量。 您也不能将变量重新声明为不同的类型。 因此,它总是归结为删除这些变量,并且只有在受保护的代码之前已经存在的变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM