まつもと ゆきひろです
In message "[ruby-dev:21794] ruby-1.8.1-preview2 での rb_iter_break"
on 03/10/31, Kenta MURATA <muraken2 / nifty.com> writes:
|ruby-1.8.0 では動作していた拡張ライブラリが ruby-1.8.1-preview2 では例
|外を投げるようになってしまいました.簡略化したコードを以下に示します.
| static VALUE
| ahi_abort(VALUE obj)
| {
| rb_iter_break();
| }
これは仕様変更(というか、今まで偶然動いていた)ものです。
正しくは
| #include <ruby.h>
|
| static VALUE
| ahi_ahi(VALUE obj)
| {
| rb_catch("ahi", rb_yield, Qnil);
| }
|
| static VALUE
| ahi_abort(VALUE obj)
| {
| rb_throw("ahi", Qnil);
| }
|
| void
| Init_ahi(void)
| {
| VALUE cAhi = rb_define_class("Ahi", rb_cObject);
| rb_define_method(cAhi, "ahi", ahi_ahi, 0);
| rb_define_method(cAhi, "abort", ahi_abort, 0);
| }
としてください。むやみにbreakをつかうのでなく、こういう目的
にはcatch/throwがお薦めです。
まつもと ゆきひろ /:|)