From b416c57c0a998c6f2435e419860b7645508816d6 Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 10 Feb 2004 11:49:14 +0000 Subject: * eval.c (method_proc): return bound Proc object. [ruby-dev:22854] * eval.c (rb_mod_define_method): bind method body itself for Method object. * node.h (NODE_DMETHOD): deprecated. * object.c (rb_class_inherited_p): export. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5667 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- eval.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 0fcbf8fa4c..9d46524f0a 100644 --- a/eval.c +++ b/eval.c @@ -5437,10 +5437,6 @@ rb_call0(klass, recv, id, oid, argc, argv, body, nosuper) result = rb_eval(recv, body); break; - case NODE_DMETHOD: - result = method_call(argc, argv, umethod_bind(body->nd_cval, recv)); - break; - case NODE_BMETHOD: result = proc_invoke(body->nd_cval, rb_ary_new4(argc, argv), recv, klass); break; @@ -8781,7 +8777,6 @@ method_arity(method) case NODE_IVAR: return INT2FIX(0); case NODE_BMETHOD: - case NODE_DMETHOD: return proc_arity(body->nd_cval); default: body = body->nd_next; /* skip NODE_SCOPE */ @@ -8907,8 +8902,11 @@ method_proc(method) struct METHOD *mdata; struct BLOCK *bdata; - proc = rb_iterate((VALUE(*)_((VALUE)))mproc, 0, bmcall, method); Data_Get_Struct(method, struct METHOD, mdata); + if (nd_type(mdata->body) == NODE_BMETHOD) { + return mdata->body->nd_cval; + } + proc = rb_iterate((VALUE(*)_((VALUE)))mproc, 0, bmcall, method); Data_Get_Struct(proc, struct BLOCK, bdata); bdata->body->nd_file = mdata->body->nd_file; nd_set_line(bdata->body, nd_line(mdata->body)); @@ -8991,7 +8989,18 @@ rb_mod_define_method(argc, argv, mod) rb_raise(rb_eArgError, "wrong number of arguments(%d for 1)", argc); } if (RDATA(body)->dmark == (RUBY_DATA_FUNC)bm_mark) { - node = NEW_DMETHOD(method_unbind(body)); + struct METHOD *method = (struct METHOD *)DATA_PTR(body); + VALUE rklass = method->rklass; + if (rklass != mod) { + if (FL_TEST(rklass, FL_SINGLETON)) { + rb_raise(rb_eTypeError, "cannot bind singleton method to a different class"); + } + if (RCLASS(rklass)->super && !RTEST(rb_class_inherited_p(mod, rklass))) { + rb_raise(rb_eTypeError, "bind argument must be a subclass of %s", + rb_class2name(rklass)); + } + } + node = method->body; } else if (RDATA(body)->dmark == (RUBY_DATA_FUNC)blk_mark) { struct BLOCK *block; -- cgit v1.2.3