專利名稱:零開銷異常處理的制作方法
本專利文檔公開的一部分包含受版權(quán)保護(hù)的材料。版權(quán)所有者不反對復(fù)制已經(jīng)出現(xiàn)在專利與商標(biāo)管理處專利文件或記錄中的專利公開的任一部分,但保留除此之外的所有版權(quán)。
背景本發(fā)明一般涉及面向?qū)ο蟮挠?jì)算機(jī)軟件,特別涉及為了在一個(gè)實(shí)現(xiàn)在資源受限的設(shè)備如智能卡中的Java虛擬機(jī)中支持異常處理時(shí)使棧存儲要求最小的數(shù)據(jù)結(jié)構(gòu)和方法。
一個(gè)虛擬機(jī)是由在處理器上執(zhí)行的應(yīng)用軟件或指令序列產(chǎn)生的一個(gè)抽象的計(jì)算機(jī)器。在虛擬機(jī)上執(zhí)行的程序可以是“體系結(jié)構(gòu)中立(architecture-neutral)”。術(shù)語“體系結(jié)構(gòu)中立”指的是程序,像那些用Java TM語言編寫的程序,它們可以在有多種不同計(jì)算機(jī)體系結(jié)構(gòu)的不同計(jì)算機(jī)平臺上由虛擬機(jī)執(zhí)行。這樣,舉例來說,一個(gè)在基于WindowsTM的個(gè)人計(jì)算機(jī)系統(tǒng)上實(shí)現(xiàn)的虛擬機(jī)可以使用與在基于UNIXTM的計(jì)算機(jī)系統(tǒng)上實(shí)現(xiàn)的虛擬機(jī)相同的指令系統(tǒng)。一個(gè)虛擬機(jī)的指令序列的平臺無關(guān)編碼的結(jié)果是一個(gè)含一個(gè)或多個(gè)字節(jié)碼的流,例如它們中的每一個(gè)是一個(gè)單字節(jié)長的數(shù)字代碼。
Java編程語言是一個(gè)面向?qū)ο蟮木幊陶Z言。在一個(gè)面向?qū)ο蟮南到y(tǒng)中,“類”描述數(shù)據(jù)以及對這些數(shù)據(jù)進(jìn)行操作的方法的集合。合在一起,這些數(shù)據(jù)和方法描述一個(gè)對象的狀態(tài)和行為。
Java編程語言也是可檢驗(yàn)的,這意味著,在一個(gè)用Java編程語言編寫的應(yīng)用程序執(zhí)行之前,就可以判斷是否有程序中的指令序列試圖為字節(jié)碼處理不正確類型的數(shù)據(jù)或者程序中字節(jié)碼指令的執(zhí)行是否會引起操作數(shù)棧的下溢或上溢。
Java虛擬機(jī)執(zhí)行用Java編程語言寫的虛機(jī)器代碼并滿足下面提到的“JavaTM虛擬機(jī)規(guī)范”。Java虛擬機(jī)被設(shè)計(jì)為使用32位的體系結(jié)構(gòu)。然而,許多資源受限的設(shè)備,像智能卡,有8位和16位體系結(jié)構(gòu)。
智能卡,也被認(rèn)為是智能移動(dòng)數(shù)據(jù)傳輸卡,通常用塑料或金屬制成并有一個(gè)包含一個(gè)用來執(zhí)行程序的嵌入式微處理器和一個(gè)用來存儲程序和數(shù)據(jù)的存儲器的電子芯片。這些設(shè)備可以像一張信用卡大小,通常只有有限的存儲容量。有限的體系結(jié)構(gòu)和存儲器使得在這些設(shè)備上實(shí)現(xiàn)一個(gè)Java虛擬機(jī)不切實(shí)際或者是不太可能的。例如,一些智能卡只有不到1K的隨機(jī)訪問存儲器(RAM)和16K的只讀存儲器(ROM)。當(dāng)在一個(gè)資源受限的設(shè)備上實(shí)現(xiàn)一個(gè)Java虛擬機(jī)時(shí)一個(gè)困難的例子出現(xiàn)在對異常的處理中。
參照
圖1,在用Java編程語言編寫的計(jì)算機(jī)程序的上下文中,異常處理器100是一個(gè)過程(或者是過程中的一個(gè)指令集合),用來保護(hù)程序代碼的一個(gè)特定集合,稱作被保護(hù)代碼塊112.當(dāng)一個(gè)Java程序違反了Java編程語言的語義約束時(shí),Java虛擬機(jī)把這個(gè)錯(cuò)誤作為一個(gè)異常通知給該程序。在相應(yīng)被保護(hù)代碼的執(zhí)行過程中,無論何時(shí)只要可適用的異常被“丟出”異常處理器就被執(zhí)行。Java編程語言規(guī)范規(guī)定在語義約束被違反時(shí)一個(gè)異常將被丟出并引起一個(gè)從異常發(fā)生點(diǎn)到一個(gè)可以由程序員指定的點(diǎn)的非本地傳輸控制。一個(gè)異常被說成是從它發(fā)生的點(diǎn)被丟出并在控制被傳向的點(diǎn)被捕獲到。例如,一個(gè)特定的異常處理器,像一個(gè)處理“文件終點(diǎn)”I/O錯(cuò)誤的過程,可以被定義為適用于第一個(gè)方法104的一個(gè)特定部分。如果相應(yīng)異常(也就是本例中的文件終點(diǎn)異常)在被保護(hù)代碼的執(zhí)行過程中產(chǎn)生,異常處理器100的執(zhí)行就被初始化。異??梢员浑[含地或明確地丟出。隱含異常被Java虛擬機(jī)作為程序指令執(zhí)行的結(jié)果丟出,像空指針異常。作為選擇,明確異??梢员话ㄔ谑褂肑ava“throw”語句的方法體中。
如果有一個(gè)針對被丟出異常(thrown exception)的可適用的封裝的異常處理器被丟出的異常就被說成是被異常處理器捕獲到。封裝的異常處理器的可適用指令范圍包括丟出相應(yīng)異常的指令。從一個(gè)方法中特定指令的觀點(diǎn)來看,封裝的異常處理器集就是那些可適用指令范圍(被保護(hù)代碼的集合)包括特定指令的異常處理器的集合。
當(dāng)提到異常處理器時(shí)Java編程語言通常指的是“try語句”,“try塊”,“catch子句”以及“finally子句”。一個(gè)try語句包括一個(gè)try塊,零個(gè)或多個(gè)catch子句以及可選擇的finally子句。異常被try塊中的封裝代碼捕獲到。try塊是特定異常處理器適用代碼(也就是被保護(hù)的代碼塊)的一部分。catch子句定義了一個(gè)異常處理器。try語句中的finally子句為執(zhí)行一節(jié)代碼提供了一個(gè)機(jī)制,無論是否有異常被丟出。在一個(gè)Java程序中,如果語句或表達(dá)式出現(xiàn)在try語句的try塊中且catch子句是try語句的一部分,或者語句或表達(dá)式的調(diào)用者被catch子句動(dòng)態(tài)封裝,則語句或表達(dá)式被catch子句動(dòng)態(tài)封裝。
一個(gè)特定的catch子句是否處理一個(gè)異常是由對被丟出異常對象的類與catch子句中參數(shù)的聲明類型進(jìn)行比較來決定的。如果catch子句的參數(shù)的類型是異常的類或是異常類的超類catch子句就處理異常。等價(jià)地,一個(gè)catch子句將捕獲是所聲明參數(shù)類型的實(shí)例的任何異常。
如果第一個(gè)方法的被保護(hù)部分包括對其他方法106的調(diào)用(在Java虛擬機(jī)規(guī)范中被稱為“invoke”指令,見下),它可能依次包括對更多方法108,110的嵌套調(diào)用,這時(shí)由被被保護(hù)代碼102直接或間接調(diào)用的方法106,108,110中的任何一個(gè)所產(chǎn)生的“文件終點(diǎn)”錯(cuò)誤也將會引起異常處理器100的執(zhí)行被調(diào)用。然而,嵌套的方法112可以包括它自己的文件終點(diǎn)異常處理器114.如果一個(gè)異常在執(zhí)行方法112時(shí)被丟出,這時(shí)異常處理器114將被用來處理由被包括在該嵌套方法中的指令的執(zhí)行所引起的文件終點(diǎn)異常,以及由被嵌套方法112調(diào)用的任一方法116的執(zhí)行所產(chǎn)生的異常。
在傳統(tǒng)Java程序中,與一個(gè)對象類相關(guān)的所有方法一起被存儲在一個(gè)稱為類文件的數(shù)據(jù)結(jié)構(gòu)中,它被定義在Java虛擬機(jī)規(guī)范中。每一個(gè)方法有它自己的異常表而且每個(gè)方法的代碼包括用于被它的異常表所引用的異常處理器的代碼。當(dāng)一個(gè)Java類文件被創(chuàng)建時(shí),與一個(gè)方法相關(guān)的所有異常被排列在一個(gè)列表中,作為異常處理器表被查閱。參見圖2,一個(gè)傳統(tǒng)的異常處理器表200包括一個(gè)或多個(gè)catch子句(異常處理器)202.每個(gè)catch子句202包括一個(gè)起始程序計(jì)數(shù)器地址204和一個(gè)結(jié)束程序計(jì)數(shù)器地址206,它們描述了對其來說異常處理器是活動(dòng)的Java虛擬機(jī)指令范圍,類型指示器208描述catch子句將要處理的異常的類型以及一個(gè)異常處理器代碼的異常將從其開始的地址210。
異常處理器表中catch子句的順序非常重要。一個(gè)異常的丟出會導(dǎo)致Java虛擬機(jī)在異常處理器表中進(jìn)行搜索。Java虛擬機(jī)的執(zhí)行在第一個(gè)匹配的catch子句處繼續(xù)。因?yàn)镴ava代碼是結(jié)構(gòu)化的,把用于一個(gè)方法的所有異常處理器排列在一個(gè)列表中通常是不可能的。對任意可能的程序計(jì)數(shù)器值這個(gè)列表都可以被搜索以找到合適的異常處理器,也就是說,最里層的異常處理器不僅封裝了程序計(jì)數(shù)器(pc)值(在那里異常被丟出)并且可以處理正在被丟出的異常。
如果沒有匹配的catch子句,當(dāng)前方法就被說成是有一個(gè)無法捕獲的異常。當(dāng)一個(gè)異常無法捕獲時(shí),調(diào)用者,也就是調(diào)用當(dāng)前方法的方法(如果有的話)的異常狀態(tài)被恢復(fù)。即使異常已經(jīng)在調(diào)用者中調(diào)用實(shí)際產(chǎn)生異常的方法的指令處發(fā)生異常的傳播仍然繼續(xù)。
Java虛擬機(jī)保持許多不同的運(yùn)行期數(shù)據(jù)結(jié)構(gòu)以追蹤方法的執(zhí)行和調(diào)用。一個(gè)Java虛擬機(jī)可以同時(shí)支持許多執(zhí)行線程。每個(gè)Java虛擬機(jī)線程有自己的pc(程序計(jì)數(shù)器)寄存器。該pc寄存器包括當(dāng)前被執(zhí)行的Java虛擬機(jī)指令地址。每個(gè)Java虛擬機(jī)線程有一個(gè)私有的與線程同時(shí)被創(chuàng)建的Java棧。Java棧存儲Java虛擬機(jī)幀。Java棧等價(jià)于傳統(tǒng)語言,如C,中的棧它存儲局部變量和中間結(jié)果并支持方法調(diào)用和返回。
現(xiàn)在看圖3,顯示了一個(gè)包括很多Java虛擬機(jī)幀的傳統(tǒng)Java棧300。每個(gè)幀302包括一個(gè)對一個(gè)方法的引用304和一個(gè)返回指針306.
引用304是對當(dāng)前正在執(zhí)行的方法的引用,指的是當(dāng)前方法。引用304被用來指示當(dāng)在當(dāng)前方法的執(zhí)行過程中一個(gè)異常被丟出時(shí)哪個(gè)異常處理器表將被搜索。引用304可以是一個(gè)地址的形式,當(dāng)前方法被存儲在其處。用于每個(gè)方法的代碼一般包括該方法所需要的最大棧空間,被該方法所用的最大寄存器數(shù),用于執(zhí)行方法的實(shí)際字節(jié)碼以及一個(gè)異常處理器表。引用304可以指向當(dāng)前方法的起點(diǎn),異常處理器表通常被存儲在那里。
返回指針306指向調(diào)用當(dāng)前方法的方法,更明確一點(diǎn)是指向在當(dāng)前方法執(zhí)行完畢后調(diào)用方法中執(zhí)行將在其處被恢復(fù)的位置。
像上面所描述的那樣,智能卡和其它資源受限設(shè)備一般只有有限的存儲容量。相應(yīng)地,包括許多需要大量字節(jié)以被存儲在Java棧中的嵌套方法的程序在運(yùn)行時(shí)可能引起棧溢出。在允許對Java虛擬機(jī)中傳統(tǒng)異常處理進(jìn)行全支持的同時(shí),希望限制在運(yùn)行時(shí)被要求存儲在存儲器中的信息。
發(fā)明概述一方面,本發(fā)明提供了一種機(jī)器實(shí)現(xiàn)的過程,用于由機(jī)器執(zhí)行在一個(gè)或多個(gè)類中的方法的過程中處理可被丟出異常。每個(gè)方法包括一個(gè)定義與該方法相關(guān)聯(lián)的異常處理器的異常處理器數(shù)組。該方法包括將用于所有方法的異常處理器數(shù)組結(jié)合到一個(gè)單獨(dú)的異常處理器表中。
本發(fā)明的各個(gè)方面包括下述特征中的一個(gè)或多個(gè)。用一個(gè)類中所有方法或所有類中全部方法的所有異常處理器數(shù)組可以被存儲在一個(gè)單獨(dú)的異常處理器表中。在用于一個(gè)Java包中所有方法的所有異常處理器數(shù)組可以被結(jié)合到單獨(dú)的異常處理器表中。一個(gè)方法可以被包含在一個(gè)類文件中。結(jié)合所有異常處理器數(shù)組的步驟可以包括把一個(gè)類文件中所有方法的異常處理器連結(jié)到單獨(dú)的異常處理器表中。
該過程可以包括在執(zhí)行其中一個(gè)方法的過程中當(dāng)一個(gè)異常被丟出時(shí)搜索異常處理器表,包括在單獨(dú)的異常處理器表中定位第一匹配的異常。搜索步驟可以包括從異常處理器表中按順序檢索異常處理器入口,為第一匹配的異常處理器檢查每一個(gè)異常處理器的類型和范圍并在當(dāng)前異常處理器不匹配且對相關(guān)方法中被保護(hù)代碼的最頂層來說是最后一個(gè)處理器時(shí)停止搜索。
一個(gè)類中所有的方法被描述在一個(gè)單獨(dú)的類文件中。類文件可以是Java類文件。一個(gè)或多個(gè)類中的方法可以被組合在一個(gè)包括一個(gè)有第一和第二兩個(gè)部分的包數(shù)據(jù)結(jié)構(gòu)的包中。該過程可以包括把異常處理器表存儲在包的第一部分中和把所有方法存儲在包的第二部分中。結(jié)合步驟可以包括鏈接異常處理器數(shù)組,包括把每個(gè)異常處理器數(shù)組依照預(yù)定義的順序裝入到包數(shù)據(jù)結(jié)構(gòu)的第一部分。預(yù)定義的順序可以依據(jù)存儲在包數(shù)據(jù)結(jié)構(gòu)第二部分中的方法的順序來確定。
機(jī)器可以是在一個(gè)資源受限設(shè)備上實(shí)現(xiàn)的虛擬機(jī)。資源受限設(shè)備可以是一個(gè)智能卡。一個(gè)或多個(gè)類中的方法可以被組合成在一個(gè)包中且這個(gè)包可以被安裝在智能卡上。該過程可以包括創(chuàng)建一個(gè)包括一個(gè)有第一和第二兩個(gè)部分的包數(shù)據(jù)結(jié)構(gòu)的包。該過程可以包括把用于每一個(gè)類文件的異常處理器數(shù)組鏈接成一個(gè)異常處理器表,把異常處理器表存儲到包的第一部分,把所有方法存儲到包的第二部分。
另一方面,本發(fā)明提供一個(gè)減少在執(zhí)行程序時(shí)運(yùn)行時(shí)棧所要求的存儲量的方法。在程序執(zhí)行過程中機(jī)器在運(yùn)行時(shí)保持一個(gè)運(yùn)行時(shí)棧以存儲一個(gè)或多個(gè)幀,每一幀包括一個(gè)指向程序中調(diào)用當(dāng)前執(zhí)行方法的調(diào)用方法的指針。本方法包括把用于包含在程序中的所有方法的異常處理器信息結(jié)合成一個(gè)復(fù)合異常處理器表并在方法之一的執(zhí)行過程中當(dāng)有異常被丟出時(shí)定位和搜索復(fù)合異常處理器表以在不要求指向異常處理器的指針上的運(yùn)行時(shí)棧上存儲空間的情況下定位異常處理器信息。
本發(fā)明的各個(gè)方面可以包括一個(gè)或多個(gè)特征。程序可以是一個(gè)Java程序。機(jī)器可以是實(shí)現(xiàn)一個(gè)Java虛擬機(jī)的虛擬機(jī)。程序可以包括一包在一個(gè)或多個(gè)類中的方法。虛擬機(jī)可以被實(shí)現(xiàn)在一個(gè)資源受限設(shè)備中,包被安裝在其上并執(zhí)行。
該方法可以包括在安裝時(shí)把包登記在一個(gè)注冊服務(wù)中。該注冊服務(wù)保存一個(gè)指針和一個(gè)范圍。指針指示在資源受限設(shè)備中與一個(gè)給定包相關(guān)的復(fù)合異常處理器表中的一個(gè)位置。范圍定義了資源受限設(shè)備中的一個(gè)地址范圍,在其處與包相關(guān)聯(lián)的方法被定位。
定位步驟可以包括定位一個(gè)與當(dāng)前執(zhí)行方法相關(guān)聯(lián)的包,包括把異常被丟出處的地址與登記在注冊服務(wù)中每個(gè)包的范圍進(jìn)行比較。搜索步驟可以包括搜索與一個(gè)已定位的包相關(guān)的復(fù)合異常處理器表。
另一方面,本發(fā)明提供一個(gè)方法把類文件轉(zhuǎn)換成一個(gè)已轉(zhuǎn)換的Java小應(yīng)用程序以在資源受限設(shè)備上執(zhí)行并且包括接收一個(gè)或多個(gè)類文件,每個(gè)類文件都包含一個(gè)或多個(gè)方法。每個(gè)方法包括一個(gè)異常處理器數(shù)組定義可被方法丟出的異常處理器。方法包括為已轉(zhuǎn)換成的Java小應(yīng)用程序存儲方法和異常處理器定義一個(gè)包含第一和第二兩個(gè)部分的數(shù)據(jù)結(jié)構(gòu)并為方法定義順序且按照順序把方法裝入到數(shù)據(jù)結(jié)構(gòu)的第二部分中。用于所有方法的異常處理器數(shù)組被結(jié)合到一個(gè)單獨(dú)的異常處理器表中。異常處理器數(shù)組被按照為方法定義的順序在表中排序。本方法包括把單獨(dú)的異常處理器數(shù)組存儲在數(shù)據(jù)結(jié)構(gòu)的第一部分。
另一方面,本發(fā)明提供了一種機(jī)器實(shí)現(xiàn)的過程,用于由虛擬機(jī)執(zhí)行在一個(gè)或多個(gè)類中的方法過程中處理可被丟出的異常。每個(gè)方法包括一個(gè)異常處理器數(shù)組定義與該方法相關(guān)的異常處理器。單個(gè)的異常處理器數(shù)組被結(jié)合并形成一個(gè)用于兩個(gè)或更多方法的單獨(dú)的異常處理器表。該過程包括在執(zhí)行其中一個(gè)方法的過程中當(dāng)一個(gè)異常被丟出時(shí)搜索異常處理器表,包括在單獨(dú)的異常處理器表中定位第一匹配的異常。
另一方面,本發(fā)明提供一個(gè)包含使計(jì)算機(jī)系統(tǒng)把針對方法的異常處理器數(shù)組連結(jié)成單一的異常處理器表的指令的計(jì)算機(jī)系統(tǒng)。
另一方面,本發(fā)明提供一個(gè)計(jì)算機(jī)系統(tǒng),它包含一些指令使該計(jì)算機(jī)系統(tǒng)把用于程序中方法的異常處理器信息結(jié)合成一個(gè)復(fù)合異常處理器表并在其中一個(gè)方法的執(zhí)行過程中有異常被丟出時(shí)定位和搜索該組合異常處理器表以在不要求指向異常處理器的指針上的運(yùn)行時(shí)棧上存儲空間的情況下定位異常處理器信息。
另一方面,本發(fā)明提供一個(gè)包含使計(jì)算機(jī)系統(tǒng)接收一個(gè)或多個(gè)類文件的指令的計(jì)算機(jī)系統(tǒng)。每個(gè)類文件包含一個(gè)或多個(gè)方法且每個(gè)方法包含一個(gè)異常處理器數(shù)組定義可被該方法丟出的異常處理器。指令被包含用來使計(jì)算機(jī)系統(tǒng)為已修改的Java小應(yīng)用程序存儲方法和異常處理器定義一個(gè)包括第一和第二兩個(gè)部分的數(shù)據(jù)結(jié)構(gòu),為方法定義一個(gè)順序并按照順序把方法裝入到數(shù)據(jù)結(jié)構(gòu)的第二部分,把用于兩個(gè)或多個(gè)方法的異常處理器數(shù)組結(jié)合成一個(gè)包括按照給方法定義的順序給異常處理器數(shù)組排序的單獨(dú)的異常處理器表并把單獨(dú)異常處理器數(shù)組存儲在數(shù)據(jù)結(jié)構(gòu)的第一部分。
另一方面,本發(fā)明提供一個(gè)包含用來在執(zhí)行一個(gè)方法中有異常被丟出時(shí)使計(jì)算機(jī)系統(tǒng)搜索異常處理器表的指令的計(jì)算機(jī)系統(tǒng)。指令被包含用來在單獨(dú)的異常處理器表中定位第一匹配的異常。
本發(fā)明的實(shí)施方案可以包括一個(gè)或多個(gè)優(yōu)點(diǎn)。需要存儲在運(yùn)行時(shí)棧中的信息量可以在仍然支持傳統(tǒng)異常處理方法的同時(shí)被減少??梢援a(chǎn)生鏈接的異常處理器表,它包括用于與在資源受限設(shè)備中所用方法包相關(guān)的所有異常的入口。不要求棧開銷來支持異常處理。一旦一個(gè)異常被丟出,Java虛擬機(jī)可以有效地搜索鏈接的異常處理器表以找到正確的異常處理器。利用優(yōu)化,對鏈接的異常處理器表的搜索可以在不要求為嵌套catch子句的特定類比較鏈接表中的所有入口的情況下實(shí)現(xiàn)。表的入口可以被排序以確保一個(gè)匹配的搜索終點(diǎn)在一個(gè)頂層處理器上。
其他特征和優(yōu)點(diǎn)可以從下面的詳細(xì)描述以及所附的插圖和權(quán)利要求中清楚地讀到。
附圖概述圖1是在運(yùn)行時(shí)通過過程調(diào)用彼此互相連接的一組方法的示意圖。
圖2顯示了包含了用于被封裝在方法中的每一個(gè)異常的入口的傳統(tǒng)Java異常處理器表。
圖3顯示了一個(gè)傳統(tǒng)的Java棧運(yùn)行時(shí)數(shù)據(jù)區(qū)。
圖4是一個(gè)示意結(jié)構(gòu)圖,描述一個(gè)包含了依照本發(fā)明駐留在智能卡上的虛擬機(jī)的示范系統(tǒng)。
圖5a是針對一個(gè)創(chuàng)建鏈接的異常處理器表的過程的流程圖。
圖5b是包含了用于將要在JavaCardTM虛擬機(jī)上執(zhí)行的包的所有方法的一個(gè)方法組件數(shù)據(jù)結(jié)構(gòu)的示意結(jié)構(gòu)圖。
圖6是一個(gè)用于一個(gè)Java包的鏈接的異常處理器表的示意結(jié)構(gòu)圖。
圖7一個(gè)由JavaCard虛擬機(jī)保存的異常記錄的示意結(jié)構(gòu)圖。
圖8顯示了一個(gè)由JavaCard虛擬機(jī)保存的運(yùn)行時(shí)棧數(shù)據(jù)區(qū)。
圖9是一個(gè)用于搜索鏈接的異常處理器表的運(yùn)行時(shí)方法的流程圖。
圖10a是一個(gè)用于搜索鏈接的異常處理器表的優(yōu)化的運(yùn)行時(shí)方法的流程圖。
圖10b是對圖10a中所描述的優(yōu)化的運(yùn)行時(shí)方法的實(shí)現(xiàn)的詳細(xì)流程。
描述下面描述在一個(gè)Java包在資源受限設(shè)備上執(zhí)行期間用于處理被丟出異常的數(shù)據(jù)結(jié)構(gòu)和方法。資源受限設(shè)備通常被認(rèn)為是那些在存儲器和/或計(jì)算能力或速度上受限制的設(shè)備。雖然下述特定的實(shí)現(xiàn)是引用智能卡來描述的,本發(fā)明也可被用于其他資源受限設(shè)備,包括,但并不限于,蜂窩電話,邊界掃描設(shè)備,域可編程設(shè)備,個(gè)人數(shù)據(jù)助理(PDAs)。和尋呼機(jī),以及其他微型或小面積設(shè)備。這樣的設(shè)備一般只有有限的存儲容量。例如,一些智能卡只有不到1K的隨機(jī)訪問存儲器(RAM)和有限有只讀存儲器(ROM)和/或不可變存儲器,像電子可擦可編程只讀存儲器(EEPROM)。同樣地,一些資源受限設(shè)備是基于為少于32位而設(shè)計(jì)的體系結(jié)構(gòu)。例如,一些可以使用本發(fā)明的資源受限設(shè)備是基于8位或16位體系結(jié)構(gòu),而不是32位體系結(jié)構(gòu)。
參見圖4,用于一個(gè)受限設(shè)備,像智能卡40的Java小應(yīng)用程序的開發(fā)以類似于Java程序的開發(fā)模式開始。也就是說,一個(gè)開發(fā)者編寫一個(gè)或多個(gè)Java類并用Java編譯器編譯源代碼以產(chǎn)生一個(gè)或多個(gè)類文件10。Java小應(yīng)用程序可以被運(yùn)行,測試和調(diào)試,例如,在一個(gè)使用仿真工具以仿效智能卡40上環(huán)境的工作站上。當(dāng)Java小應(yīng)用程序準(zhǔn)備被下載到智能卡40上時(shí),類文件10被轉(zhuǎn)換器14轉(zhuǎn)換成一個(gè)已轉(zhuǎn)換的Java小應(yīng)用程序(CAP)文件。轉(zhuǎn)換器可以被實(shí)現(xiàn)為一個(gè)由桌面計(jì)算機(jī)執(zhí)行的Java應(yīng)用程序。除了類文件10之外轉(zhuǎn)換器14還接收一個(gè)或多個(gè)輸出文件12作為它的輸入以被轉(zhuǎn)換。輸出文件12包括用于被正在被轉(zhuǎn)換的類引入的其他包的內(nèi)容的命名和鏈接信息。
通常,CAP文件16包括在一個(gè)單獨(dú)的Java包中定義的所有類和接口并被表示成一個(gè)8位字節(jié)流。所有16位和32位量通過讀2個(gè)或4個(gè)連續(xù)的8位字節(jié)被分別構(gòu)造。在其他情況中,CAP文件16包括一個(gè)獨(dú)立于方法組件20被打包的常量池組件18。常量池組件18包括常量的幾個(gè)字節(jié),范圍從在編譯時(shí)知道的數(shù)字文字到在程序被下載到智能卡40或在由智能卡40執(zhí)行時(shí)都被解析的方法和域引用。方法組件20規(guī)定了將要被下載到智能卡40上并隨之由其執(zhí)行的指令集。一個(gè)示范性的已轉(zhuǎn)換Java小應(yīng)用程序文件16結(jié)構(gòu)進(jìn)一步的細(xì)節(jié)在國際應(yīng)用期間題為“用于其他資源受限設(shè)備的一個(gè)面向?qū)ο笾噶罴? (由Joshua B.Susser et al.所作)中有所論述,同時(shí)與本應(yīng)用歸檔,它基于美國應(yīng)用序列號No.09/243,101。
通常,為資源受限平臺像智能卡40所寫的實(shí)現(xiàn)和Java小應(yīng)用程序遵循用于Java平臺包的標(biāo)準(zhǔn)規(guī)則。Java虛擬機(jī)和Java編程語言在T.Lindholm et al.的“JavaTM虛擬機(jī)規(guī)范”(1997)和K.Arnold et al.的“JavaTM編程語言第二版”(1998)中有所描述,在這里通過對它們的全面引用而把它們組合在了一起。用于智能卡平臺的應(yīng)用卡接口(API)被寫成包括包名稱的Java源文件,這里一個(gè)包包括一批編輯單元和唯一的名字。包機(jī)制用于對類,域以及方法的訪問的識別和控制。
像上面所描述的,轉(zhuǎn)換器14在類文件10之外還接收一個(gè)或多個(gè)輸出文件12作為它的輸入以被轉(zhuǎn)換并創(chuàng)建一個(gè)已轉(zhuǎn)換Java小應(yīng)用程序文件16。每個(gè)類文件包括一個(gè)與給定類中每個(gè)方法相關(guān)的異常處理器表。轉(zhuǎn)換器14把用于與一個(gè)包相關(guān)的所有類的所有方法的所有異常處理器表鏈接成一個(gè)單獨(dú)的異常處理器表。鏈接異常處理器表和用于包的基礎(chǔ)方法一起被保存并像下面所詳細(xì)描述地那樣在運(yùn)行時(shí)當(dāng)一個(gè)異常被丟出時(shí)被搜索。
參見圖5a和5b,一個(gè)由轉(zhuǎn)換器14(圖4)執(zhí)行的用來鏈接用于包中所有方法的異常處理器表的過程。為包中的方法定義一個(gè)序列(504)。該序列為相關(guān)方法組件550中的基礎(chǔ)方法定義代碼的位置。例如,三個(gè)方法530,540,550(方法A,B,C)被包括在包545中。每個(gè)方法包括代碼(分別是531,536和541)以及一個(gè)相關(guān)的異常處理器表(分別是532,537和542)。
方法組件描述包中所聲明的每一個(gè)方法。與每個(gè)方法相關(guān)的異常處理器表也被描述。在一個(gè)實(shí)現(xiàn)中,方法組件被表示成下面的結(jié)構(gòu)method_component{u1 tagu2 sizeul handlers_countexception_handler_info exception_handlers[handlers_count]method_info methods[] }表1方法組件tag項(xiàng)有一個(gè)標(biāo)識該數(shù)據(jù)結(jié)構(gòu)為方法組件的值。Size項(xiàng)指出方法組件結(jié)構(gòu)中的字節(jié)數(shù),不包括tag項(xiàng)與size項(xiàng)。handlers_count項(xiàng)表示在鏈接異常處理器表中的入口數(shù)。exception_handlers項(xiàng)表示排列在表中的8位異常處理器結(jié)構(gòu)的一個(gè)數(shù)組,稱為鏈接的異常處理器表。每個(gè)異常處理器結(jié)構(gòu)代表定義在包的一個(gè)方法中的一個(gè)catch子句或finally子句。鏈接的異常處理器表中的入口被按照methods項(xiàng)中在方法組件的起點(diǎn)與每個(gè)活動(dòng)異常處理器范圍的終點(diǎn)之間的距離升序排列。下面詳細(xì)描述了與包中特定方法相關(guān)的異常處理器塊的順序。
methods項(xiàng)代表一個(gè)可變長方法信息結(jié)構(gòu)的數(shù)組。每個(gè)入口代表在類中聲明的一個(gè)方法或給定包的一個(gè)接口。
為了當(dāng)前應(yīng)用的目的,方法組件550可以被表示成一個(gè)包括第一部分552和第二部分554的一個(gè)數(shù)據(jù)結(jié)構(gòu)。第一部分552是一個(gè)用于針對包中所有基礎(chǔ)方法的異常處理器的占位器(place holder)。異常處理器被存儲在鏈接的異常處理器表556中。單個(gè)的方法代碼存儲在第二部分554中。
單個(gè)的異常處理器表被裝入鏈接的異常處理器表中并按照步驟504(506)中定義的順序被排序。也就是說,用于每個(gè)方法的每個(gè)異常處理器表以塊的形式被裝入鏈接的異常處理器表556中。在用于每個(gè)方法的每一單個(gè)異常處理器表中定義的順序也被保持。在圖5b所示的例子中,在排序步驟504執(zhí)行之后方法在方法組件的第二部分554中被排成A,C和B。相關(guān)的異常處理器表A,B和C被按照相同的順序(A,C然后是B)裝入到鏈接的異常處理器表556中。單個(gè)異常處理器表中單個(gè)異常處理器的順序滿足傳統(tǒng)Java編程語言構(gòu)造以確保由Java虛擬機(jī)在運(yùn)行時(shí)找到的第一匹配是可以出現(xiàn)的最精確的匹配。
在一個(gè)實(shí)現(xiàn)中,異常被組織在類層次中。異常類層次有一個(gè)稱為“可丟出”的最高級異常類和兩個(gè)主要分支一組超類是“錯(cuò)誤”類的格外嚴(yán)重的異常和一組超類是“異?!鳖惖牟荒敲幢瘧K的異常。
當(dāng)一個(gè)異常被丟出時(shí),Java虛擬機(jī)執(zhí)行對適用于被丟出異常的封裝的異常處理器進(jìn)行樹狀搜索找到的第一異常處理器。為了確保適用于被丟出異常的最低類的封裝異常處理器被使用,Java程序(也就是方法)的作者通常要給方法中的異常處理器排序以使較低類的封裝異常處理器位于較高級類的異常處理器之前(類級別由異常層次的位置決定)。更進(jìn)一步,當(dāng)有兩個(gè)或更多適用于引起異常被丟出指令并用于幾乎相同的異常狀況的封裝異常處理器時(shí),Java虛擬機(jī)執(zhí)行由調(diào)用引起異常方法的方法鏈中最近的方法所建立的適用的封裝異常處理器。
當(dāng)單個(gè)異常處理器表在步驟506中被排序并被裝載之后,鏈接的異常處理器表中的每個(gè)異常處理器入口被轉(zhuǎn)換成一個(gè)用來在資源受限設(shè)備像智能卡(圖4)中使用的優(yōu)化的數(shù)據(jù)結(jié)構(gòu)。在一個(gè)實(shí)現(xiàn)中,用于鏈接的異常處理器表556中優(yōu)化入口的數(shù)據(jù)結(jié)構(gòu)被列在圖6中。鏈接的異常處理器表600包括多個(gè)入口602,它們中的每一個(gè)都包括與異常處理器信息數(shù)據(jù)結(jié)構(gòu)一致的數(shù)據(jù)。異常處理器信息數(shù)據(jù)結(jié)構(gòu)包括起始偏移604,活動(dòng)長度606,處理器偏移610以及捕獲類型索引612。
起始偏移604和結(jié)束偏移(未顯示)是進(jìn)入到特定方法組件之中的字節(jié)偏移。起始和結(jié)束偏移用一個(gè)字節(jié)碼數(shù)組來指示異常處理器的活動(dòng)范圍。起始偏移604的值必須是到相對于一條指令的操作碼的字節(jié)碼數(shù)組之中的一個(gè)有效偏移。
結(jié)束偏移被定義為起始偏移604加上活動(dòng)長度606。結(jié)束偏移的值必須是到相對于一條指令的操作碼的字節(jié)碼數(shù)組之中的一個(gè)有效偏移或者必須等于方法的字節(jié)碼數(shù)量(代碼數(shù)組的長度)。起始偏移604的值必須小于結(jié)束偏移的值。起始偏移604是內(nèi)包含的而結(jié)束偏移是外包含的;也就是說,當(dāng)執(zhí)行地址在區(qū)間[起始偏移,結(jié)束偏移)內(nèi)時(shí),異常處理器必須是活動(dòng)的。
活動(dòng)長度606用字節(jié)碼定義由給定異常處理器封裝的指令范圍。在一個(gè)實(shí)現(xiàn)中,活動(dòng)長度606被編碼以指出特定異常處理器的活動(dòng)范圍是否被嵌套在另一異常處理器之中,更明確一點(diǎn),當(dāng)前異常處理器是否是與特定被保護(hù)代碼塊相關(guān)的異常處理器列表中的最后一個(gè)處理器。對用Java編程語言編寫的程序來說,位被編碼以指出當(dāng)前異常處理器是否是用于被保護(hù)代碼塊的異常處理器列表中的最后一個(gè)處理器(catch或finally子句)。如果被保護(hù)代碼塊不被包容在另一被保護(hù)代碼塊之中并且當(dāng)前處理器是與被保護(hù)代碼塊相關(guān)的最后一個(gè)處理器則活動(dòng)長度606的高位被設(shè)成1。如果被保護(hù)代碼塊被包容在另一被保護(hù)代碼塊之中或者當(dāng)前處理器不是與被保護(hù)代碼塊相關(guān)的最后一個(gè)處理器則活動(dòng)長度606的高位被設(shè)為0。在使用編碼的地方,結(jié)束偏移被定義為起始偏移604加上活動(dòng)長度606以及0×7FFF。
處理器偏移608表示一個(gè)到方法組件的info項(xiàng)之中的字節(jié)偏移。更明確一點(diǎn),處理器偏移608指出當(dāng)一個(gè)特定異常被捕獲時(shí)異常處理器的起始和執(zhí)行將被Java虛擬機(jī)恢復(fù)的位置。處理器偏移608的值必須是到相對于一條指令操作碼的方法的字節(jié)碼數(shù)組之中的一個(gè)有效偏移,并且必須小于方法的字節(jié)碼數(shù)量的值。
捕獲類型索引612指示異常處理器類型。為了把控制傳輸?shù)疆惓L幚砥?,與被丟出異常相關(guān)的程序計(jì)數(shù)器必須落在為異常處理器定義的范圍之中并且必須是同一類型。如果捕獲類型索引610的值是非零,它必須是到代表由異常處理器捕獲到的異常的類的常量池表之中的一個(gè)有效索引。如果異常處理器代表一個(gè)finally子句,捕獲類型索引610的值被設(shè)為0。一個(gè)finally子句異常處理器被稱為是用于在起始偏移與結(jié)束偏移的范圍中被丟出的所有異常,不考慮類型。
再看圖4,在轉(zhuǎn)換之后,CAP文件可以被存儲在一個(gè)計(jì)算機(jī)可讀介質(zhì)17如硬盤驅(qū)動(dòng)器,軟盤驅(qū)動(dòng)器,光學(xué)存儲介質(zhì),閃存裝置或其他合適的介質(zhì)上。
這時(shí)CAP文件16被拷貝或傳輸?shù)揭粋€(gè)帶有外圍卡接收設(shè)備(CAD)24像桌面計(jì)算機(jī)一樣的終端22中??ń邮赵O(shè)備24可以被寫信息并從智能卡40上接收信息??ń邮赵O(shè)備24包括一個(gè)可把智能卡40插入到其中的卡端口(未顯示)。一旦插入進(jìn)去,同對壓在智能卡40的連接區(qū)表面上的一個(gè)連接器接觸以提供電源并允許與智能卡40通信。終端22還包括一個(gè)用來裝入CAP文件并把它傳送給智能卡40的安裝工具或程序26。
智能卡40有一個(gè)輸入/輸出(I/O)端口42,包括一套通過程序進(jìn)行的聯(lián)系,可以提供數(shù)據(jù)和通信。智能卡40還包括一個(gè)用于接收CAP文件的內(nèi)容并為在智能卡40上的執(zhí)行準(zhǔn)備Java小應(yīng)用程序的安裝工具46。安裝工具46可以被實(shí)現(xiàn)為一個(gè)Java程序并可在智能卡40上被執(zhí)行。智能卡40還有存儲器,包括可變存儲器像隨機(jī)訪問存儲器50和不可變存儲器像電子可擦可編程只讀存儲器(EEPROM)。智能卡40還有只讀存儲器像只讀存儲器52。由轉(zhuǎn)換器14準(zhǔn)備的Java小應(yīng)用程序(CAP文件16)可以被存儲在電子可擦可編程只讀存儲器中。
作為安裝過程的一部分,安裝工具46創(chuàng)建一個(gè)或多個(gè)數(shù)據(jù)區(qū)以易于運(yùn)行時(shí)操作。數(shù)據(jù)區(qū)的一個(gè)例子是異常記錄。異常記錄是在解釋一個(gè)丟出的異常時(shí)由JavaCardTM使用的一個(gè)列表。
參見圖4和圖7,異常記錄700可以是一個(gè)可延長的鏈接好的列表數(shù)據(jù)結(jié)構(gòu)。新入口可以加在列表的頭部。異常記錄700中的每個(gè)入口702代表一個(gè)包含異常處理器的方法組件550(見圖5b)。沒有異常處理器的方法組件不被包含在內(nèi)。
在一個(gè)已轉(zhuǎn)換Java小應(yīng)用程序文件的安裝過程中,安裝工具46調(diào)用一個(gè)JavaCard虛擬機(jī)以登記與包相關(guān)聯(lián)的方法組件。每個(gè)入口包括相關(guān)方法組件的地址704和它的大小706。地址704和大小706通過對程序計(jì)數(shù)器(pc)的引用為包括在包中的指令定義了一個(gè)范圍。異常記錄的使用在下面有詳細(xì)描述。
像在上面的背景中所描述的那樣,Java虛擬機(jī)保持不同的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)以跟蹤方法的執(zhí)行和引用。JavaCard虛擬機(jī)也是這樣做的。在運(yùn)行時(shí),JavaCard虛擬機(jī)保持一個(gè)程序計(jì)數(shù)器和一個(gè)運(yùn)行時(shí)棧。運(yùn)行時(shí)棧存儲JavaCard虛擬機(jī)幀?,F(xiàn)在看圖8,顯示了一個(gè)包括大量Java虛擬機(jī)幀802的運(yùn)行時(shí)棧800。每一幀包括一個(gè)返回指針806。
返回指針806指向調(diào)用當(dāng)前方法的方法,更明確一點(diǎn)是指向在當(dāng)前方法執(zhí)行完畢時(shí)執(zhí)行在調(diào)用方法中恢復(fù)的地方。
像下面所進(jìn)一步解釋的那樣,沒有對當(dāng)前正在執(zhí)行方法的引用需要被存儲在運(yùn)行時(shí)棧上。用于與一個(gè)包相關(guān)聯(lián)的所有方法的所有異常處理器被存儲在一個(gè)單獨(dú)的鏈接的異常處理器表中,它可以在運(yùn)行時(shí)被搜索以找到與當(dāng)前程序計(jì)數(shù)器有關(guān)的異常處理器。
現(xiàn)在看圖9,一個(gè)用于運(yùn)行時(shí)異常處理的過程900在902步開始。JavaCard虛擬機(jī)明確地或隱含地丟出一個(gè)異常(904)。異常的類(906)與異常被丟出處的程序計(jì)數(shù)器位置(908)一起被確定。
在異常記錄中進(jìn)行搜索以定位封裝了異常被丟出處的程序計(jì)數(shù)器的方法組件(910)。這取決于當(dāng)前幀的方法被實(shí)現(xiàn)在哪個(gè)包中。如果沒有找到相匹配的封裝的方法組件(并且因此沒有鏈接的異常處理器表)(912),那么就檢查確定是否有棧幀可以被彈出運(yùn)行時(shí)棧(914)。如果沒有可被彈出運(yùn)行時(shí)棧的棧幀,JavaCard虛擬機(jī)將帶著一個(gè)未捕獲的異常被停機(jī)(916)。如果有其他幀可以從Java棧中被彈出,則該幀被彈出(918)。幀的彈出包括恢復(fù)先前的幀并給程序計(jì)數(shù)器設(shè)一個(gè)新值,也就是由存儲在運(yùn)行時(shí)棧中的返回指針?biāo)甘静⑴c先前的幀相關(guān)的返回位置。此后,過程繼續(xù)在910步執(zhí)行。入口從運(yùn)行時(shí)棧中彈出允許包之間的方法嵌套。也就是說,在第一個(gè)包中的一個(gè)方法可能被第二個(gè)不同的包中的調(diào)用方法調(diào)用。像這樣,調(diào)用方法被稱為是封裝了被調(diào)用方法,并相應(yīng)地可以包括適用于被調(diào)用方法沒有捕獲到給定異常的事件的異常處理器。
如果一個(gè)封裝的方法組件在搜索步驟910中被定位,那么相關(guān)的鏈接異常處理器表(當(dāng)前的鏈接異常處理器表)中與方法組件相關(guān)的一個(gè)入口就被獲得(在這種情況下是第一個(gè)入口)(930)。在一個(gè)實(shí)現(xiàn)中,存儲在異常記錄中的起始地址指向用于給定方法組件的鏈接異常處理器表中第一個(gè)入口的地址。像這樣,下列步驟的執(zhí)行可以在從異常記錄中得到起始地址后直接進(jìn)行。
檢查與正在被測試的當(dāng)前入口相關(guān)的范圍以確定是否封裝了異常被丟出處的程序計(jì)數(shù)器(932)。如果沒有匹配發(fā)生,那么當(dāng)前鏈接異常處理器表中的下一個(gè)入口在步驟930中被得到。如果沒有更多入口可用(934),則過程繼續(xù)步驟914來檢查確定是否有更多的棧幀可以像上面所描述地那樣被彈出棧。
如果在步驟932中范圍封裝了程序計(jì)數(shù)器,則進(jìn)行檢查來確定由異常處理器指出的異常類型是否匹配丟出的異常(936)。如果丟出異常的類型與給定類相同或者是給定類的子類則類型匹配。匹配還發(fā)生在異常處理器與一個(gè)finally子句相一致時(shí)。finally子句是一個(gè)Java語言構(gòu)造,它允許程序員為所有類類型定義將要被執(zhí)行的異常處理器并因此對丟出異常的所有類型來說都是一個(gè)匹配。如果類型匹配,與當(dāng)前入口相關(guān)的異常處理器就被執(zhí)行(938)且過程結(jié)束(940)。更明確地,程序計(jì)數(shù)器被按照為異常處理器(從圖6的異常處理器偏移610)而存儲在當(dāng)前入口中的地址來設(shè)置且執(zhí)行從被捕獲異常處理器的第一個(gè)語句繼續(xù)執(zhí)行。
在一個(gè)實(shí)現(xiàn)中,并不是鏈接異常處理器表中的所有入口都被要求在是否一個(gè)未捕獲異常已被丟出的判斷之前進(jìn)行測試?,F(xiàn)在看圖10a,在步驟936中的類型測試之后,執(zhí)行一個(gè)額外的測試以確定是否有其它封裝的try語句被包括當(dāng)前方法中(937)。像上面所描述的,一個(gè)封裝的try語句反映其范圍也包括當(dāng)前程序計(jì)數(shù)器的其他異常處理器。如果當(dāng)前沒有封裝的try語句,那么過程可以立刻轉(zhuǎn)到運(yùn)行時(shí)棧彈出步驟914而不管當(dāng)前鏈接的異常處理器表中是否有其他入口仍在被處理。
在一個(gè)實(shí)現(xiàn)中,可以用為當(dāng)前入口而存儲在鏈接異常處理器表中的優(yōu)化位(活動(dòng)長度606項(xiàng)的已編碼的高位)來調(diào)用937步。更明確點(diǎn),用于當(dāng)前入口的活動(dòng)長度的高位被獲得(937a)。進(jìn)行檢查以確定該位是否被設(shè)置(937b)。如果該位沒有被設(shè)置(指示當(dāng)前有一封裝的try語句或有用于同一try語句的更進(jìn)一步的處理器),則過程繼續(xù)934步。如果該位被設(shè)置,則過程繼續(xù)914步。
在本發(fā)明已經(jīng)通過對一些特定實(shí)施方案的引用被描述過時(shí),這些描述是說明本發(fā)明而不應(yīng)該被解釋為限制本發(fā)明。對那些本領(lǐng)域的專家來說在不偏離由附錄的權(quán)利要求所定義的本發(fā)明的范圍的情況下各種不同的更改也可以出現(xiàn)。
本發(fā)明適用于以除Java以外的編程語言所編寫的方法和程序,包括被編譯成平臺無關(guān)代碼的編程語言。所描述的技術(shù)可用于其他環(huán)境中,例如用于以C或Pascal編寫的程序,那里也要求類似的棧操作。
權(quán)利要求
1.一種計(jì)算機(jī)實(shí)現(xiàn)的過程,用于由機(jī)器執(zhí)行在一個(gè)或多個(gè)類的方法的過程中處理可丟出異常,每個(gè)方法包括一個(gè)定義與方法相關(guān)的異常處理器的異常處理器數(shù)組,該過程包含把用于兩個(gè)或多個(gè)方法的異常處理器數(shù)組結(jié)合成一個(gè)單獨(dú)的異常處理器表。
2.權(quán)利要求1中的過程,包括把用于一個(gè)類中所有方法的所有的異常處理器數(shù)組結(jié)合成一個(gè)單獨(dú)的異常處理器表。
3.權(quán)利要求1中的過程,包括把用于所有類中所有方法的所有的異常處理器數(shù)組結(jié)合成一個(gè)單獨(dú)的異常處理器表。
4.權(quán)利要求1中的過程,包括把用于一個(gè)Java包中所有方法的所有異常處理器數(shù)組結(jié)合成一個(gè)單獨(dú)的異常處理器表。
5.權(quán)利要求1中的過程,其中方法被包括在一個(gè)類文件中而且結(jié)合所有異常處理器數(shù)組的步驟包括把用于一個(gè)類文件中所有方法的異常處理器數(shù)組結(jié)合成一個(gè)單獨(dú)的異常處理器表。
6.權(quán)利要求1中的過程,進(jìn)一步包括當(dāng)執(zhí)行多個(gè)方法之一的而一個(gè)異常被丟出時(shí),搜索異常處理器表,包括在單一異常處理器表中定位第一個(gè)匹配的異常。
7.權(quán)利要求6中的過程,其中搜索步驟包括從異常處理器表中有順序地得到異常處理器入口以及為第一個(gè)匹配的異常處理器檢查每一個(gè)異常處理器的類型和范圍。
8.權(quán)利要求7中的過程,進(jìn)一步包括如果當(dāng)前異常處理器不匹配且對一個(gè)相關(guān)方法中的被保護(hù)代碼的最高級來說是最后一個(gè)處理器時(shí)停止搜索。
9.權(quán)利要求1的過程,其中類文件是Java類文件。
10.權(quán)利要求1的過程,其中一個(gè)或多個(gè)類中的方法被組合一個(gè)包括一個(gè)包含第一和第二部分的包數(shù)據(jù)結(jié)構(gòu)的包,該過程包括把異常處理器表和所有方法分別存儲在包的第一和第二部分。
11.權(quán)利要求10的過程,其中結(jié)合步驟包括鏈接異常處理器數(shù)組,其中包含按照預(yù)定義的順序把每個(gè)異常處理器數(shù)組裝入到包數(shù)據(jù)結(jié)構(gòu)的第一部分。
12.權(quán)利要求11的過程,其中預(yù)定義的順序是根據(jù)存儲在包數(shù)據(jù)結(jié)構(gòu)第二部分中的方法的順序來確定的。
13.權(quán)利要求1的過程,其中機(jī)器是一個(gè)實(shí)現(xiàn)在資源受限設(shè)備上的虛擬機(jī)。
14.權(quán)利要求13的過程,其中資源受限設(shè)備是一個(gè)智能卡。
15.權(quán)利要求14中的過程,其中一個(gè)或多個(gè)類中的方法被組合成一個(gè)包且該包被安裝到智能卡上。
16.權(quán)利要求15中的過程,進(jìn)一步包括創(chuàng)建包括一個(gè)包含第一和第二部分的包數(shù)據(jù)結(jié)構(gòu)的包,該過程包括把用于每個(gè)方法的異常處理器數(shù)組鏈接成一個(gè)異常處理器表,把異常處理器表存儲在包的第一部分,把所有方法存儲在包的第二部分。
17.一種減少在執(zhí)行程序時(shí)運(yùn)行時(shí)棧所要求的存儲量的方法,運(yùn)行時(shí)棧在由機(jī)器執(zhí)行程序的過程中為存儲一個(gè)或多個(gè)幀而在運(yùn)行時(shí)保持,其中每個(gè)幀包括一個(gè)指向程序中調(diào)用當(dāng)前執(zhí)行方法的調(diào)用方法,該方法包括把用于包括在程序中的方法的異常處理器信息結(jié)合成一個(gè)復(fù)合異常處理器表;和在其中一個(gè)方法執(zhí)行的過程中,當(dāng)一個(gè)異常被丟出時(shí),定位和搜索復(fù)合異常處理器表而在不要求指向異常處理器信息的指針的運(yùn)行時(shí)棧上的存儲空間的情況下定位異常處理器信息。
18.權(quán)利要求17的方法,其中指針是一個(gè)指向異常處理器信息的直接指針。
19.權(quán)利要求17的方法,其中程序是Java程序。
20.權(quán)利要求19的方法,其中機(jī)器是實(shí)現(xiàn)一個(gè)JavaTM虛擬機(jī)的虛擬機(jī)。
21.權(quán)利要求17的方法,其中程序包括多個(gè)方法,方法在一個(gè)或多個(gè)類中,虛擬機(jī)被實(shí)現(xiàn)在一個(gè)包被安裝在其上并執(zhí)行的資源受限設(shè)備上。
22.權(quán)利要求21的方法,其中資源受限設(shè)備是智能卡。
23.權(quán)利要求21的方法,進(jìn)一步包括在安裝時(shí)把包注冊在一個(gè)注冊服務(wù)中,注冊服務(wù)保存一個(gè)指針和一個(gè)范圍,指針指示資源受限設(shè)備中與給定包相關(guān)的復(fù)合異常處理器表的一個(gè)位置,范圍定義資源受限設(shè)備中的一個(gè)地址范圍,在其處與包相關(guān)的方法被定位。
24.權(quán)利要求23的方法,其中定位步驟包括定位一個(gè)與當(dāng)前執(zhí)行方法相關(guān)的包,包括比較異常被丟出處的地址與登記在注冊服務(wù)中每一個(gè)包的范圍,搜索步驟包括搜索與一個(gè)已定位的包相關(guān)的復(fù)合異常處理器表。
25.一種轉(zhuǎn)換類文件為已轉(zhuǎn)換的小應(yīng)用程序以在資源受限設(shè)備上執(zhí)行的方法,包括接收一個(gè)或多個(gè)類文件,每個(gè)類文件包括一個(gè)或多個(gè)方法,每個(gè)方法包括一個(gè)定義可被方法捕獲的異常處理器的異常處理器數(shù)組;為了給已轉(zhuǎn)換的小應(yīng)用程序存儲方法和異常處理器定義一個(gè)包括第一和第二部分的數(shù)據(jù)結(jié)構(gòu);為方法定義一個(gè)順序并按照這個(gè)順序把方法裝載到數(shù)據(jù)結(jié)構(gòu)的第二部分中;把用于所有方法的異常處理器數(shù)組結(jié)合到一個(gè)單獨(dú)的異常處理器表中,包括按照為方法定義的順序給異常處理器數(shù)組排序并把單一的異常處理器表存儲在數(shù)據(jù)結(jié)構(gòu)的第一部分中。
26.一種計(jì)算機(jī)實(shí)現(xiàn)的過程,用于由虛擬機(jī)執(zhí)行在一個(gè)或多個(gè)類中的兩個(gè)或多個(gè)方法的過程中處理可丟出異常,每個(gè)方法都包含在類中,并包括一個(gè)異常處理器數(shù)定義與方法相關(guān)的異常處理器,單個(gè)的異常處理器數(shù)被結(jié)合并形成一個(gè)用于兩個(gè)或更多方法的單獨(dú)的異常處理器表,該過程包括在執(zhí)行多個(gè)方法之一的過程中,當(dāng)一個(gè)異常被丟出時(shí),搜索異常處理器表,包括在單一異常處理器表中定位第一個(gè)匹配的異常。
27.一種計(jì)算機(jī)實(shí)現(xiàn)的系統(tǒng),用于由機(jī)器執(zhí)行在一個(gè)或多個(gè)類中的兩個(gè)或多個(gè)方法處理可丟出異常,每個(gè)方法包括一個(gè)異常處理器數(shù)組定義與方法相關(guān)的異常處理器,該系統(tǒng)包括執(zhí)行下列功能的指令結(jié)合用于所有方法的異常處理器數(shù)組成為一個(gè)單獨(dú)的異常處理器表。
28.一種計(jì)算機(jī)實(shí)現(xiàn)的系統(tǒng),用于在執(zhí)行程序時(shí)減少運(yùn)行時(shí)棧所要求的存儲容量,運(yùn)行時(shí)棧在由機(jī)器執(zhí)行程序的過程中為存儲一個(gè)或多個(gè)幀而在運(yùn)行時(shí)保持,其中每個(gè)幀包括一個(gè)指向程序中調(diào)用當(dāng)前執(zhí)行方法的調(diào)用方法,該系統(tǒng)包括執(zhí)行下列功能的指令將包含在程序中的多個(gè)方法的異常處理器信息結(jié)合成一個(gè)復(fù)合異常處理器表;和在其中一個(gè)方法的執(zhí)行過程中,當(dāng)一個(gè)異常被丟出時(shí),定位和搜索復(fù)合異常處理器表而在不要求指向異常處理器信息的指針的運(yùn)行時(shí)棧上的存儲空間的情況下定位異常處理器信息。
29.一種計(jì)算機(jī)實(shí)現(xiàn)的系統(tǒng),用于轉(zhuǎn)換類文件為已轉(zhuǎn)換的小應(yīng)用程序以在資源受限設(shè)備上執(zhí)行,該系統(tǒng)包括執(zhí)行下列功能的指令接收一個(gè)或多個(gè)類文件,每個(gè)類文件包括一個(gè)或多個(gè)方法,每個(gè)方法包括一個(gè)異常處理器數(shù)組定義可被該方法捕獲的異常處理器;為了給已轉(zhuǎn)換的Java小應(yīng)用程序存儲方法和異常處理器定義一個(gè)包括第一和第二部分的數(shù)據(jù)結(jié)構(gòu);為方法定義一個(gè)順序并按照這個(gè)順序把方法裝載到數(shù)據(jù)結(jié)構(gòu)的第二部分中;把用于所有方法的異常處理器數(shù)組結(jié)合到一個(gè)單獨(dú)的異常處理器表中,包括按照為方法定義的順序給異常處理器數(shù)組排序并把單一的異常處理器表存儲在數(shù)據(jù)結(jié)構(gòu)的第一部分中。
30.一種計(jì)算機(jī)實(shí)現(xiàn)的系統(tǒng),用于由虛擬機(jī)執(zhí)行在一個(gè)或多個(gè)類中的多個(gè)方法的過程中處理可丟出異常,每個(gè)包含在類中的方法都包括一個(gè)異常處理器數(shù)定義與方法相關(guān)的異常處理器,單個(gè)的異常處理器數(shù)組被結(jié)合形成一個(gè)用于兩個(gè)或更多方法的單獨(dú)的異常處理器表,該系統(tǒng)包括執(zhí)行下列功能的指令在執(zhí)行兩個(gè)或多個(gè)方法其中之一的過程中當(dāng)一個(gè)異常被丟出時(shí)搜索異常處理器表,包括在單一異常處理器表中定位第一個(gè)匹配的異常。
全文摘要
用于在由機(jī)器執(zhí)行一個(gè)或多個(gè)類的方法的過程中處理可丟出異常的設(shè)備與過程,包括計(jì)算機(jī)實(shí)現(xiàn)的過程。每個(gè)方法包括一個(gè)定義與該方法相關(guān)的異常處理器的異常處理器數(shù)組。該方法包括把用于所有方法的異常處理器數(shù)組結(jié)合成一個(gè)單獨(dú)的異常處理器表。
文檔編號G06F9/46GK1346463SQ00805920
公開日2002年4月24日 申請日期2000年2月2日 優(yōu)先權(quán)日1999年2月2日
發(fā)明者J·E·施瓦貝, J·B·蘇塞爾 申請人:太陽微系統(tǒng)有限公司