Perlテックブログ

ITエンジニアの成長意欲を刺激する技術考察、モジュール開発の日記。Perlイベントや国内や海外のPerlの記事の紹介。

SPVMの例外の実装

SPVMの目標のひとつは、C/C++を簡単にPerlからバインディングできるようにすることだ。C++の例外についての話を、江添さんがブログで書いておられたので、SPVMの例外の実装についても少し書いておきたくなった。

cpplover.blogspot.com

SPVMの例外は内部的には戻り値で処理される

SPVMの例外機構は、setjmp、longjmpなどのジャンプ機構はまったく使っていません。例外が起こっても、関数を超えて移動するということはまったくなくって、例外が起こっているかどうかは戻り値でチェックされます。

例外が起こった場合は、例外が起こったことを知らせるために、1を返し、正常終了の場合は、0を返します。

「戻り値で例外を知らせるんだったら、実際の戻り値はどうやって返すの?」

それは、スタックを使う。引数をスタックから取得し、戻り値は、スタックの一番最初の位置に保存する。

これは内部的な話で、SPVM言語においては、普通に戻り値は使えるし、例外は「$@」という特殊変数に保存される。

eval {
  # 例外発生
};

if (my $error = $@) {
  # 例外処理
}

内部的という意味はC/C++言語レベルにおいてという意味です。

C/C++レベルではこう書く。

int32_t exception_flag = env->call_sub(env, sub_id);

return exception_falg;

例外が発生したことを、次々の関数の上位に向けて伝播させていく。