<except.h > インクルード・ファイルは、ILE C 例外処理で使用される型およびマクロを宣言します。
_INTRPT_Hndlr_Parms_T の定義は、以下のとおりです。
typedef _Packed struct {
unsigned int Block_Size;
_INVFLAGS_T Tgt_Flags;
char reserved[8];
_INVPTR Target;
_INVPTR Source;
_SPCPTR Com_Area;
char Compare_Data[32];
char Msg_Id[7];
char reserved1;
_INTRPT_Mask_T Mask;
unsigned int Msg_Ref_Key;
unsigned short Exception_Id;
unsigned short Compare_Data_Len;
char Signal_Class;
char Priority;
short Severity;
char reserved3[4];
int Msg_Data_Len;
char Mch_Dep_Data[10];
char Tgt_Inv_Type;
_SUSPENDPTR Tgt_Suspend;
char Ex_Data[48];
} _INTRPT_Hndlr_Parms_T;
エレメント
説明
Block_Size
例外ハンドラーに渡されるパラメーター・ブロックのサイズ。
Tgt_Flags
システムが使用するフラグが含まれています。
reserved
8 バイトの予約フィールド。
Target
呼び出しスタック項目の呼び出しポインターのうち、例外ハンドラーを使用可能にしたもの。
Source
呼び出しスタック項目の呼び出しポインターのうち、例外を発生させたもの。
その呼び出しスタック項目がすでに存在しない場合、例外の処理時に制御が再開されると、これが呼び出しスタック項目のポインターになります。
Com_Area
#プラグマの exception_handler で 2 番目のパラメーターとして指定された、通信域変数へのポインター。
通信域が指定されなかった場合、この値は NULL になります。
Compare_Data
比較データ (CPF、MCH など)。4 バイトのメッセージ接頭語のあとに、関連メッセージのメッセージ・データから取得された 28 バイトのメッセージが続いたもので構成されています。
メッセージ・データが 28 よりも大きい場合、これらが最初の 28 バイトに相当します。
MCH メッセージの場合、これらがシステムが戻す例外の関連データ (置換テキスト) の最初の 28 バイトに相当します。
Msg_Id
メッセージ ID (例: CPF123D)。*STATUS メッセージ型は、このフィールドでは更新されません。
reserved1
1 バイトの埋め込み。
Mask
発生した例外 (10 進数データ・エラーなど) の型を識別する、8 バイトの例外マスク。
使用可能な型は、表 20 に記載されています。
Msg_Ref_Key
メッセージを一意的に識別するために使用されるキー。
Exception_Id
例外 ID の 2 進値 (例: 0x123D)。
値を表示するには、変換指定子 %x を使用して、16 進値で情報が保管されるようにします。
Compare_Data_Len
比較データの長さ。
Signal_Class
内部シグナル・クラス。
Priority
ハンドラーの優先度。
Severity
メッセージ重大度。
reserved3
4 バイトの予約フィールド。
Msg_Data_Len
使用可能なメッセージ・データの長さ。
Mch_Dep_Data
マシン依存のデータ。
Tgt_Inv_Type
呼び出しの型。マクロの定義は <mimchobs.h> で行います。
Tgt_Suspend
ターゲットの中断ポインター。
Ex_Data
例外データの最初の 48 バイト。
_CNL_Hndlr_Parms_T の定義は以下のとおりです。
typedef _Packed struct {
unsigned int Block_Size;
_INVFLAGS_T Inv_Flags;
char reserved[8];
_INVPTR Invocation;
_SPCPTR Com_Area;
_CNL_Mask_T Mask;
} _CNL_Hndlr_Parms_T;
エレメント
説明
Block_Size
取り消しハンドラーに渡されるパラメーター・ブロックのサイズ。
Inv_Flags
システムが使用するフラグが含まれています。
reserved
8 バイトの予約フィールド。
Invocation
取り消し中の呼び出しの呼び出しポインター。
Com_Area
取り消しハンドラーが定義したハンドラー通信域のポインター。
Mask
取り消し理由を表す 4 バイトの値。
次の組み込みは <except.h> で定義されます。
組み込み
説明
__EXBDY
__EXBDY 組み込みまたは _EXBDY マクロの目的は、例外依存操作の境界として機能することにあります。
例外依存操作を行うと、例外がシグナル通知される場合があります。
EXBDY を使用すると、コード動作を行う最適化をプログラマーが選択的に抑制できるようになります。
例えば、除算はゼロ除算をシグナル通知する可能性があるため、例外依存操作となります。
EXBDY と除算の両方を含む実行パスは、2 つを同じ順序で実行します。その際、最適化が行われると場合と、行われない場合とがあります。
以下に例を示します。
b = exp1;
c = exp2;
...
_EXBDY();
a = b/c;
__VBDY
__VBDY 組み込みまたは _VBDY マクロの目的は、例外パスで使用される可能性のある変数用に、現在のホームの保管場所が設定されていることを確認することにあります。
これによって、例外ハンドラーの変数の現行値における可視性が確保されます。
VBDY によって、プログラマーが選択的に最適化を抑止するようにできます。一貫した順序で変数更新を実行するための、冗長ストア除去および転送ストア動作などが、これに当たります。
次の例では、VBDY を使って、各コードのブロックが例外をシグナル通知する前に、状態がホーム保管場所になるようにしています。
VBDY は、もっぱら EXBDY と組み合わせて使用されます。これによって、先に状態変数への割り当てを行い、ホームの保管場所を確実に更新し、さらに後に行う例外依存操作がこれらの割り当て以前に移動されないようにします。
state = 1;
_VBDY();
/* Do stuff that may signal an exception. */
state = 2;
_VBDY();
/* More stuff that may signal an exception. */
state = 3;
_VBDY();
組み込みについて詳しくは、「ILE C/C++ for AS/400 MI Library Reference 」を参照してください。
[ ページのトップ | 前ページ | 次ページ | 目次 |
索引 ]