簡體   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