[英]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
,並且假設傳入類型 stateT
,處理程序的目標(處理程序代碼的初始指令)是類型安全的,則指令滿足異常處理程序。 stateT
類型派生自ExcStackFrame
,方法是將操作數堆棧替換為唯一元素是處理程序異常 class 的堆棧。
換句話說,由異常處理程序保護的所有指令的傳出 state 必須具有可分配給異常處理程序變量的局部變量。
您(代碼生成器)決定如何解決這個問題。 要么,通過聲明一個具有所有可能類型的公共超類型的變量,要么通過刪除局部變量,這相當於將變量的類型設置為top
, 驗證類型系統的根類型,它標記了一個不可用的變量。
對於普通的 Java 代碼,不可能在關聯的catch
塊內使用try
塊中聲明的變量。 您也不能將變量重新聲明為不同的類型。 因此,它總是歸結為刪除這些變量,並且只有在受保護的代碼之前已經存在的變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.