プログラミング言語SML#解説 4.0.0版
29 SML#実行時データ管理

29.3 スタックを巻き戻すジャンプの影響

SML#およびC/C++は,通常のコール/リターンだけでなく, 関数の呼び出しスタックを巻き戻し,リターン先以外の場所にジャンプする 機能を備えている. SML#およびC++では例外,Cではsetjmpおよびlongjmpが これに該当する. コールバックを含むC関数をインポートしたSML#プログラムに おいても,これらのジャンプ機構を,その機構に期待する通りに利用することができる. SML#の例外機構およびC/C++のジャンプ機構による SML#プログラムへの影響を以下に列挙する.

  1. 1.

    SML#の例外機構は,C++の例外機構と同様,Itanium ABIを通じて 実装されている. 従って,同じItanium ABIで実装された例外機構の cleanupハンドラは,SML#の例外によっても実行される. 例えば, C++のローカル変数に対するデストラクタは, SML#のコールバック関数を呼び出した際に例外が発生した場合でも, 適切に実行される.

  2. 2.

    SML#のraise式で発生した例外は,SML#の handle式でのみ捕捉できる. handle式はSML#の例外のみを捕捉し,その他の巻き戻し ジャンプは捕捉できない.

  3. 3.

    SML#の例外がどのhandle式にも捕捉されなかった場合, プログラム全体は中断され,システムに異常終了を報告する.

  4. 4.

    C++の例外とSML#の例外は,呼び出しスタックにSML#の コールバック関数が含まれていたとしても,互いに独立に,期待通りに動作する.

  5. 5.

    Cのsetjmpおよびlongjmpも,SML#プログラムから 見て単なる巻き戻しジャンプとして使用されている場合に限り,呼び出しスタックに SML#のコールバック関数を挟んでいたとしても,期待通りに動作する. setjmpおよびlongjmp関数を用いてSML#プログラム内に ループを作ることはできない.