From: shugo@... (Shugo Maeda) Date: 1997-12-10T07:06:13+09:00 Subject: [ruby-dev:1004] Re: Object#bind --Multipart_Wed_Dec_10_07:13:47_1997-1 Content-Type: text/plain; charset=ISO-2022-JP 前田です。 In message "[ruby-dev:1003] Re: Object#bind" Shugo Maeda wrote: |イテレータでこけてしまいました。 PUSH_ITER(iterator_p()?ITER_PRE:ITER_NOT); とするだけでよいのかな。 とりあえず以下のパッチでイテレータも動くようになりました。 # 先程のパッチへのパッチです。 あと,bindってtk.rbやe2mmap.rbで使ってるのでまずいですね。 とりあえずbind_methodに変更してみましたが,ちょっと長い ような気も...。 -- 前田 修吾 --Multipart_Wed_Dec_10_07:13:47_1997-1 Content-Type: application/octet-stream Content-Disposition: attachment; filename="eval.c.diff2" Content-Transfer-Encoding: 7bit --- eval.c.orig Wed Dec 10 06:14:07 1997 +++ eval.c Wed Dec 10 07:09:52 1997 @@ -4375,7 +4375,7 @@ return result; } -VALUE cBoundMethod; +static VALUE cBoundMethod; struct BOUND_METHOD { VALUE class; VALUE recv; @@ -4390,7 +4390,7 @@ gc_mark(data->body); } -static VALUE obj_bind(VALUE obj, VALUE vid) +static VALUE obj_bind_method(VALUE obj, VALUE vid) { VALUE method; VALUE class = CLASS_OF(obj); @@ -4452,7 +4452,7 @@ return method; } -static VALUE bmethod_call(int argc, VALUE *argv, VALUE method) +static VALUE boundmethod_call(int argc, VALUE *argv, VALUE method) { VALUE result; struct BOUND_METHOD *data; @@ -4460,8 +4460,10 @@ Data_Get_Struct(method, struct BOUND_METHOD, data); type = nd_type(data->body); + PUSH_ITER(iterator_p()?ITER_PRE:ITER_NOT); result = rb_call0(data->class, data->recv, data->id, data->id, argc, argv, 1, data->body, type); + POP_ITER(); return result; } @@ -4480,8 +4482,8 @@ cBoundMethod = rb_define_class("BoundMethod", cObject); rb_undef_method(CLASS_OF(cBoundMethod), "new"); - rb_define_method(cBoundMethod, "call", bmethod_call, -1); - rb_define_method(mKernel, "bind", obj_bind, 1); + rb_define_method(cBoundMethod, "call", boundmethod_call, -1); + rb_define_method(mKernel, "bind_method", obj_bind_method, 1); } #ifdef THREAD --Multipart_Wed_Dec_10_07:13:47_1997-1--