まつもと ゆきひろです

In message "Re: [ruby-dev:39591] Re: [ruby-cvs:32774] Ruby:r25556 (trunk): * array.c (rb_ary_to_ary): do not use #respond_to? to detect"
    on Fri, 30 Oct 2009 20:51:46 +0900, Nobuyoshi Nakada <nobu / ruby-lang.org> writes:

|At Fri, 30 Oct 2009 18:40:53 +0900,
|Yukihiro Matsumoto wrote in [ruby-dev:39589]:
|>   * method_missingが再定義されている時にはそれを呼ぶ。ちゃん
|>     と動作するかどうかはよくわからない
|
|こっちを実装してみました。

コードレビュー。

  * emtry -> entry
  * check_funcallの中でrb_search_method_emtry()を呼んでも問
    題なさそう

  * method_missingを呼ぶ条件は

|+	if (!me || (me->flag & NOEX_BASIC) || !rb_obj_respond_to(recv, mid, TRUE))

    になっているが、rb_method_basic_definition_p()だけでよい
    のではないか。

  * 私の理解が正しければ、正しい(と思われる)ロジックは

     + meがあればそれを呼ぶ
     + method_missingが再定義されていなければQundef
     + 再定義されていれば、rescueした上でmethod_missingを呼ぶ
     + 例外が起きたら、以下の条件を満たすときだけ、Qundef。
       満たさなければ、同じ例外をそのままあげる
       - レシーバが同じ
       - メソッド名が同じ

どうでしょう?