JP4398538B2 - 命令セット内の命令に応答してプロセスを実行するデータ処理システムおよびその命令処理方法 - Google Patents

命令セット内の命令に応答してプロセスを実行するデータ処理システムおよびその命令処理方法 Download PDF

Info

Publication number
JP4398538B2
JP4398538B2 JP13332599A JP13332599A JP4398538B2 JP 4398538 B2 JP4398538 B2 JP 4398538B2 JP 13332599 A JP13332599 A JP 13332599A JP 13332599 A JP13332599 A JP 13332599A JP 4398538 B2 JP4398538 B2 JP 4398538B2
Authority
JP
Japan
Prior art keywords
instruction
jump
function
context
exception
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Lifetime
Application number
JP13332599A
Other languages
English (en)
Other versions
JP2000112772A (ja
Inventor
− ペテル ニルソン ハンス
Original Assignee
アクシス アクチボラグ
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by アクシス アクチボラグ filed Critical アクシス アクチボラグ
Publication of JP2000112772A publication Critical patent/JP2000112772A/ja
Application granted granted Critical
Publication of JP4398538B2 publication Critical patent/JP4398538B2/ja
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4482Procedural
    • G06F9/4484Executing subprograms
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/48Indexing scheme relating to G06F9/48
    • G06F2209/481Exception handling

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Executing Machine-Instructions (AREA)
  • Advance Control (AREA)
  • Devices For Executing Special Programs (AREA)

Description

【0001】
【発明の属する技術分野】
本発明は一般的にソフトウェアプログラムの信頼性を高めその挙動を改善するシステムおよび方法に関する。特に、本発明はデジタルコンピュータ上で作動するプログラムが例外条件および実行時プログラムエラーから回復できることを保証するタスクにおいてソフトウェア開発者を支援する例外処理システムおよび方法に関する。
【0002】
【従来の技術】
デジタルコンピュータは所望のタスクを遂行する前に、適切な命令セットを受信しなければならない。コンピュータのマイクロプロセッサにより実行され、集約的に“コンピュータプログラム”と呼ばれるこれらの命令はコンピュータの操作を指令する。
【0003】
コンピュータは本質的に“機械符号”、すなわちコンピュータのマイクロプロセッサにより特定命令として解釈される特定のタスクを実施する低水準命令、しか理解できない。機械語すなわち機械符号はコンピュータが実際に理解できる唯一の言語であるため、他のプログラミング言語は全て人間がコンピュータに特定のタスクを実施させられるようにする“人間”言語の構成方法を表すものである。
【0004】
人間は機械符号で有意プログラムを構成することができるが、実際上今日のソフトウェア開発は全て1つ以上の利用可能なプログラミング言語を利用している。最も広く使用されているプログラミング言語は、C++/Cもしくはパスカル等の、“高水準”言語である。
【0005】
“コンパイラ”と呼ばれるプログラムがこれらの命令を必要な機械語へ変換する。この変換の文脈において、高水準言語で書かれるプログラムは“原始コード”もしくは原始(ソース)プログラムと呼ばれる。コンパイラの最終出力は“目的モジュール”であり、それは目的プロセッサが実行する命令を含んでいる。目的モジュールはコンピュータの操作を命令する符号を含んではいるが、目的モジュール自体はコンピュータにより直接実行できる形式ではない。それは最終実行可能プログラムが生成される前に“リンキング”操作を経なければならない。
【0006】
リンキングは1つ以上のコンパイルされた目的モジュールを結合すなわちリンキングして実行可能プログラムを作り出すための一般的プロセスと考えることができる。通常、このタスクは“リンカー”と呼ばれるプログラムの任務である。典型的な操作では、リンカーはユーザもしくは一体化されたコンパイラからリンク操作に含めたい目的モジュールのリストを受け取る。リンカーは指定されたオブジェクトおよびライブラリファイルからの目的モジュールを走査する。必要に応じて相互接続参照を導出した後で、リンカーはプログラムのモジュールからの目的コードをオペレーティングシステムプログラムローダにより理解されるフォーマットで構成することにより実行可能なイメージを構成する。リンキングの最終結果は実行可能な符号(典型的には..exe ファイル)であり、それはテストおよび品質保証の後で適切なインストレーションおよび使用命令を有するユーザへ通されるか、あるいは埋込コンピュータシステムを有する製品内にインストールするために工場へ通される。
【0007】
プログラムの開発はおおむね試行錯誤プロセスである。プログラム開発サイクルから生じるエラーは、コンパイル時間エラー、リンケージエラー、実行時エラー、およびプログラマコントロールを越える予期せぬ故障により実行時に生じるエラーを含む広いクラスへ分割することができる。このような予期せぬ故障の例としてネットワークを介して共有される外部資源の故障、およびネットワークの故障が含まれる。適切な開発方法および品質保証によりコンパイルエラー(シンタクスおよびフォーマット違反等)およびリンケージエラー(ライブラリおよびグローバルネーミング矛盾等)の両方が除去されるが、実行時エラーは系統だった解消がしにくい。事実、実行時エラーの最重要性は通常それをユーザが発見しユーザに重大なフラストレーションを与えるという事実から生じる。適切に処理されなければ、実行時エラーにより簡単に実行が中断(終止)され、システムは問題ある状態とされユーザは何が悪く次に何をすべきか判らない。実行時エラー問題を追跡できない多くの理由がある。第1に、プログラム実行中に全てのユーザアクションを予測するのは困難である。良心的なプログラマーであれば役立つメニューおよびプロンプトによりユーザを案内し、各ユーザ応答の有効性を調べるコードの挿入に努めるが、実際上は、任意のユーザ入力を予測して応答するのは重大なプログラミングへの挑戦となる。
【0008】
第2に、プログラム実行の展開につれて必要となるさまざまなハードエゥアおよびソフトウェア資源の利用可能性を予測することは困難であり、しばしば不可能である。例えば、実行中のプログラムはその実行のさまざまなポイントにおいて、それがないとプログラムを有用に続けられない、RAM(ランダムアクセスメモリ)およびディスク記憶装置割当を要求することがある。同様に、実行中のプログラムはオペレーティングシステム、ライブラリ、もしくはさまざまな理由によりプログラマーコントロールを越えていてその時点では利用できない他のルーチンを呼び出すことがある。一般的なエラーは、例えば、プログラムがネットワークエラーにより利用不能なファイルへのアクセスを求める場合に生じる。ハードエゥア資源の例外により、プログラムは回避的アクションをとるかあるいは単に終止(エグジットもしくはアボート)しなければならない。この種の例外は同じプログラム内の1組の独立したユーザアプリケーションもしくは1組の独立した実行スレッド(thread)が同じ資源を共有しなければならない最新の計算環境では特によく起こることである。
【0009】
資源のアベイラビリティおよび予期せぬユーザアクションの他に、もう1つの実行時エラー源としてコンパイレーションやリンケージ中に検出不能な本来のコーディングバグが含まれる。例えば、コンパイラーにより正当なものとして受け入れられた数式からその変数成分のある値に対する実行時エラーを生じることがある。典型的なケースは“÷0”エラーおよび式を正しく評価できない類似の状況である。このようなエラーは予測可能であり理論上は回避できる。しかしながら、実際上は従来の例外処理には各式を評価する前に変数値の条件付テストの過剰なハードコード化が伴い、それに無効な評価をバイパスするアドホックルーチンが続く。この方法はいかにも長たらしくエラーを生じやすい。
【0010】
現在プログラム開発に使用されている大概の高水準言語は、一般的に必要なオペレーションセットを別々な名称のサブルーチン、手順、もしくは関数(ファンクション)内に密閉することができるモジュール性の概念を使用している。符号化されると、このようなサブルーチンはそれらをメインプログラム内の任意のポイントから“呼び出す”ことにより簡約することができる。さらに、サブルーチンがサブルーチンを呼び出すことができ、大概の場合実行中のプログラムはめったに命令の線形シーケンスではない。例えば、C言語では一連の関数を呼び出すmain()プログラムが書き込まれ、各関数が関数を呼び出すことができる。全てがうまく行けば、コントロールは最後にmain()へ戻る。関数呼出しのこの入れ子構造によりプログラムの構造が単純化されるが、同時に例外処理が複雑化する。関数呼出しの本質は任意の引数(すなわち、パラメータ)を目的関数へ通し、関数の実行可能なコードを保持しているメモリ部へコントロールを転送し、呼出しの結果を返し、同時に原始関数呼出しが行われたポイントのすぐ後で後続する実行が再開されることを保証するのに十分な情報を格納しなければならないことである。従来技術で既知のこの関数呼出し機構は、通常呼出しの前、間、および後でデータおよびメモリアドレスのオン及びオフでスタックに対してプッシュ及びプルして達成される。スタックは通常LIFO(後入れ、先出し)データ構造として構成されるメモリの単なる専用部である。スタックは通常プログラマーにより直接操作されず、プログラマーにより符号化される関数呼出しの結果としてその内容が変えられる。プログラムはしばしばヒープと呼ばれるメモリの他の部分に直接アクセスを有し、例外処理のキー要素にはこの不可欠資源の管理が含まれる。
【0011】
関数呼出しが成功した後でスタックはアンワインド(unwind)される、すなわち、スタック上に“押し込まれた”全データが逆の順序で“ポップ”オフされ、スタックはさらなる関数呼出しに対する準備が完了している呼出前状態とされ、呼出しを行った関数で実行が再開される。関数呼出しは任意レベルで入れ子構造とすることができるため、スタックはプログラムの適切な実行に絶対必要な復帰値および命令ポインターの不可欠で複雑なシーケンスを維持しなければならない。最後に、何の問題もなければコントロールはmain()へ戻り、main()の最後の関数呼出しに成功した後でプログラムは終止する。このアンワインディングプロセスに何らかの割り込みがあれば、不平衡なスタックとなって予測不能な結果を生じる。例えば、呼び出された関数はスタックの頂部において関数のスタックフレームと呼ばれる特定部分内でその引数を見つけることを予期するが、スタックが不平衡であれば関数は誤ったデータを引き抜いて実行時エラーがさらに混合される。
【0012】
明らかに、入れ子構造関数内で生じる例外条件およびエラーにより特に困難な問題が生じる。この問題に対処するためにいくつかの例外処理方法が試みられている。例えば、1つの方法は独立変数もしくは正規の復帰値に対する特別な範囲の値として各関数にエラー表示を返させることである。次に、例外条件の即時負担が呼出関数にかかってくる。呼出関数は対処できなければ、その呼出関数へエラー表示を返さなければならず、例外を処理できる関数に達するかもしくはmain()に達するまで連鎖をさかのぼる。main()は問題を修正できなければ、恐らく多分ユーザに対する説明メッセージをディスプレイして、できるだけ優雅に終止する。
【0013】
例として、main()がfuncA()を呼び出し、次にそれがfuncB()を呼び出すものとする。funcB()は、例えば、成功に対するゼロもしくは失敗理由を示す正の数を返すようにプログラムされる。例えば、funcB()は“不十分メモリ”に対して1、“ファイル見つからず”に対して2、等を返す。funcA()は常にfuncB()から返される値をテストする。このテストが成功を示す場合には、funcA()はコントロールを続行し最後にmain()へ返す。funcB()が“不十分メモリ”であることを検出すると、funcA()は状況を修正し(“ごみ集め”もしくはヒープのデフラグメント化により)次にfuncB()を再度呼び出すことができる。しかし、“ファイル見つからず”エラーを検出すると、funcA()はウォーニングを表示する以外にこの状況に対処する手段がない。継続不能であるため、funcA()はmain()へエラー値を返さなければならない。もちろん、main()がこのエラー処置に何ができるかは特定のアプリケーションによって決まる。
【0014】
この“エラー連鎖”方式の利点はスタックが常に正しくアンワインドされることであるが、いくつかの重大な欠点がある。チェーン内の各関数はその被呼関数内に生じる予測を“捜す”コードを課せられる。このコードはどの予測を処理することができどの予測を呼出関数へ返さなければならないかも“判断”しなければならない。関数呼出しが深い入れ子構造とされており、異なる予測タイプ数が増加すると、予測のテストおよび連鎖はエラーを生じやすいプログラミング上の主要な悩みの種となる。良く方式化され、読み易く、保守可能な符号に対する著しい障害は前記した簡単な例から明白である。funcA()から返される例外を処理するようにされると、main()は例外のタイプおよびどこで例外が生じるかの両方を知る必要がある。例外のタイプはエラーコードから明白であるが、それがfuncA()ではなくfuncB()内で生じたという事実や、問題が変化して拡張される場合には、チェーン内の他の関数の中にはエラーコーディングを付加しないと即座には明白にならないものが出てくる。
【0015】
この問題に対する1つの返答は任意の関数の任意のポイントから、識別子ラベルにより与えられるアドレスにおける、メモリ内の任意の場所に常駐するルーチンへコントロールを転送することができるグローバル(すなわち、長い)go to labe命令である。この方式の元では、先行する例のfuncB()は関数チェーンへエラーコードを返す必要はないが、エラーを検出したら適切な例外ハンドラーへ直接コントロールを送ることができる。
【0016】
例えば、no−mem−ハンドラーにおける例外ハンドラーは“不十分メモリ”エラーをすべて処理し、必要ならば、serrの値を使用してどの関数内でエラーが生じたを確認するものと推定される。本技術では、funcB()が“不十分メモリ”例外を“スロー(throw)”し、no−mem−ハンドラーにおけるルーチンが例外を“キャッチ(catch)”する。
【0017】
この簡単なグローバルgo to方法には各例外ハンドラーに対して単一の読出可能場所を提供する利点があるが、実際上は他の問題が生じる。第1に、CおよびC++言語における標準go to命令は関数内でしか作動せず、関数間でコントロールを転送するために必要な長距離パワーを欠く。第2に、前記したように、ハンドラーへの直接転送はスタックを正しくアンワインドすることができない。最後に、最初の2つの難点に関連して、スロー関数にコントロールを返すことができる付加機構が必要である。ハンドラーがエラーを“修正”できるこれらの場合にスロー関数の実行を再開するために、例外処理機構はスロー関数の状態や文脈の保存および回復をできなければならない。
【0018】
例えば、funcB()が例外をスローする場合、その局所変数は特定値を保持している。名称からお判りのように、局所変数の範囲および存在は関数の“寿命”に制限され、関数がコントロールを手放すと消滅する。これらの局所値および中央プロセッサのレジスタ内の現在値等の他のパラメータはfuncB()の状態を構成する。特に、この状態にはスタック状態および実行を再開すべきメモリ内の場所をマークする現在のIP(命令ポインター)が含まれる。この状態はハンドラーが呼び出される前に完全に保存し、次にfuncB()の実行を安全に再開できる前に完全に回復しなければならない。
【0019】
グローバルgo to“解決策”のいくつかの欠陥は2つの標準Cライブラリ関数、setjmp()およびlongjmp()の導入により緩和されている。整合するlongjmp()が別の関数内に呼び出される場合には、setjmp()はコントロールを再開すべきポイントにおいて任意の関数内に呼び出すことができる。典型的に、longjmp()は例外がスローされる場合に呼び出される。setjmp()は引数として現在関数の状態が保存されるプログラマー供給メモリバッファへの(ポインター)のアドレスをとる。前記したように、この状態はsetjmp()呼出しの直後に実行を再開するのに必要な、現在命令ポインターIP(プログラムカウンタPCとも呼ばれる)を含む、プロセッサレジスタを保持する。go toとは異なり、longjmp()は異なる関数間で次のようにコントロールを転送することができる。longjmp()はその引数の1つとして整合するsetjmp()内で使用される同じバッファーアドレスをとる。呼び出されると、longjmp()はsetjmp()により保存される状態を回復し、格納されたIP内で見つかるアドレス、すなわちsetjmp()呼出しに続く命令、へコントロールを転送する。さらに、longjmp()はsetjmp()を呼び出した関数内でテストすることができる第2のニューメリック引数をとり、特定のどのlongjmp()が飛び越しを生じたかを確認する機構を提供する。
【0020】
funcA()、funcB()、もしくはそれらが呼び出す任意の関数、もしくはこれらの関数が呼び出す任意の関数(以下、同様)において、ステートメント“longjmp(aJmpBuf,状態);”はin retvalの値状態を返すために特殊状況においてfuncA()内のsetjmp()が“呼び出され”、続いてfuncA()内のif(retval)ラインへコントロールが復帰されることを保証する。後続関数内に任意のlongjmp()呼出しがない場合には、setjmp()はゼロ(偽)へ戻りif(retval)テストは失敗する。したがって、setjmp()およびlongjmp()対により例外処理用グローバルgo to方法が提供される。例外ハンドラーは任意の簡便な関数セット内へ密閉することができ、適切な処理の後で、所望によりコントロールは例外が生じた関数へ安全に転送し戻すことができる。
【0021】
しかしながら、setjmp()/longjmp()解決策には欠点もある。第1に、longjmp()が戻る関数がまだアクティブであるという保証がない。前例では、fna()が既に戻っていて、整合するlongjmp()に遭遇する前にスタック上のその場所を手放すことがある。この問題に対する唯一の解決策はmain()プログラムへのsetjmp()呼出しを制限することである。第2に、入れ子構造setjmp()およびlongjmp()内のスタックアンワインディング問題は慎重なエクスプリシットプログラミングを必要とすることである。最後に、多くのポピュラーなプログラミングオーバレイおよびバーチュアルメモリ技術が特殊なスタックを使用しており、関数の状態がsetjmp()により完全には格納されない。つまり、今日の方法では例外処理問題に適切に取り組むことができない。
【0022】
C++等の言語では局所変数の状態はさらに複雑であり、局所変数やオブジェクトは消去関数(destructor)として知られる特殊な関連関数を持たなければならず、それは消滅する前に呼び出されなければならない。
【0023】
例えばC++その他の高水準言語等のあるプログラミング言語は例外のプログラミングを容易にし、前記した方式を置換および拡張する特定の機構を有する。しかしながら、これらの機構の実施は複雑である。速度とスペース間のトレードオフ状況へ至る問題があり、それは従来技術でよく立証されている。
【0024】
特定の問題は復帰アドレスの位置(ロケーション)を呼出関数へ最適にマップする方法、呼出関数のスタックをハンドラーのポイントへアンワインドするのに必要な情報、もしくは関数“terminate()”を呼び出す判断ポイントに関連する。復帰アドレスへマップしなければならない情報はスタック−フレーム、すなわち回復レジスタ、をアンワインドしスタックポインターを回復するための必要データおよび一般的なスタックレイアウトに関する情報を保持するテーブルへのポインターを含み、かつこのフレーム内に許されキャッチされた例外の記述を含んでいる。あるいは、テーブル情報をコンパクト化してポインターの替わりに格納することができる。スタック−フレームの最適レイアウトはそれを呼び出す関数に非常に依存し、復帰アドレスおよびスタックポインターの値および/もしくは特別なインプリメンテーションに応用できるフレームポインターよりも多くの情報がなければ推定できない。例外ハンドラーのインプリメンテーションは、例外状況でしか使用されないため、例外がスローされない場合にはできるだけ少ないオーバヘッドを与えることが望ましい。
【0025】
従来技術で支配的なインプリメンテーションはプログラムカウンタベーステーブルに関連している。しかしながら、復帰アドレスの現在値を使用してプログラムカウンタ範囲のテーブルを調べる時間はプログラムのサイズに関連する。典型的に使用される2進探索では、探索時間は対数的にプログラム内の呼出数に基づいている。もちろん、この探索技術は従来技術で既知のハッシュ関数等を使用して最適化することができる。しかしながら、ハッシュ関数解決策を使用している既知のインプリメンテーションはなく、恐らくそれは余分なリンカーステップが導入されて探索時間は多くの設計者にとって重要と考えられないためである。
【0026】
別の実施例は復帰アドレスに近い例外を呼び出すコード内にアドレスされる位置に格納することにより情報を見つけだすための情報を提供することに基づいている。しかしながら、従来技術では従来の呼出技術を使用して呼出コード内の余分な情報をスキップするのにプログラムスペースやプロセッサオーバーヘッドが必要である。例えば、プログラムスペースを費やす未使用データやアドレスフィールドを有するno operation NOP等のデータフロー上に目に見える影響のない任意の命令、もしくは未使用データを移すmove命令等により、スキップは復帰時に実施することができ、未使用フィールドもしくはデータはプログラムスペースおよびプロセッサオーバーヘッドを費やす例外ハンドラーに対する所望情報を保持する。Chase,Implementation ofException Handling,Part1,The journal of C Lamguage Translation(ISSN1042−5721),Volume5,Number4,June1994(second part in Volume6,Number1,September1994)参照。
【0027】
【発明が解決しようとする課題】
本発明に従って、符号内文脈(イン−コード コンテキスト)データはプロセッサにより認識される特殊呼出命令(コール インストラクション)に内蔵(インコーポレート)される。情報は関数(ファンクション)呼出時にスキップされスタックのアンワインディング時に読み出される。情報に実際にアクセスする正規の実行中は決して必要ではないため、命令フェッチング内に含まれるキャッシュ等のマシンからの外部実行時間従属性を除けば、正規の命令に較べて割増サイクルコスト無しで実行するようにこの特殊呼出命令をインプリメントすることができる。情報は例外処理中しかアクセスされない。
【0028】
スキップされる情報量は好ましくは固定しており、特定スタックレイアウト用情報へのポインター、局所トライブロックに関する情報、およびクリーンアップ情報を含むのに十分な、もしくはポインターおよび圧縮した文脈データを保持するのに十分なデータを保持する。実際の文脈データは奇もしくは負となることのないアドレス等の取り決めを使用して圧縮し、符号内情報がスタックアンワインディングに必要な実際のデータを含むようにすることができる。したがって、スキップした情報は例外をスローさせる命令内のフィールドと見なすことができる。あるいは、スキップは命令の副作用と見なすことができる。
【0029】
したがって、本発明により文脈データを有するサブルーチンへの飛び越しを表す新しいコマンドラベルJSRCを有する新しいマイクロプロセッサその他のデータ処理システムが提供される。新しいコマンドは従来のサブルーチンコマンドへの飛び越しの特徴を全て有し、文脈テーブル、実際の文脈データ、もしくはその組合せへのアドレスを含む長いワードが加えられている。文脈情報は例外がスローされる時に所与の関数コードのどの部分が実行されるかを追跡し続けるのに使用される。関数が実行されている時に任意のポイントで例外が生じると、スタックフレームを捨てる前にどのようなクリーンアップが必要であるか、また例外中にアクティブであるトライブロックが存在するかどうかをシステムは文脈テーブルにより確認することができる。所与の関数に対して、文脈テーブルが構成されそれはこれらのプロセスに使用される関数の有効なレイアウトを記述する。この文脈データはコンパイラにより作り出され、それは前記したように符号内文脈データを含む新しい命令によりトライブロック内に包まれる関数呼出しをコンパイルする。後述するように、この命令はそれを符号内文脈データを含まない標準JSR命令と対比させれば理解することができる。
【0030】
整合のための文脈レコードを探索する必要がないため、より迅速なアンワインディング中にスタックからポップされる各関数に対する文脈テーブルを捜し出せることを除けば、例外マネジャー内のスタックアンワインダーは従来技術と同じようにスタックをアンワインドする。JSRC命令の符号内文脈データは正しい文脈レコードへ直接行くのに使用される。
【0031】
【課題を解決するための手段】
したがって、本発明は命令セット内の命令に応答してプロセスを実行するデータ処理システムとして特徴づけることができる。本システムは命令ポインターもしくはプログラムカウンタに応答して命令セット内の命令をフェッチし一連の命令を与える命令フェッチ論理を含んでいる。命令セットは正規の長さを有する文脈呼出命令(例えば、JSRC)を含み、文脈呼出命令に応答して例外マネジャーの実行に利用される明確な長さを有する符号内文脈データが続く。命令復号論理が命令フェッチ論理に接続されてシーケンス内の現在命令を復号して実行する。命令復号論理は文脈呼出命令を検出する論理を含んでいる。実行資源が命令復号論理に接続されていて復号された命令を実行する。論理が命令フェッチ論理に接続されていて命令復号論理による文脈呼出命令の検出に応答して命令ポインターを更新する。検出に応答して、命令ポインターは符号内文脈データを飛び越してシーケンス内の別の命令へ行き、符号内データが命令の正常な処理に影響を及ぼさないようにされる。
【0032】
本発明のもう1つのアスペクトに従って、本システムは命令フェッチ論理に接続されたプログラム記憶装置が含まれ、その中の命令ポインターに応答してアクセス可能な位置に命令セット内の命令が格納される。符号内文脈データはゼロバイト以上のオフセット量だけ文脈呼出命令に続いて格納され、命令ポインターを更新する論理は明確な長さに等しい長さを有するオフセットでデータのフィールドを飛び越す。
【0033】
前記したように、命令シーケンスはアンワインド情報により特徴づけられる1つ以上の関数、および1つ以上の関数をアンワインドして文脈呼出命令を処理するのに使用されるレイアウト情報を含んでいる。符号内文脈データは少なくともアンワインド情報のサブセット、および/もしくはレイアウト情報のサブセットを含んでいる。別のシステムでは、符号内文脈データは文脈呼出命令に使用する文脈に関する情報を格納するメモリ位置へのポインターを含んでいる。別の実施例では、符号内文脈データはデータの複数バイトを含み、かつ複数バイトに対するフォーマットを指定するフィールドを含んでいる。したがって、例えば、フィールドは複数バイトがイミディエイト文脈データを含むかどうか、また複数バイトが別のメモリ位置内の文脈データへのポインターを含むかどうかを示す。
【0034】
本発明の別のアスペクトにしたがって、命令復号論理がさらに処理を行うことなくプログラムカウンタを自動的にアップグレードできるように、符号内文脈データの明確な長さが予め定められている。別の実施例では、符号内文脈データの明確な長さは命令復号時に決定することができる。
【0035】
本発明はまたアドレス可能なメモリ内の命令セットからの命令を格納することを含む、データ処理システム内の命令を処理する方法としても特徴づけることができる。前記したように、命令セットは文脈呼出命令を含んでいる。本方法はアドレス可能なメモリ内のアドレスを識別する命令ポインターに応答してメモリから一連の命令をフェッチすることを含んでいる。次に、現在命令が文脈呼出命令の検出を含めて復号される。文脈呼出命令の検出に応答して、文脈呼出命令の正規の長さプラス文脈データの明確な長さで命令ポインターが更新され、さもなくば適切であれば任意のオペランドを含む現在命令の長さで命令ポインターが更新される。次に、文脈呼出命令が実行されて正規の呼出命令のように関数を呼び出す。呼び出される関数は通常正規の呼出命令からと同じ手段で復帰する。しかしながら、呼び出される関数が正規には復帰せずに例外がスローされ、スタックアンワインディングがこの呼出ポイントに達するまで処理されないようになる場合には、命令ポインターの関数に応答して決定されるアドレス可能なメモリ内のアドレスにおいて、スタックアンワインダーは符号内文脈データを読み出す。符号内文脈データは次に任意の局所例外ハンドラー、スタックレイアウトおよびクリーンナップ情報を見つけだすのに必要な情報を保持する。
【0036】
したがって、本発明によりプログラムを実行するコンピュータシステムが提供される。本システムはマイクロプロセッサおよび関数引数および局所データを格納するスタックメモリを含むメモリを含んでいる。マイクロプロセッサで実行可能なマイクロプロセッサ内の命令セットが、命令セットにより定義される言語を使用してプログラムの表現を実行するのに必要なデータフローおよびコントロールフローを提供する。1つ以上の命令が文脈呼出命令からなっている。特殊関数呼出命令は関数呼出に対する認知した復帰アドレスに関して固定点における符号内文脈データを運ぶデータフィールド、もしくはその効果への特殊関数呼出命令内の他のアドレッシング副作用に関連している。データフィールドは関数引数のレイアウトに関する情報、1実施例における同期もしくは非同期例外情報の関数アンワインディングに必要な局所データおよび情報を保持するのに十分な大きさである。あるいは、データフィールドは関数引数のレイアウトに関する情報の位置を検索するのに必要な情報、関数のアンワインディングおよび同期もしくは非同期例外情報の処理に必要な局所データおよび情報を保持するのに十分な大きさである。データフィールドは指名された関数呼出命令の実行時間へ特定的に加えることのないようにマイクロプロセッサにより処理される。好ましい実施例は、あたかもここに完全に記載されているかのように本開示の一部としてここに組み入れられている、“Technical Publications,AxisCommunications,Scheelevagen16,S−22370Lund,SWEDEN”もしくは<cup−tpub@axis.com>から入手できる‘AXIS ETRAK:CRIS ProgrammersReference’1994年編集に記載されたAXIS Communications ABのCRISアーキテクチュア内のJSR命令のバリエーションである。
【0037】
【発明の実施の形態】
A.システムハードウェア
本発明は図1のシステム20のようなコンピュータシステム上で実施することができ、それは中央プロセッサ20、主記憶装置24、および例えば入出力コントローラ、キーボード、ポインティングデバイス(例えば、マウス、トラックボール、ペンデバイス等)、ディスプレイデバイス、および大容量記憶装置(例えば、ハードディスク)を含む周辺装置26を含んでいる。所望により、プリンティング装置等の付加入出力装置をシステム20に設けることができる。図からお判りのように、システムのさまざまなコンポーネントがシステムバスもしくは同様のアーキテクチュアを介して通信を行う。
【0038】
B.システムソフトウェア
以下の説明は本発明の現在好ましい実施例に焦点を合わせ、それはMS−DOS(登録商標)、マッキントッシュ(登録商標)、UNIX(登録商標)、NextStep(登録商標)、マイクロソフトウィンドウズ(登録商標)等を含む、コマンドラインもしくはGUIベースの、多様なプラットフォームおよび環境に有利に応用することができる。したがって、下記の典型的な実施例は説明用であって制約的なものではない。
【0039】
図1に示すように、コンピュータシステムの操作を制御するために実行可能プログラム32が提供される。システムメモリ24内およびディスクメモリ上に格納されるプログラムはカーネルすなわちオペレーティングシステム(OS)を含み典型的にはウィンドウズシェルもしくはインターフェイスである。ある埋込システムでは、ユーザインターフェイスは設けられない。アプリケーションプログラムやウィンドウズアプリケーションプログラム等の1つ以上のアプリケーションプログラムをシステムで実行するために“ロードする”ことができる(すなわち、記憶装置からメモリへ転送)。プログラム32はシステムおよびアプリケーションプログラムを開発するための本発明の開発システム150も含んでいる。図からお判りのように、開発システム150はOSを介して直接インターフェイスするコンポーネントだけでなく、ウィンドウズシェルを介してシステムとインターフェイスするコンポーネントを含んでいる。
【0040】
本例における開発システム150はカリフォルニア州、スコッツバレイのボーランドインターナショナル社から入手できるBorland Registered TMC++(登録商標)を含んでいる。一方、アプリケーションソフトウェアはワードプロセッシング、データベース、スプレッドシート、テキストエディター、コントロールアプリケーション、ネットワークアプライアンスドライバソフトウェア、その他のユーザおよび埋込アプリケーションを含む多様なアプリケーションソフトウェアの中の任意の1つとすることができる。
【0041】
CPU22はサポート論理149を含み、本発明に従って例外を処理する特殊JSRC命令をサポートするコンポーネントを含む開発システム150を含んで入る。
【0042】
D.開発システム
図2に詳細に示すように、本発明の開発システム150はコンパイラー153、およびリンカー180を含んでいる。インターフェイスを介して、デベロッパーユーザはコンパイラー153にソースモジュール161を供給する。インターフェイスはコマンドライン駆動であってIntegrated Development Environment(IDE)インターフェイスを含み、前者はコマンドラインパラメータを介してユーザコマンドを受け入れ、後者はそのメニューイング同値(メニュー用イクイバレント値)を提供する。ソースコードリスティング161からおよびヘッダーズ/インクルーズファイル151から、コンパイラー153は“コンパイルする”すなわちオブジェクトモジュール163を発生する。コンパイラー153はコード内の適切な位置において特殊JSRC命令を挿入し、関連する文脈データを計算する。文脈データのフォーマットに応じて、文脈データの符号内部分が方式化されJSRC命令自体に続く所定長を有するフィールド内のオブジェクトモジュール内に配置される。文脈データの平衡(バランス)は実行されるプログラムに関連する他の文脈データ内に配置され、文脈データの平衡が含まれるテーブル内の位置への符号内文脈データ内にポインターが含まれる。別のシステムでは、所与の呼出しに対する文脈データを圧縮して符号内文脈データフィールド内に完全に含めることができる。次に、リンカー180はオブジェクトモジュール163をライブラリ171と“リンク”すなわち結合させて実行可能なプログラム165(図1のブロック32に対応する)を発生し、それは目的プロセッサ(例えば、図1のプロセッサ22)により実行することができる。標準ライブラリ171は、グラフィックス、I/Oルーチン、スタートアップコード、等の予めコンパイルされた標準ルーチンを含んでいる。本発明のJSRC技術に従ってプログラム165内の実行時エラーを処理するためにデバッガー181が設けられている。ボーランドインターナショナル社から直接入手可能な、Borland Regisreted TM C++により従来技術の代表的な開発システム150の一般的動作の説明を行う。
【0043】
デバッガー181は実行時エラーおよび/もしくはプログラム165やライブラリ171内からスローされる例外をキャッチするために設けることができる。デバッガーはライブラリ171から来るかあるいはコンパイラー153により内部発生コード165として発行することができる例外処理モジュールのアクションに介入する。例外がスローされる時にコンパイラー153により発行されるコードから呼び出される、例外処理モジュール(例外マネジャー)はスタックのアンワインディング、ローカルオブジェクトのクリーンナップ、例外ハンドラーのロケーティングおよび実行を管理する。例外処理モジュールは実行可能コード165の一部である。例外処理モジュールは本発明のJSRC技術に従った文脈データを使用する。
【0044】
デバッガーモジュール181だけでなく実行可能プログラム165内の例外ハンドラーには例外のスローイングおよびキャッチングに応答して符号内文脈データへアクセスする資源が設けられている。後述するように、スローされた例外に対する符号内文脈データの位置はマイクロプロセッサのプログラムカウンタ内の値の関数により決定することができる。符号内文脈データがJSRC命令の終りおよび常時JSRC命令内にあるオペランドからゼロバイトだけオフセットされ、かつ例えば4バイトの所定長を有する本実施例では、符号内文脈データの位置は単にプログラムカウンタマイナス4バイトである。プログラムカウンタの制御の説明については後述する。
【0045】
従来技術における例外処理ロケーティング問題に関する詳細な背景については米国特許第5,628,016号、その他を参照されたい。
【0046】
アセンブリコードおよび2進レベルにおける標準JSRC命令と比較した場合の、本発明の符号内文脈データ命令JSRCを有するサブルーチンへの飛び越しのインプリメンテーションを図3に示す。
【0047】
第1行301には、オペランドとしてラベル“A function”を伴うJSR命令のアセンブリコードが明示されている。オペランド“A function”は16進の0x135ef382の値で表される。第2行は、最下位バイト(82)が最初に、実行可能ファイル内に記憶される2進値を示す。第3行は本発明に従ったJSRC命令のレイアウトを示し、パラメータとして関数“A function”のアドレスを、かつ文脈テーブル“This context table”のアドレスとして符号内文脈を伴っている。この命令に対する2進値を303行に示す。16進のこの文脈テーブルのアドレスは9x5577aaccで表される。
【0048】
命令の別の実施例はJSRおよびJSRC命令内の引数としてパラメータではなくレジスタへの参照を伴っている。したがって、305行には引数としてレジスタアドレスR5を伴う標準JSR命令が示されている。JSR命令に対するこの実施例において、レジスタR5への参照は命令内の最下位バイトにより運ばれる。その2進表現を306行に示す。引数としてレジスタアドレスR5を伴う本発明に従ったJSRC命令を307行に示す。2進表現を308行に示す。
【0049】
本例において、JSRC命令の表現16進表現は0xbd3fでありJSRC命令の表現16進表現は0x3d3fである。
【0050】
圧縮された文脈データを伴う実施例では、下記の例に従ってフィールドを決定することができる。ここで、7個の汎用レジスタr0からr6があるものとする。この呼出ポイントに必要な文脈情報はスタックレイアウト、トライブロック文脈、消去を必要とするローカルオブジェクト、および例外ハンドラーaka.キャッチブロックを含むものとする。
【0051】
一般的なケースでは消去関数(destructors)を呼び出す必要のあるオブジェクトは無く、この呼出ポイントに対する“オープン”トライ−ブロックやキャッチ−ブロックも無く、圧縮されたフォーマットはこれらのリストが空であることを示唆するものとする。
【0052】
また、この文脈のベースとしてスタックポインターが使用されるものとする。
これらの31ビットがまさにスタックレイアウトを符号化しなければならず、好ましい実施例においてそれは、下記のものである。
・呼ぶ側(caller)の復帰アドレスへのオフセット。
・どのレジスタが保存されるか。
・局所変数に割り当てられるスタック量。
【0053】
正規のケースではスタックフレームは16kバイトよりも大きくなく、呼ぶ側の復帰アドレスへのオフセットに対して14ビットをとる。局所変数も16kバイトまで、すなわちさらに14ビット、をとることができる。保存されるレジスタ数はほとんどの場合7よりも少なく(r0かに上へ連続してr6で止まる場合が多い)、それに対しては3ビットで済む。
ビット#: 意味
0 文脈は圧縮形式=1,テーブルへのポインター=0。
0ビットが1であれば、
1..14 PC(復帰アドレス)を保存した呼ぶ側のオフセット。
15..28 バイトでカウントした局所変数の量(スタックポインターに必要な調整)
29..31 保存したレジスタ上の符号化情報:無し、r0,r0..r1,...,r0..r6
【0054】
第2のフィールドは第1および第3のフィールドから演繹することができ、そのためここでさらに情報を適合することができ、恐らくは前に想定した空リストからのものである。例えば、単純化されたテーブルへのコード内のこの位置からのオフセットとして恐らく15ビットを使用することができる。
【0055】
この圧縮フォーマットは大概の呼出文脈についてこの情報を有するいかなるテーブルも発行する必要がないことを意味し、たくさんのメモリを省くことができる。
【0056】
したがって、特定のインスタンスについて符号内文脈データが適切でなければ、コンパイラーはコンパイルされるオブジェクトモジュール内の適切な位置にJSRコードを挿入する。JSRC符号内文脈データが適切であるインスタンスについては、コンパイラーは例示する形式でJSRC命令を挿入する。
【0057】
命令の実行において、この技術を使用するプロセッサに関連するプログラムカウンタおよび命令フェッチ論理はJSRC命令の検出に応答してプログラムカウンタ、もしくは正規の処理において読み出される必要のない符号内文脈データ周りの他の同等の命令ポインターを増分する。本発明に従ってJSRC命令を実行するように構成されたマイクロプロセッサの構造、およびJSRC命令の文脈内のプログラムカウンタを増分する論理を図4および図5に示す。図4は本発明に従って実現されるプロセッサすなわちCPUの略図である。それは複数の関数ユニット400を含んでいる。関数ユニット400は算術および論理関数の実行ユニット、本発明のJSRC命令を検出して復号する論理を含む命令復号論理、プログラムカウンタ更新論理(PC更新)、およびプログラムカウンタと他の命令の実行結果に応答してプロセッサが実行する一連の命令を発生するのに使用される命令フェッチ論理含んでいる。したがって、命令フェッチ論理は命令キャッシュ、分岐命令等の管理を行う。
【0058】
関数ユニット400はバスインターフェイスを介してライン401によりシステムバスに接続されている。ライン401は入力データを運び出力データを供給する1つ以上のバスを構成する。また、命令記憶装置からの命令およびデータと命令を検索するアドレスがバスインターフェイスを介して供給される。プロセッサ内に、一般的にレジスタファイルと呼ばれる典型的に複数のジェネラルレジスタが設けられている。典型的に、それはライン403,404を介して関数ユニットへオペランドを供給し、格納すべき結果をライン405を介して関数ユニットから受信する3ポートメモリユニットである。
【0059】
図4では、プログラムカウンタ406はジェネラルレジスタファイル402から独立したレジスタとして図示されている。もちろん、さまざまな実施例においてそれはレジスタファイルの一部と見なすことができる。プログラムカウンタ406はライン407を介して関数ユニット内のプログラムカウンタ更新論理に接続されており、ライン408を介してプログラムカウンタ値を関数ユニットへ送り返し、それは命令フェッチ論理および他の関数ユニットにより使用される。
【0060】
本発明に従って、プロセッサの関数ユニットはJSRC命令を認識し、それに応答してプログラムカウンタの更新を制御するようにされている。
【0061】
図4のシステムで使用するプログラムカウンタ更新論理の単純化したバージョンを図5に示す。図3について前記したように、JSRおよびJSRC命令は、コード内のオペランドを運ぶ第1のフォーマットおよび命令の一部としてレジスタ識別子を運ぶ第2のフォーマットを含む、さまざまなアドレッシングモードに対して多様なフォーマットをとる。
【0062】
図5に示すPC更新論理は、本質的に、ライン501からのプログラムカウンタの値PCをJSRC命令が認識されていることを示す信号により制御される第1のセレクタ502の出力、および命令がそれよりも多くのスペースを占めるオペランドを運ぶかどうかを示す信号により制御される第2のセレクタ503の出力を加算する加算器からなっている。したがって、オペランドを運ばない命令の場合には、セレクタ503の出力は命令長、例えば2バイト、である。命令がオペランドを運びかつ復号論理がオペランドを読み出している場合には、セレクタ503の出力はオペランドの長さとなり、それは図3の例では4バイトである。命令がJSRC命令であれば、セレクタ503の出力を符号内文脈データの長さと結合しなければならない。したがって、セレクタ502はJSRC命令が認識されなければゼロバイトであり、JSRC命令が認識されれば所定の文脈長である。これらの3つの値は加算器500により加算され、更新プログラムカウンタ値としてプログラムカウンタへ戻される。JSRC命令の場合のこの更新プログラムカウンタ値は例外マネジャーが符号内文脈データを見つけるのに利用される。
【0063】
図5の実施例では、文脈長は特別なJSRC命令に関連する所定値である。さまざまな実施例において、文脈データの長さはサブルーチン命令への飛び越しの特別なインプリメンテーションもしくはインスタンスの必要性に従って変えることができる。したがって、サブルーチン命令への飛び越しはさまざまな文脈長さに対して2つ以上のインスタンス内で行うことができる。この場合、プログラムカウンタ更新論理はJSRCの特別なインスタンスを認識して適切な文脈長さを加えなければならないことがある。あるいは、JSRC命令はプログラムカウンタに加えられる文脈長さに等しい値をパラメータとして運ぶことができる。この場合、文脈長さは別の状況ではプロセッサの関数ユニットにより供給される汎用レジスタから検索することができる。
【0064】
本発明に従ってJSRおよびJSRC命令を実行するプロセスを説明するのに図6を利用する。第1行において、JSR命令を説明する。プロセッサは命令を実行する時は、最初に命令を読み出し、命令を復号しプログラムカウンタをサイクル1からサイクルN1までの命令に続く位置へ更新する。サイクルN1からサイクルN2までこの命令を伴うオペランドがあれば読み出される。プログラムカウンタはオペランドの後の位置へ更新される。サイクルN2からサイクルN3までにおいて、プログラムカウンタはサブルーチンに対する復帰アドレスの位置に格納され、スタックポインター等の関連する任意のエンティティはJSR命令に対する標準実行プロセスに従って更新される。サイクルN3からサイクルN4までにおいて、呼出しの目的において次の命令が読み出され、サブルーチンが実行される。
【0065】
JSRC命令に従って、サイクル1からサイクルN1までにおいて、命令が読み出されて復号される。プログラムカウンタは命令の後の位置へ更新される。サイクルN1からサイクルN2までにおいて、オペランドが読み出されプログラムカウンタはオペランドの位置プラス本実施例では固定サイズである符号内文脈データの長さの位置へ更新される。サイクルN2からサイクルN3までにおいて、プログラムカウンタは復帰アドレスの位置に格納され関連する任意のエンティティが更新される。サイクルN3からサイクルN4までにおいて、呼出しのアドレスにおいて次の命令が読み出されサブルーチンが実行される。
【0066】
しかしながら、例外マネジャーはプログラムカウンタ値の関数を使用して符号内文脈データを読み出してデータを見つけ出す必要がある。特に、データの始めはプログラムカウンタの値プラス符号語の長さよりも小さいゼロのオフセットに等しい関数により決定される。このようにして、符号内文脈データは呼出関数と自動的に関連づけられる。また、符号内文脈データは正規の処理に干渉したり正規の実行に割増サイクルを要することがない。
【0067】
したがって、好ましい実施例では、文脈もしくは文脈へのポインターは4よりも小さい復帰アドレスのオフセットに配置される。復帰アドレスが見つかると、例外マネジャーは探索テーブルや整合値を必要とせずに符号内文脈データを見つけ出す。
【0068】
本実施例では、符号内文脈データ内の情報は4バイトすなわち32ビットである。32ビットは文脈もしくは文脈ポインター、もしくはその組合せである。好ましい実施例では、データに対する32ビットの好ましい制限(alignment)がある。この仮定を使用して、32ビットの残りがポインターであるかある情報が固定された圧縮文脈データであるかを最下位ビットにおいて符号化することができる。したがって、本発明のJSRC符号化文脈データを利用できる例外マネジャーおよびスタックウォーカ関数に対する擬似符号は下記のようになる。
Figure 0004398538
Figure 0004398538
【0069】
Figure 0004398538
【0070】
[上記の擬似コードは下記の訳文であることが、念のために注意される。]
【0071】
【表1】
Figure 0004398538
【0072】
【表2】
Figure 0004398538
【0073】
C++言語に対する本発明の好ましい実施例におけるコンパイラーは例外テーブルを発生する責任がある。本発明に従って、コンパイラーは例外テーブルの一部もしくは例外テーブルへのポインターをJSRC命令に関連する符号内文脈データとして提供するように修正される。
【0074】
本発明のJSRC命令がC++言語に従って利用されるプログラムの擬似コードの例を下記に示す。
【0075】
【表3】
Figure 0004398538
【0076】
【表4】
Figure 0004398538
【0077】
【表5】
Figure 0004398538
【0078】
JSRC命令を使用する抽出コードの1例がある。catchall()関数が他のどこかから呼び出され、本例および図7の目的に対して呼出チェーンの頂部にある。
【0079】
JSRC命令が利用されるプログラム内の最初のインスタンスは、例外文脈情報が利用される最初の呼出ポイント(ライン24)である。この情報には、本例では、復帰アドレスをどのように見つけるかを含めて、foo 1をどのように消去するか、“middleman()”からスタックフレーム(レジスタ等)をどのように回復するかが含まれる。ライン25については、その宣言内のノースロー“throw()”属性からお判りのように、関数wont throwはいかなる例外もスローしないため、文脈情報は不要である。次の呼出ポイント(ライン26)において、文脈情報が格納される。このポイントにおいて、文脈情報はfoo 2をどのように消去するか、foo 1をどのように消去するか、“middleman()”からスタックフレームをどのようにアンワインドするかのために必要であり、復帰アドレスをどのように見つけるかを含んでいる。次の呼出ポイントはライン33における標準関数“strncpy()”へであるが、例外をスローすることがないため(コンパイラーもしくはここには含まれないそのヘッダーファイル内の宣言から知られている)、文脈情報は不要であり正規のJSR呼出命令が使用される。その後の呼出ポイントはライン34における関数f()である。この呼出ポイントに対する文脈情報には、indirectに対してどのように復帰アドレスを見つけるかを含めて、“indirect()”からどのようにスタックフレームを回復するかが含まれている。次に、ライン40における“middleman()”呼出しに対して例外文脈情報が利用される。この情報はスローすべきクラス、スローしたオブジェクトをどこへコピーすべきかという状態およびハンドラーの位置、復帰アドレスをどのように見つけるかを含めて“doit()”関数からどのようにスタックフレームを回復すべきかという状態をキャツチする。例外文脈情報が格納される次の呼出ポイントはcatchall()内のライン52における“doit()”である。このポイントにおいて、文脈情報は何でもキャツチすることを示し、ハンドラーの位置および、復帰アドレスをどのように見つけるかを含めて、スタックフレームをどのように回復するかの状態を識別する。本例では、ライン63においてスローされる例外がある。このポイントにおいて、スローン(thrown)オブジェクトが生成される。ハンドラー探索およびスタックアンワインディングが開始される。このコードは他の例外情報を含まないため、スタックがアンワインドされて関連する例外情報が調べられる。
【0080】
前記したコード例に従ったスタックの成長を図7に示す。本例では、プロセスは“catchall”関数への呼出しにより開始される。スタックはライン700における呼出し側の復帰アドレスにより成長し、ライン701において“catchall”が打ちのめすレジスタを保存する。“catchall”ルーチンは“doit”関数を呼び出す。スタックはライン702において復帰アドレスを“catchall”内へ格納することにより成長し、ライン703において“doit”により打ちのめされるレジスタを保存し、例外がスローされる時に記入されるライン704におけるオブジェクト“what is thrown”用の記憶領域を確保し、整合するトライブロックがここで見つけだされる。“doit”関数はmiddleman関数を呼び出す。このポイントにおいてスタックは“doit”(ライン705)内への復帰アドレスにより成長し、ライン706において“middleman”が打ちのめすレジスタを保存し、ライン707および708内にオブジェクトfoo 1およびfoo 2用の記憶領域を確保する。“middleman”関数は“indirect”関数を呼び出す。それが生じると、スタックはライン709における“middleman”、ライン710において“indirect”が打ちのめすレジスタ、およびライン711における局所アレイ“s”用記憶領域内へ復帰アドレスを格納することにより成長する。関数“maybe throw”も呼び出される。このポイントにおいて、“indirect”内への復帰アドレスはライン712において格納され、スローポイントにおいて既知の“maybe throw”が打ちのめすレジスタはライン713において格納される。maybe throwにおいて、例外をスローする条件が満たされると、“To be thrown”タイプのオブジェクトがスローされる。スタックアンワインディングおよび例外ハンドラー探索は保存した復帰アドレスに関する文脈情報を使用する。スローイング関数のイミディエイト文脈、すなわち、保存したレジスタおよび呼出し側の復帰アドレスのオフセットはコンピレーション時に知られており、“スロー”において直接使用することができる。
【0081】
このスタックは図8に示すような例外マネジャーを使用してアンワインドしなければならない。ブロック800に示すプログラム開始において、パラメータExceptionsInProgressはゼロであり例外スタックは空である。ExceptionsInProgressを使用して、カウンタは未処理例外のトラッキングを簡単にする。プロセス内でキャッチされない任意の例外によりカウンタは非ゼロへ戻されるようになる。例外スタックデータ構造が入れ子型例外を処理するのに使用される。すなわち、スタックアンワインディングを行っている時に消去関数呼出中に例外がスローされることがあるが、消去関数呼出しの内側が留意される。例外スタックによりこのタイプの処理が可能とされる。
【0082】
ブロック801に示すように例外がスローされると、一時的ObjectToThrowが生成され例外スタック上へ押しつけられる。スローされたオブジェクト用記憶領域はインプリメンテーションに依存する。しかしながら、好ましくは新しいオブジェクトがそこから割り当てられるヒープとは独立した、ヒープを使用しなければならない。一時的オブジェクトの消去は、恐らくは常時偽であるが一時的オブジェクトを生成する時だけ真である状態変数(TempInCreation)を加えて、例外から守らなければならない。次に、アルゴリズムが進行して関数文脈をスローもしくはリスローポイントの現在長位置に等しく設定する。累積文脈は回復するレジスタが無いに等しく設定され、進行変数内の例外は増分される(ブロック802)。次に、トライブロック文脈が関数文脈のトライブロック文脈に等しく設定される(ブロック803)。図7の例では、それは“スロー”が実行される関数の文脈である;ライン713周りの“maybe throw()”。
【0083】
トライブロック文脈のオブジェクトリスト内の各対に対して、ブロック804に示すように、このようなオブジェクトに対する消去関数が呼び出される(ブロック805)。これらのオペレーションが消去関数もしくはコピー構成子を呼び出す場合には、これらの呼出しはいかなる例外も通さないことを確かめなければならない。それは“try{〔call〕}catch(...){terminate();}”ブロックの効果内に呼出しを包んで達成される。
【0084】
消去関数が呼び出された後で、スローするオブジェクトに整合するハンドラーに対するトライブロック文脈がハンドラーリストで探索される(ブロック806)。ブロック807において、ハンドラーが見つかるかどうか判断される。フロー図から、関数例外宣言は表明されないように見える。しかしながら、関数の最外部となる暗黙のトライブロックを加えるコンパイラーによりインプリメントされるものと思われ、それが任意のバイオレーションをキャッチして、“unexpected()”,“terminate()”への呼出しもしくは“throw std::bad exception”の効果へ変換する。
【0085】
ブロック807においてハンドラーが見つからない場合には、ブロック808においてトライブロック文脈が関数文脈の最外部であるかどうかがアルゴリズムにより確認される。最外部であれば、アルゴリズムはブロック809へ移行する。このポイントにおいて、関数文脈は累積文脈へ加えられる。このオペレーションは回復レジスタの効果を集めスタックポインターの調整を累積することである。それは即座に実施する必要はないが、効果は思い出してハンドラーへ飛び越す前に実施しなければならない。また、このポイントにおいて、関数文脈は現在の関数文脈の関数として外部関数文脈に等しく設定される。それは本発明を使用する位置である。文脈が符号語内で符号化されていても文脈情報を有するテーブルへのポインター内で符号化されていても、“外部関数文脈”は文脈呼出関数内の符号語を使用して見つけられる。“OuterFunctionContext()”関数は図7に示すプログラムカウンタf(PC)の関数と同じである。したがって、図7の矢符720はスタックのアンワインディングにおいて遭遇する最初の呼出ポイントに対するプログラムカウンタの関数として関数文脈を見つけだす(例えばJSRC命令を使用して)技術を示す。
【0086】
ブロック8009の後で、アルゴリズムはブロック803へループしてプロセスを繰り返す。このようにして、プロセスは図7に示す矢符720から矢符721、矢符722、矢符723、矢符724、矢符725、矢符726、矢符727、矢符728の経路に従って、スローしたオブジェクトのタイプと一致する“キャッチ”を有するトライブロックが見つかるまでスタックをアンワインドする。
【0087】
ブロック8008において、トライブロック文脈が最外部関数文脈でなければ、トライブロック文脈は外部トライブロック(トライブロック文脈)に等しく設定され、アルゴリズムはブロック804へループバックして新しい文脈情報を走査する。このオペレーションは、リンクされたリストあるいはテーブルあるいは他のインプリメンテーションであっても、文脈情報内のオブジェクトリストおよびハンドルリストの単純な走査にすぎない(ブロック810)。
【0088】
ブロック807においてハンドラーが見つかると、アルゴリズムはブロック811へ分岐する。ブロック811において、ハンドラー記述トリプル内に指定されたオブジェクトがコピーされる。ExceptionInProgressカウンタは1だけ減分され、スタックポインターおよび他のレジスタが累積文脈を使用して回復され、プログラムはハンドラーへ飛び越す。次に、ブロック812に示すように、ハンドラーがトライブロックをエグジットすると、例外スタックがポップされスローする現在のオブジェクトに対する消去関数が呼び出される。スローするオブジェクトの記憶領域がデアロケートされ、アルゴリズムは正規の実行へ戻る。ブロック811の後で例外がスローされると、プロセスは813においてリスローブロックへループバックする。リスローブロックの最初のステップは、ブロック814において例外スタックが空であるかどうかを確認することである。空であれば、プロセスはブロック815で終端する。例外スタックが空でなければ、例外オブジェクトは例外スタックの頂部に設定され(ブロック816)、プロセスはブロック802へループする。
【0089】
本発明の好ましい実施例の前記説明は例示および説明の目的でなされたものである。それは完璧なものではなく、本発明を開示した厳密な形式に限定するものでもない。明らかに、当業者ならばさまざまな修正および変更が自明であろう。本発明の範囲は特許請求の範囲およびそれと同等のものにより明記されるものとする。
【0090】
著作権通告
本発明文献の一部に著作権保護の対象となる材料が含まれている。著作権所有者は特許局の特許ファイルや記録に記載された特許文献や特許開示を誰でもファクシミリで複写することに異議はないが、それ以外はあらゆる著作権を保有するものとする。
【図面の簡単な説明】
【図1】本発明の文脈呼出命令を実行するプロセッサを含むコンピュータシステムの単純化したブロック図。
【図2】図1のコンピュータシステムもしくは本発明のJSRC命令用資源を含むソフトウェアをコンパイルする他のコンピュータシステムにより実行される開発システム用ソフトウェアアーキテクチュアを示す図。
【図3】正規の呼出命令と比較した特定の実施例に関するJSRC命令のレイアウトを示す図。
【図4】本発明のJSRC命令を処理する資源を含む本発明に従ったマイクロプロセッサの単純化したブロック図。
【図5】本発明に従ったプログラムカウンタ更新論理の単純化したブロック図。
【図6】正規の呼出命令と比較した本発明に従ったマイクロプロセッサ内のJSRC命令の処理を説明する図。
【図7】本発明の説明に使用するスタック成長および文脈データを示す図。
【図8】本発明に従った例外マネジャーの1実施例のフロー図。
【符号の説明】
20 システム
22 中央プロセッサ
24 主記憶装置
26 周辺装置
アワ システムバス
32 実行プログラム
149 論理
150 開発システム
151 headers/includesファイル
153 コンパイラー
161 ソースコードリスティング
163,183 オブジェクトモジュール
165 実行可能プログラム
171 標準ライブラリ
180 リンカー
181 デバッガー
400 関数ユニット
401,403,404,405,407,408,501 ライン
402 ジェネラルレジスタ
406 プログラムカウンタ
500 加算器
502,503 セレクタ

Claims (5)

  1. プログラムコード内の命令に応答してプロセスを実行するデータ処理システムであって、該データ処理システムは、
    命令ポインターに応答してプログラムコード内の命令をフェッチし一連の命令を与える命令フェッチ論理であって、前記命令はジャンプアドレスを有する第1のジャンプ命令と、対応する呼出ポイントに関連したスタックの部分の文脈情報と共に、ジャンプアドレスを有する第2のジャンプ命令を更に備える命令フェッチ論理と、
    命令フェッチ論理に接続され、第1および第2のジャンプ命令を検出しシーケンス内の現在の命令を復号する命令復号論理と、
    命令復号論理に接続され、復号された命令を実行する実行資源と、
    命令フェッチ論理および命令復号論理に接続され、命令ポインターを更新する論理であって、前記命令復号論理によって第2のジャンプ命令が検出された場合、第2のジャンプ命令の長さと第2のジャンプ命令の文脈情報の長さを命令ポインターに加えて命令ポインターを更新する論理と、および、
    前記第2のジャンプ命令の文脈情報をもちいて、呼び出された関数により発生させられた例外を管理し、スタックをアンワインドする例外マネジャー、
    を含むシステム。
  2. 請求項1に記載のシステムにおいて、前記第2のジャンプ命令は可変長の文脈情報を含み、かつ前記命令ポインターを更新する論理は前記文脈情報と同じ長さを持つデータ領域をジャンプするシステム。
  3. データ処理システムのプログラムコードにおける命令処理方法であって、該処理方法は、
    命令をアドレス可能なメモリのプログラムコード内に格納するステップであって、命令は、ジャンプアドレスを有する第1のジャンプ命令と、対応する呼出ポイントに関連したスタックの部分の文脈情報と共に、ジャンプアドレスを有する第2のジャンプ命令を備え、
    アドレス可能なメモリ内のアドレスを識別する命令ポインターに応答してメモリから一連の命令をフェッチするステップと、
    第1および第2のジャンプ命令の検出を含む、シーケンス内の現在の命令を復号するステップと、
    現在の命令の長さを命令ポインターに加え、もし前記現在の命令が第2のジャンプ命令であると前記現在の命令を復号するステップが検出したならば更に前記第2のジャンプ命令の文脈情報の長さを前記命令ポインターに加えるステップと、
    例外条件が満たされたら例外マネジャーを呼び出すステップと、
    例外マネジャーの呼び出しに応答して、命令ポインターの値を引数として使用した関数により決定されるアドレス可能なメモリ内のアドレスにおける文脈情報を読み出し、スタックをアンワインドするステップと、
    を含む方法。
  4. 請求項3に記載の方法において、第2のジャンプ命令の文脈情報は、対応する第2のジャンプ命令に関連した文脈データを格納するためメモリ位置のポインターを有する、方法。
  5. 請求項3に記載の方法において、前記第2のジャンプ命令の文脈情報は、複数のバイトのフォーマットを特定するフィールドを含む複数のデータバイトを有する、方法。
JP13332599A 1998-09-29 1999-05-13 命令セット内の命令に応答してプロセスを実行するデータ処理システムおよびその命令処理方法 Expired - Lifetime JP4398538B2 (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US09/163,123 US6289446B1 (en) 1998-09-29 1998-09-29 Exception handling utilizing call instruction with context information
US163123 1998-09-29

Publications (2)

Publication Number Publication Date
JP2000112772A JP2000112772A (ja) 2000-04-21
JP4398538B2 true JP4398538B2 (ja) 2010-01-13

Family

ID=22588588

Family Applications (1)

Application Number Title Priority Date Filing Date
JP13332599A Expired - Lifetime JP4398538B2 (ja) 1998-09-29 1999-05-13 命令セット内の命令に応答してプロセスを実行するデータ処理システムおよびその命令処理方法

Country Status (3)

Country Link
US (1) US6289446B1 (ja)
JP (1) JP4398538B2 (ja)
SE (1) SE520072C2 (ja)

Families Citing this family (48)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6952827B1 (en) * 1998-11-13 2005-10-04 Cray Inc. User program and operating system interface in a multithreaded environment
US7055055B1 (en) 1999-04-23 2006-05-30 Symantec Corporation Write cache flushing method for reducing data corruption
AU6081200A (en) * 1999-07-09 2001-01-30 Eric D. Schneider Optimized disk storage defragmentation with swapping capabilities
US7051055B1 (en) * 1999-07-09 2006-05-23 Symantec Corporation Optimized disk storage defragmentation with swapping capabilities
US7028298B1 (en) * 1999-09-10 2006-04-11 Sun Microsystems, Inc. Apparatus and methods for managing resource usage
US6442707B1 (en) * 1999-10-29 2002-08-27 Advanced Micro Devices, Inc. Alternate fault handler
US7080359B2 (en) * 2002-01-16 2006-07-18 International Business Machines Corporation Stack unique signatures for program procedures and methods
US6910124B1 (en) * 2000-05-02 2005-06-21 International Business Machines Corporation Apparatus and method for recovering a link stack from mis-speculation
CA2447451C (en) * 2000-05-12 2013-02-12 Xtreamlok Pty. Ltd. Information security method and system
US7234139B1 (en) * 2000-11-24 2007-06-19 Catharon Productions, Inc. Computer multi-tasking via virtual threading using an interpreter
US6934939B2 (en) * 2001-02-28 2005-08-23 International Business Machines Corporation Method for unwinding a program call stack
US7512935B1 (en) * 2001-02-28 2009-03-31 Computer Associates Think, Inc. Adding functionality to existing code at exits
US6892379B2 (en) * 2001-05-16 2005-05-10 Sun Microsystems, Inc. Methods and apparatus for use in aiding stack unwinding
US7036045B2 (en) * 2002-03-21 2006-04-25 International Business Machines Corporation Method and system for isolating exception related errors in Java JVM
US7296257B1 (en) * 2002-08-01 2007-11-13 Tymesys Corporation Techniques for exception handling by rewriting dispatch table elements
US7146606B2 (en) * 2003-06-26 2006-12-05 Microsoft Corporation General purpose intermediate representation of software for software development tools
US7707566B2 (en) * 2003-06-26 2010-04-27 Microsoft Corporation Software development infrastructure
US7305666B2 (en) * 2003-07-23 2007-12-04 Microsoft Corporation Description language for an extensible compiler and tools infrastructure
US7120898B2 (en) * 2003-06-26 2006-10-10 Microsoft Corporation Intermediate representation for multiple exception handling models
US7559050B2 (en) * 2003-06-30 2009-07-07 Microsoft Corporation Generating software development tools via target architecture specification
US7685581B2 (en) * 2003-06-27 2010-03-23 Microsoft Corporation Type system for representing and checking consistency of heterogeneous program components during the process of compilation
US7086041B2 (en) * 2003-06-27 2006-08-01 Microsoft Corporation Extensible type system for representing and checking consistency of program components during the process of compilation
US7788652B2 (en) * 2003-06-27 2010-08-31 Microsoft Corporation Representing type information in a compiler and programming tools framework
US7496896B2 (en) * 2003-07-17 2009-02-24 Computer Associates Think, Inc. Accessing return values and exceptions
US7360070B1 (en) * 2003-08-13 2008-04-15 Apple Inc. Specialized processing upon an occurrence of an exceptional situation during the course of a computation
US20050144408A1 (en) * 2003-12-24 2005-06-30 Kenji Ejima Memory protection unit, memory protection method, and computer-readable record medium in which memory protection program is recorded
US7496897B1 (en) 2004-03-17 2009-02-24 Timesys Corporation Multiple code sets for multiple execution contexts
US7480902B2 (en) * 2004-07-08 2009-01-20 Intel Corporation Unwind information for optimized programs
US7577961B1 (en) * 2004-08-25 2009-08-18 Sun Microsystems, Inc. Methods and apparatus for exception-based programming
US7457671B2 (en) * 2004-09-30 2008-11-25 Rockwell Automation Technologies, Inc. Systems and methods that facilitate management of add-on instruction generation, selection, and/or monitoring during execution
US7949665B1 (en) 2004-11-19 2011-05-24 Symantec Corporation Rapidly traversing disc volumes during file content examination
US8214461B1 (en) * 2004-11-23 2012-07-03 Hewlett-Packard Development Company, L.P. Method of processing request by server computer system
US7434132B2 (en) * 2005-01-18 2008-10-07 Sap Ag Method and system of configuring a software program
US20060187317A1 (en) * 2005-02-24 2006-08-24 Memory Matrix, Inc. Systems and methods for processing images with positional data
USRE47628E1 (en) 2005-04-12 2019-10-01 Kroll Information Assurance, Llc System for identifying the presence of peer-to-peer network software applications
WO2007048988A1 (en) * 2005-10-26 2007-05-03 Arm Limited A data processing apparatus and method for handling procedure call instructions
US7904881B2 (en) * 2006-07-26 2011-03-08 Intel Corporation Using a virtual stack for fast and composable stack cutting
US8024710B2 (en) * 2007-04-27 2011-09-20 Microsoft Corporation Unwinding unwindable code
US8839420B2 (en) 2009-05-01 2014-09-16 Adobe Systems Incorporated Validation of function call parameters
US8732830B2 (en) * 2009-05-28 2014-05-20 Adobe Systems Incorporated Scripting engine externalized function execution control
KR102028663B1 (ko) 2012-07-24 2019-10-04 삼성전자주식회사 에러 검출 방법 및 장치
US20140149177A1 (en) * 2012-11-23 2014-05-29 Ari M. Frank Responding to uncertainty of a user regarding an experience by presenting a prior experience
US9582312B1 (en) * 2015-02-04 2017-02-28 Amazon Technologies, Inc. Execution context trace for asynchronous tasks
US9916141B2 (en) * 2015-10-15 2018-03-13 International Business Machines Corporation Modifying execution flow in save-to-return code scenarios
GB2549774B (en) * 2016-04-28 2019-04-10 Imagination Tech Ltd Method for handling exceptions in exception-driven system
FR3051934A1 (fr) * 2016-05-24 2017-12-01 Orange Procede d'identification d'au moins une fonction d'un noyau d'un systeme d'exploitation
DE102018128045A1 (de) * 2018-11-09 2020-05-14 Infineon Technologies Ag Behandlung von Ausnahmen in einem Programm
CN114968370A (zh) * 2021-02-25 2022-08-30 华为技术有限公司 一种异常处理方法及相关装置

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5628016A (en) * 1994-06-15 1997-05-06 Borland International, Inc. Systems and methods and implementing exception handling using exception registration records stored in stack memory
KR100513138B1 (ko) * 1996-01-24 2005-09-07 선 마이크로시스템즈 인코퍼레이티드 네트워크 또는 로컬 메모리로부터 수신된 명령 세트를실행하는 프로세서 및 컴퓨터 시스템
JP3801643B2 (ja) * 1996-01-24 2006-07-26 サン・マイクロシステムズ・インコーポレイテッド スタックを用いる演算マシンのための命令フォールディング処理
US5996058A (en) * 1996-08-19 1999-11-30 Samsung Electronics Company, Ltd. System and method for handling software interrupts with argument passing
US6003038A (en) * 1997-03-31 1999-12-14 Sun Microsystems, Inc. Object-oriented processor architecture and operating method
US6009515A (en) * 1997-05-30 1999-12-28 Sun Microsystems, Inc. Digital data processing system including efficient arrangement to support branching within trap shadows

Also Published As

Publication number Publication date
SE520072C2 (sv) 2003-05-20
JP2000112772A (ja) 2000-04-21
US6289446B1 (en) 2001-09-11
SE9901096L (sv) 2000-03-30
SE9901096D0 (sv) 1999-03-25

Similar Documents

Publication Publication Date Title
JP4398538B2 (ja) 命令セット内の命令に応答してプロセスを実行するデータ処理システムおよびその命令処理方法
US5628016A (en) Systems and methods and implementing exception handling using exception registration records stored in stack memory
US5675803A (en) Method and apparatus for a fast debugger fix and continue operation
US5907709A (en) Development system with methods for detecting invalid use and management of resources and memory at runtime
US5909580A (en) Development system and methods with direct compiler support for detecting invalid use and management of resources and memory at runtime
EP0706684B1 (en) System for object oriented dynamic linking based upon a catalog of registered function set or class identifiers
US7380242B2 (en) Compiler and software product for compiling intermediate language bytecodes into Java bytecodes
US5339238A (en) Register usage tracking in translating code for different machine architectures by forward and reverse tracing through the program flow graph
US5301325A (en) Use of stack depth to identify architechture and calling standard dependencies in machine code
KR100640314B1 (ko) 혼합된 실행 스택 및 예외처리의 구현방법및 그 장치
EP0902363B1 (en) Method and apparatus for efficient operations on primary type values without static overloading
US9417931B2 (en) Unified metadata for external components
JPH05224931A (ja) 実行時プログラム条件を表現し、信号で通知する方法及びシステム
US20130111446A1 (en) Memory management for closures
JP2010267291A (ja) コンピュータ・システム、コンピュータ読取り可能な記憶媒体および同媒体を動作させる方法、およびコンピュータ・システムを動作させる方法
EP0884678A2 (en) Loader conditionally replacing a code sequence with a functionally-alike code sequence in an executable program intended for execution in different run-time environments
US7007198B2 (en) Method for handling exceptions of applications
JP2001075827A (ja) モジュールごとのベリファイ処理に伴う完全要求駆動型リンク
Probst Dynamic binary translation
US20090320007A1 (en) Local metadata for external components
US6931638B2 (en) Method and apparatus to facilitate sharing optimized instruction code in a multitasking virtual machine
Agner Optimizing software in C++: An optimization guide for Windows, Linux and Mac platforms
JPH05250182A (ja) プログラム条件処理
EP0528019B1 (en) Method and apparatus for computer code processing in a code translator
Buisson et al. Recaml: execution state as the cornerstone of reconfigurations

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20050913

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20080122

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20080422

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20080606

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20080901

A602 Written permission of extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A602

Effective date: 20080904

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20081006

A602 Written permission of extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A602

Effective date: 20081009

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20081106

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20090421

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20090716

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20090811

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20090925

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20091016

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20091023

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20121030

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20131030

Year of fee payment: 4

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

EXPY Cancellation because of completion of term