$STACK (ObjectScript)
構文
$STACK
$ST
概要
$STACK には、プロセスのコール・スタックに現在保存されているコンテキスト・フレームの数が格納されます。現在実行しているコンテキストの 0 から始まるコンテキスト・レベル番号として、$STACK を見ることもできます。そのため、InterSystems IRIS ジョブが開始すると、コンテキストがコール・スタックで保存される前は、$STACK の値は 0 です。
DO コマンドでルーチンが他のルーチンを呼び出すたびに、現在実行しているルーチンのコンテキストはコール・スタックに保存され、実行は呼び出されるルーチンの新しく作成されたコンテキストで始まります。呼び出されたルーチンは、順番に他のルーチンを呼び出すことができます。各追加コールは、保存された他のコンテキストをコール・スタックに置きます。
XECUTE コマンドと外部関数参照も、新規の実行コンテキストを作成します。GOTO コマンドは作成しません。
DO コマンド、XECUTE コマンド、外部関数参照が新しいコンテキストを作成するたびに、$STACK の値はインクリメントします。コンテキストが QUIT コマンドで終了するたびに、前のコンテキストはコール・スタックから戻され、$STACK の値はディクリメントします。
この特殊変数は、SET コマンドを使用して変更することはできません。変更を試みると、<SYNTAX> エラーが返されます。
$ESTACK は、$STACK と同じです。ただし、NEW $ESTACK コマンドを発行することで、いつでも 0 (ゼロ) の $ESTACK レベルを作成できる点が異なります。NEW を使用して、$STACK 特殊変数をリセットすることはできません。
エラー処理
エラー発生時、すべてのコンテキスト情報はプロセス・エラー・スタックに即座に格納されます。これにより $STACK の値が変更されます。この場合、エラー・ハンドラによって $ECODE 値がクリアされるまで、$STACK 関数を使用してコンテキスト情報にアクセスできます。つまり、$ECODE 値が NULL でない場合、$STACK 関数は、エラー・スタックに保存されたコンテキストと同じ指定されたコンテキスト・レベルのアクティブなコンテキストではなく、エラー・スタックに保存されたコンテキストの情報を返します。
ターミナル・プロンプトから呼び出す場合のコンテキスト・レベル
プログラムから呼び出されるルーチンは、ターミナル・プロンプトから DO コマンドを使用して呼び出すルーチンとは異なるコンテキスト・レベルで開始します。ターミナル・プロンプトで入力する DO コマンドは、新しいコンテキストを作成します。以下の例では、ルーチンまたはターミナル・プロンプトから呼び出されたルーチン START を示しています。
以下のルーチンを考慮してみましょう。
START
; Display the context level and exit
WRITE !,"Context level in routine START is ",$STACK
QUIT
プログラムから START を実行すると、以下が表示されます。
Context level in routine START is 0
ターミナル・プロンプトで DO ^START を発行して START を実行すると、以下が表示されます。
Context level in routine START is 1
例
以下の例は、$STACK が新しいコンテキストが作成されるときにインクリメントされ、コンテキストが終了するときにディクリメントされる方法を示しています。
サンプル・コードは以下のとおりです。
STA
WRITE !,"Context level in routine STA = ",$STACK
DO A
WRITE !,"Context level after routine A = ",$STACK
QUIT
A
WRITE !,"Context level in routine A = ",$STACK
DO B
WRITE !, "Context level after routine B = ",$STACK
QUIT
B
WRITE !,"Context level in routine B = ",$STACK
XECUTE "WRITE !,""Context level in XECUTE = "",$STACK"
WRITE !,"Context level after XECUTE = ",$STACK
QUIT
このコードを使用したサンプル・セッションは、次のように実行されます。
USER>DO ^STA
Context level in routine STA = 1
Context level in routine A = 2
Context level in routine B = 3
Context level in XECUTE = 4
Context level after XECUTE = 3
Context level after routine B = 2
Context level after routine A = 1