実行環境のアスペクトを記述する文字列を返します。
$STACK() 関数のフォーマット:
$ST[ACK](intexpr[,expr])
整数式 (intexpr) は、関数が情報を提供することになっている、Mの仮想マシンのスタックレベルを(標準によって記述されるような)を識別します。
オプションの第2引数は、次のように返される情報の種類を指定するキーワードとして評価されます。
"MCODE" : 実行されたコード行
"PLACE" : 文字列値から実行されたコードを示す ("@") の時点で、コード行またはシンボル行の上のアドレス
注意 | |
---|---|
ランタイムエラーの場合は、GT.Mは、ライン内の "PLACE"を提供しません(コンパイルエラーの場合とは違って)、しかし、それはラベル、オフセット、ルーチンをレポートします。 |
"ECODE" : 空の文字列、または、この実行レベルで追加されたエラーコードのどちらか
$STACKが1つだけ引数を持つ場合、利用可能なスタックレベルに対応する値は、次のように、レベルがどのように作られたかを示す戻り値を指定します:
もし intexpr がゼロ(0)の場合、この関数は、GT.Mが呼び出された方法に関する情報を返します。
もし intexpr がマイナス1(-1)の場合、この関数は、情報を返すことができる$STACKの最高レベルを返します。もし$ECODE=""の場合、$STACK(-1) は、$STACK ISV(固有の特殊変数 Intrinsic Special Variable)と同じ値を返すことに注意してください。
intexpr が 0 より大きくかつ$STACK(-1)以下の場合、このレベルのプロセス・スタックがどのように作成されたかを示します( "DO"、 "TRIGGER" - トリガによって呼び出されるスタックレベル、 " XECUTE "、または " $$ " - 外部関数)。
$STACK(lvl) は、MUPIP INTRPT によって呼び出されるスタックレベルの "ZINTR"を報告します。
もし intexpr が $STACK(-1)より大きい場合は、関数は空の文字列を返します。
エラー処理中、$STACK() はエラー時にスタックの状態のスナップショットを返します。後続のアクションによってスタック・レベルが追加された場合でも、$STACK() はエラーの時点で同じレベルのスナップショットをレポートし続けます。$STACK() は、コードが$ECODEをクリアした後にのみ最新のスタック情報を報告します。
$STACK() はプログラムのデバッグを支援します。
注意 | |
---|---|
$STACK() は、 ""=$ECODE の場合にZSHOW "S"と同様の情報を返しますが、しかし$ECODEにエラー情報が含まれている場合、$STACK() は、前回のエラー時の情報、通常$ ECODEの最初のエントリを返します。$STACK() が現在の情報を返すためには、通常の制御フローを復元する前にエラーハンドリングコードがSET $ECODE=""を行うようにしてください。 |
例:
/usr/lib/fis-gtm/V5.4-002B_x86/gtm -run ^dstackex dstackex; zprint ^dstackex write !,$STACK xecute "WRITE !,$STACK" do Label write !,$$ELabel write !,$STACK quit Label write !,$STACK do DLabel quit ELabel() quit $STACK DLabel write !,$STACK quit 0 1 1 2 1
エラー処理の例:
GTM>zprint ^debugerr debugerr; set dsm1=$stack(-1) write !,"$stack(-1):",dsm1 for l=dsm1:-1:0 do . write !,l . for i="ecode","place","mcode" write ?5,i,?15,$stack(l,i),! GTM>
上記の例は、エラーを引き起こしたコードパスのトレースを表示するために使用できます。
例:
GTM>zprint ^dstacktst dstacktst(x) ; check $stack() returns with and without clearing $ecode set $etrap="do ^debugerr" label if x>0 set $ecode=",U1," ; if condition else set $ecode=",U2," ; else condition quit GTM>do ^dstacktst(0) $stack(-1):2 2 ecode place debugerr+3^debugerr mcode for l=dsm1:-1:0 do 1 ecode ,U2, place label+2^dstacktst mcode else set $ecode=",U2," ; else condition 0 ecode place +1^GTM$DMOD mcode %GTM-E-SETECODE, Non-empty value assigned to $ECODE (user-defined error trap) GTM>do ^dstacktst(1) $stack(-1):1 1 ecode ,U2, place label+2^dstacktst mcode else set $ecode=",U2," ; else condition 0 ecode place +1^GTM$DMOD mcode %GTM-E-SETECODE, Non-empty value assigned to $ECODE (user-defined error trap) GTM>set $ecode="" GTM>do ^dstacktst(1) $stack(-1):2 2 ecode place debugerr+3^debugerr mcode for l=dsm1:-1:0 do 1 ecode ,U1, place label+1^dstacktst mcode if x>0 set $ecode=",U1," ; if condition 0 ecode place +1^GTM$DMOD mcode %GTM-E-SETECODE, Non-empty value assigned to $ECODE (user-defined error trap) GTM>
次の例は、SET $ECODE=.. で$STACK() が現在の情報を報告する方法を示しています。その間に $ECODE をクリアせずに do ^dstacktst(0) と do ^dostacktst(0) を実行すると、最初のエラー時に凍結された情報(else条件)を表示する方法に注目してください。