Rua: function rb_protect

http://doc.loveruby.net/refm/capi/view/function/rb_protect
rb_protectという大域脱出を補足してくれる関数があることを、ここを読んで知った。
Ruby拡張で言語バインディングの記事は参考になるなぁ。

Lua自体には例外処理機能はないみたいだからLuaの関数(ProcをLuaの関数に変換したものも含む)をRuaFuncインスタンスに変換した時点で例外を投げないようにすればいいかなぁ?
なんか、ProcをLua内で実行したときに例外を投げるのもまずい気がしてきたけど。


http://72.14.235.104/search?q=cache:p-zGKpOCjqoJ:pc11.2ch.net/test/read.cgi/tech/1160799232/l50+Lua+%E4%BE%8B%E5%A4%96&hl=ja&ct=clnk&cd=10&gl=jp&lr=lang_ja&client=firefox-a

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++. ..."

    なんかぼかして書いてあるけど、そういうことね。

    ありがと。