From: Tadashi Saito Date: 2008-02-14T03:57:49+09:00 Subject: [ruby-dev:33769] Re: unsupported: th_call0 in 1.9 斎藤と申します。 On Sun, 21 Oct 2007 00:45:46 +0900 "KUBO Takehiro" wrote: > 8ヶ月前のメールですが、この件、ずっと困っていたので proc.c の mnew() > を参考にパッチを作りました。 [ruby-dev:30396]の試験プログラムは動くよ > うになりました。 …と言うメールから四ヶ月近く経つ、だいぶ古い話ですが、この件はその後 どうなっていますか? 自分の手元では、変わりがないように見えます。すなわち $ ruby-trunk -v ruby 1.9.0 (2008-02-14 revision 15234) [i686-linux] という環境で ・[ruby-dev:30396] の [BUG] が再現して ・[ruby-dev:32111] のパッチで問題なく「OK」が表示される という状態です。 中身はまったく分かりませんが、[ruby-dev:32111]の久保さんのパッチを、 今のeval.cに合わせてrejectionを解決したものを再掲して置きます。 お役に立てば幸いです。 Index: eval.c =================================================================== --- eval.c (revision 15464) +++ eval.c (working copy) @@ -1363,6 +1363,7 @@ rb_call0(VALUE klass, VALUE recv, ID mid, int argc, const VALUE *argv, int scope, VALUE self) { NODE *body, *method; + int noex_is_set = 0; int noex; ID id = mid; struct cache_entry *ent; @@ -1373,6 +1374,7 @@ "method `%s' called on terminated object (%p)", rb_id2name(mid), (void *)recv); } + again: /* is it in the method cache? */ ent = cache + EXPR1(klass, mid); @@ -1381,12 +1383,18 @@ return method_missing(recv, mid, argc, argv, scope == 2 ? NOEX_VCALL : 0); id = ent->mid0; - noex = ent->method->nd_noex; + if (!noex_is_set) { + noex = ent->method->nd_noex; + noex_is_set = 1; + } klass = ent->method->nd_clss; body = ent->method->nd_body; } - else if ((method = rb_get_method_body(klass, id, &id)) != 0) { - noex = method->nd_noex; + else if ((method = rb_get_method_body(klass, mid, &id)) != 0) { + if (!noex_is_set) { + noex = method->nd_noex; + noex_is_set = 1; + } klass = method->nd_clss; body = method->nd_body; } @@ -1397,7 +1405,10 @@ return method_missing(recv, mid, argc, argv, scope == 2 ? NOEX_VCALL : 0); } - + if (nd_type(body) == NODE_ZSUPER) { + klass = RCLASS_SUPER(klass); + goto again; + } if (mid != missing) { /* receiver specified form for private method */ -- 斎藤ただし