From: wanabe Date: 2008-04-16T20:58:49+09:00 Subject: [ruby-dev:34432] patch for ruby-Bugs-19304 ワナベと申します。 [ruby-Bugs-19304] に対するパッチを書きました。 define_method で作られたメソッドの return の飛び先が直前のフレームになります。 ですが、rb_mod_define_method() 中では iseq をコピーせずに proc->block.iseq->defined_method_id = id; のように値を書き込んでいるため Proc オブジェクトが書き換えられて誤認識される可能性があります。 iseq を安全にコピーする方法がわからなかったのでそのままにしてしまいました。 define_method に return を含んだ Proc オブジェクトを渡し、さらにそれを Proc として使いまわす、という特殊な場面以外では問題ないと思います。 Index: vm_insnhelper.c =================================================================== --- vm_insnhelper.c (revision 15984) +++ vm_insnhelper.c (working copy) @@ -1288,6 +1288,7 @@ VALUE *dfp = GET_DFP(); int is_orphan = 1; + pt = 0; /** * check orphan: */ @@ -1296,6 +1297,11 @@ if (VM_FRAME_TYPE(cfp) == FRAME_MAGIC_LAMBDA) { /* in lambda */ is_orphan = 0; + if (BUILTIN_TYPE(cfp->iseq) != T_NODE) { + if (cfp->iseq->defined_method_id) { + pt = GET_DFP(); + } + } break; } } @@ -1311,7 +1317,9 @@ vm_localjump_error("unexpected return", throwobj, TAG_RETURN); } - pt = GET_LFP(); + if (!pt) { + pt = GET_LFP(); + } } else { rb_bug("isns(throw): unsupport throw type"); -- ワナベ