From: Yusuke ENDOH Date: 2007-07-01T23:07:10+09:00 Subject: [ruby-dev:31101] exception when converting block arg 遠藤と申します。 1.9 でブロック引数に proc 以外の値を与えたときの例外が、値によらず wrong argument type NilClass (expected Proc) になります。 $ ./ruby -e 'foo(&1)' -e:1:in `
': wrong argument type NilClass (expected Proc) (TypeError) この場合は wrong argument type Fixnum (expected Proc) になって欲しいと 思います。1.8 の eval.c では以下のように対策済みでした。 Index: insnhelper.ci =================================================================== --- insnhelper.ci (revision 12674) +++ insnhelper.ci (working copy) @@ -198,18 +198,19 @@ if (block) { if (flag & VM_CALL_ARGS_BLOCKARG_BIT) { rb_proc_t *po; - VALUE proc; + VALUE proc, b; proc = *(--cfp->sp); if (proc != Qnil) { if (!rb_obj_is_proc(proc)) { - proc = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc"); - if (!rb_obj_is_proc(proc)) { + b = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc"); + if (!rb_obj_is_proc(b)) { rb_raise(rb_eTypeError, "wrong argument type %s (expected Proc)", rb_obj_classname(proc)); } + proc = b; } GetProcPtr(proc, po); blockptr = &po->block; -- Yusuke ENDOH