* 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
This commit is contained in:
parent
509fa97431
commit
b416c57c0a
11
ChangeLog
11
ChangeLog
@ -1,3 +1,14 @@
|
|||||||
|
Tue Feb 10 20:49:07 2004 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* 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.
|
||||||
|
|
||||||
Tue Feb 10 16:43:50 2004 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Tue Feb 10 16:43:50 2004 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* eval.c (umethod_bind): perge unused check. [ruby-dev:22850]
|
* eval.c (umethod_bind): perge unused check. [ruby-dev:22850]
|
||||||
|
23
eval.c
23
eval.c
@ -5437,10 +5437,6 @@ rb_call0(klass, recv, id, oid, argc, argv, body, nosuper)
|
|||||||
result = rb_eval(recv, body);
|
result = rb_eval(recv, body);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NODE_DMETHOD:
|
|
||||||
result = method_call(argc, argv, umethod_bind(body->nd_cval, recv));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NODE_BMETHOD:
|
case NODE_BMETHOD:
|
||||||
result = proc_invoke(body->nd_cval, rb_ary_new4(argc, argv), recv, klass);
|
result = proc_invoke(body->nd_cval, rb_ary_new4(argc, argv), recv, klass);
|
||||||
break;
|
break;
|
||||||
@ -8781,7 +8777,6 @@ method_arity(method)
|
|||||||
case NODE_IVAR:
|
case NODE_IVAR:
|
||||||
return INT2FIX(0);
|
return INT2FIX(0);
|
||||||
case NODE_BMETHOD:
|
case NODE_BMETHOD:
|
||||||
case NODE_DMETHOD:
|
|
||||||
return proc_arity(body->nd_cval);
|
return proc_arity(body->nd_cval);
|
||||||
default:
|
default:
|
||||||
body = body->nd_next; /* skip NODE_SCOPE */
|
body = body->nd_next; /* skip NODE_SCOPE */
|
||||||
@ -8907,8 +8902,11 @@ method_proc(method)
|
|||||||
struct METHOD *mdata;
|
struct METHOD *mdata;
|
||||||
struct BLOCK *bdata;
|
struct BLOCK *bdata;
|
||||||
|
|
||||||
proc = rb_iterate((VALUE(*)_((VALUE)))mproc, 0, bmcall, method);
|
|
||||||
Data_Get_Struct(method, struct METHOD, mdata);
|
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);
|
Data_Get_Struct(proc, struct BLOCK, bdata);
|
||||||
bdata->body->nd_file = mdata->body->nd_file;
|
bdata->body->nd_file = mdata->body->nd_file;
|
||||||
nd_set_line(bdata->body, nd_line(mdata->body));
|
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);
|
rb_raise(rb_eArgError, "wrong number of arguments(%d for 1)", argc);
|
||||||
}
|
}
|
||||||
if (RDATA(body)->dmark == (RUBY_DATA_FUNC)bm_mark) {
|
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) {
|
else if (RDATA(body)->dmark == (RUBY_DATA_FUNC)blk_mark) {
|
||||||
struct BLOCK *block;
|
struct BLOCK *block;
|
||||||
|
1
intern.h
1
intern.h
@ -305,6 +305,7 @@ VALUE rb_obj_freeze _((VALUE));
|
|||||||
VALUE rb_obj_id _((VALUE));
|
VALUE rb_obj_id _((VALUE));
|
||||||
VALUE rb_obj_class _((VALUE));
|
VALUE rb_obj_class _((VALUE));
|
||||||
VALUE rb_class_real _((VALUE));
|
VALUE rb_class_real _((VALUE));
|
||||||
|
VALUE rb_class_inherited_p _((VALUE, VALUE));
|
||||||
VALUE rb_convert_type _((VALUE,int,const char*,const char*));
|
VALUE rb_convert_type _((VALUE,int,const char*,const char*));
|
||||||
VALUE rb_check_convert_type _((VALUE,int,const char*,const char*));
|
VALUE rb_check_convert_type _((VALUE,int,const char*,const char*));
|
||||||
VALUE rb_to_int _((VALUE));
|
VALUE rb_to_int _((VALUE));
|
||||||
|
2
node.h
2
node.h
@ -118,7 +118,6 @@ enum node_type {
|
|||||||
#ifdef C_ALLOCA
|
#ifdef C_ALLOCA
|
||||||
NODE_ALLOCA,
|
NODE_ALLOCA,
|
||||||
#endif
|
#endif
|
||||||
NODE_DMETHOD,
|
|
||||||
NODE_BMETHOD,
|
NODE_BMETHOD,
|
||||||
NODE_MEMO,
|
NODE_MEMO,
|
||||||
NODE_IFUNC,
|
NODE_IFUNC,
|
||||||
@ -335,7 +334,6 @@ typedef struct RNode {
|
|||||||
#define NEW_DEFINED(e) NEW_NODE(NODE_DEFINED,e,0,0)
|
#define NEW_DEFINED(e) NEW_NODE(NODE_DEFINED,e,0,0)
|
||||||
#define NEW_PREEXE(b) NEW_SCOPE(b)
|
#define NEW_PREEXE(b) NEW_SCOPE(b)
|
||||||
#define NEW_POSTEXE() NEW_NODE(NODE_POSTEXE,0,0,0)
|
#define NEW_POSTEXE() NEW_NODE(NODE_POSTEXE,0,0,0)
|
||||||
#define NEW_DMETHOD(b) NEW_NODE(NODE_DMETHOD,0,0,b)
|
|
||||||
#define NEW_BMETHOD(b) NEW_NODE(NODE_BMETHOD,0,0,b)
|
#define NEW_BMETHOD(b) NEW_NODE(NODE_BMETHOD,0,0,b)
|
||||||
#define NEW_ATTRASGN(r,m,a) NEW_NODE(NODE_ATTRASGN,r,m,a)
|
#define NEW_ATTRASGN(r,m,a) NEW_NODE(NODE_ATTRASGN,r,m,a)
|
||||||
|
|
||||||
|
12
object.c
12
object.c
@ -1269,8 +1269,8 @@ rb_mod_eqq(mod, arg)
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static VALUE
|
VALUE
|
||||||
rb_mod_le(mod, arg)
|
rb_class_inherited_p(mod, arg)
|
||||||
VALUE mod, arg;
|
VALUE mod, arg;
|
||||||
{
|
{
|
||||||
VALUE start = mod;
|
VALUE start = mod;
|
||||||
@ -1314,7 +1314,7 @@ rb_mod_lt(mod, arg)
|
|||||||
VALUE mod, arg;
|
VALUE mod, arg;
|
||||||
{
|
{
|
||||||
if (mod == arg) return Qfalse;
|
if (mod == arg) return Qfalse;
|
||||||
return rb_mod_le(mod, arg);
|
return rb_class_inherited_p(mod, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1342,7 +1342,7 @@ rb_mod_ge(mod, arg)
|
|||||||
rb_raise(rb_eTypeError, "compared with non class/module");
|
rb_raise(rb_eTypeError, "compared with non class/module");
|
||||||
}
|
}
|
||||||
|
|
||||||
return rb_mod_le(arg, mod);
|
return rb_class_inherited_p(arg, mod);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1390,7 +1390,7 @@ rb_mod_cmp(mod, arg)
|
|||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
|
|
||||||
cmp = rb_mod_le(mod, arg);
|
cmp = rb_class_inherited_p(mod, arg);
|
||||||
if (NIL_P(cmp)) return Qnil;
|
if (NIL_P(cmp)) return Qnil;
|
||||||
if (cmp) {
|
if (cmp) {
|
||||||
return INT2FIX(-1);
|
return INT2FIX(-1);
|
||||||
@ -2569,7 +2569,7 @@ Init_Object()
|
|||||||
rb_define_method(rb_cModule, "==", rb_obj_equal, 1);
|
rb_define_method(rb_cModule, "==", rb_obj_equal, 1);
|
||||||
rb_define_method(rb_cModule, "<=>", rb_mod_cmp, 1);
|
rb_define_method(rb_cModule, "<=>", rb_mod_cmp, 1);
|
||||||
rb_define_method(rb_cModule, "<", rb_mod_lt, 1);
|
rb_define_method(rb_cModule, "<", rb_mod_lt, 1);
|
||||||
rb_define_method(rb_cModule, "<=", rb_mod_le, 1);
|
rb_define_method(rb_cModule, "<=", rb_class_inherited_p, 1);
|
||||||
rb_define_method(rb_cModule, ">", rb_mod_gt, 1);
|
rb_define_method(rb_cModule, ">", rb_mod_gt, 1);
|
||||||
rb_define_method(rb_cModule, ">=", rb_mod_ge, 1);
|
rb_define_method(rb_cModule, ">=", rb_mod_ge, 1);
|
||||||
rb_define_method(rb_cModule, "initialize_copy", rb_mod_init_copy, 1); /* in class.c */
|
rb_define_method(rb_cModule, "initialize_copy", rb_mod_init_copy, 1); /* in class.c */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user