http://doc.loveruby.net/refm/capi/view/function/rb_protect
rb_protectという大域脱出を補足してくれる関数があることを、ここを読んで知った。
Ruby拡張で言語バインディングの記事は参考になるなぁ。
Lua自体には例外処理機能はないみたいだからLuaの関数(ProcをLuaの関数に変換したものも含む)をRuaFuncインスタンスに変換した時点で例外を投げないようにすればいいかなぁ?
なんか、ProcをLua内で実行したときに例外を投げるのもまずい気がしてきたけど。
500 :497:2007/10/14(日) 14:43:32 >>499 やっぱそれが妥当ですかねぇ。 ただ、Cのライブラリ使う場合Cのライブラリを-fexceptions付き でコンパイルしないといけないので(lua->Cライブラリ->luaが起こる 場合)、ソースが手に入ることが前提になるんだよね。 linux&gccな環境でソースが手に入らないことはまれだろうけど。 501 :デフォルトの名無しさん:2007/10/14(日) 15:38:22 そもそもCには例外処理が言語に組み込まれてないんだけど、 -fexception つけると 何が変わるの? 502 :497:2007/10/14(日) 16:26:57 >>501 えーっと、gccの話ね。(VCにも似たオプションがあったはず) 関数呼び出しが”C++<1:try> => C<2> => C++<3:throw>” となる場合 <2>の部分のスタックをまき戻す為の情報を付加しているんだと 思う。自信ないけど。 これが無いと例外発生時にAbortしてしまう。 >>499の例で言うと、 lua(C++) => C言語ライブラリ => lua_gettable(...) なんて場合、lua_gettable内で発生した例外が C言語ライブラリ内を通ることになる。 503 :デフォルトの名無しさん:2007/10/14(日) 16:57:07 >>502 つけてもつけなくても素通りするだけで変わらないと思ってたけど、 つけないと abort しちゃうのか。 http://gcc.gnu.org/onlinedocs/gcc-4.2.2/gcc/Code-Gen-Options.html -fexceptions "... However, you may need to enable this option when compiling C code that needs to interoperate properly with exception handlers written in C++. ..." なんかぼかして書いてあるけど、そういうことね。 ありがと。