* eval.c (proc_eq): compare Procs using blocktag equality.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1232 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2001-03-05 08:33:16 +00:00
parent ea201e7eb0
commit 4a7d313e4a
3 changed files with 78 additions and 38 deletions

View File

@ -1,3 +1,7 @@
Mon Mar 5 17:25:13 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
* eval.c (proc_eq): compare Procs using blocktag equality.
Mon Mar 5 17:19:56 2001 WATANABE Hirofumi <eban@ruby-lang.org> Mon Mar 5 17:19:56 2001 WATANABE Hirofumi <eban@ruby-lang.org>
* win32/win32.c (gettimeofday): use GetLocalTime() instead of ftime() * win32/win32.c (gettimeofday): use GetLocalTime() instead of ftime()
@ -7,6 +11,12 @@ Sun Mar 4 17:01:09 2001 WATANABE Hirofumi <eban@ruby-lang.org>
* string.c (trnext): support backslash escape in String#tr. * string.c (trnext): support backslash escape in String#tr.
Sat Mar 3 16:15:16 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
* eval.c (rb_eval): push cbase if ruby_cbase != ruby_class, for
example in the case NODE_DEFN/NODE_DEFS are called within
module_eval.
Wed Feb 28 11:02:41 2001 Yukihiro Matsumoto <matz@ruby-lang.org> Wed Feb 28 11:02:41 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
* string.c (rb_str_delete_bang): delete! should take at least 1 * string.c (rb_str_delete_bang): delete! should take at least 1

1
ToDo
View File

@ -82,6 +82,7 @@ Extension Libraries
* ptk.rb pTk wrapper that is compatible to tk.rb * ptk.rb pTk wrapper that is compatible to tk.rb
* Berkeley DB extension * Berkeley DB extension
* BitVector * BitVector
* thread-safe fcgi
Ruby Libraries Ruby Libraries

105
eval.c
View File

@ -1457,52 +1457,56 @@ ev_const_get(cref, id)
} }
cbase = cbase->nd_next; cbase = cbase->nd_next;
} }
#if 1
return rb_const_get(ruby_class, id);
#else
return rb_const_get(cref->nd_clss, id); return rb_const_get(cref->nd_clss, id);
#endif
} }
static VALUE static VALUE
ev_const_set(cref, id, val) ev_const_set(cref, id, val)
NODE *cref; NODE *cref;
ID id; ID id;
VALUE val; VALUE val;
{ {
NODE *cbase = cref; NODE *cbase = cref;
while (cbase && cbase->nd_clss != rb_cObject) { while (cbase && cbase->nd_clss != rb_cObject) {
struct RClass *klass = RCLASS(cbase->nd_clss); struct RClass *klass = RCLASS(cbase->nd_clss);
if (klass->iv_tbl && st_lookup(klass->iv_tbl, id, 0)) { if (klass->iv_tbl && st_lookup(klass->iv_tbl, id, 0)) {
st_insert(klass->iv_tbl, id, val); st_insert(klass->iv_tbl, id, val);
return val; return val;
} }
cbase = cbase->nd_next; cbase = cbase->nd_next;
} }
rb_const_assign(cbase->nd_clss, id, val); rb_const_assign(cbase->nd_clss, id, val);
return val; return val;
} }
static VALUE static VALUE
rb_mod_nesting() rb_mod_nesting()
{ {
NODE *cbase = RNODE(ruby_frame->cbase); NODE *cbase = RNODE(ruby_frame->cbase);
VALUE ary = rb_ary_new(); VALUE ary = rb_ary_new();
while (cbase && cbase->nd_clss != rb_cObject) { while (cbase && cbase->nd_clss != rb_cObject) {
rb_ary_push(ary, cbase->nd_clss); rb_ary_push(ary, cbase->nd_clss);
cbase = cbase->nd_next; cbase = cbase->nd_next;
} }
return ary; return ary;
} }
static VALUE static VALUE
rb_mod_s_constants() rb_mod_s_constants()
{ {
NODE *cbase = RNODE(ruby_frame->cbase); NODE *cbase = RNODE(ruby_frame->cbase);
VALUE ary = rb_ary_new(); VALUE ary = rb_ary_new();
while (cbase && cbase->nd_clss != rb_cObject) { while (cbase && cbase->nd_clss != rb_cObject) {
rb_mod_const_at(cbase->nd_clss, ary); rb_mod_const_at(cbase->nd_clss, ary);
cbase = cbase->nd_next; cbase = cbase->nd_next;
} }
rb_mod_const_of(ruby_cbase, ary); rb_mod_const_of(ruby_cbase, ary);
@ -2942,6 +2946,11 @@ rb_eval(self, n)
rb_warn("redefining `%s' may cause serious problem", rb_warn("redefining `%s' may cause serious problem",
rb_id2name(node->nd_mid)); rb_id2name(node->nd_mid));
} }
if (node->nd_defn->nd_rval &&
((NODE*)node->nd_defn->nd_rval)->nd_clss != ruby_class) {
node->nd_defn->nd_rval =
(VALUE)rb_node_newnode(NODE_CREF,ruby_class,0, node->nd_defn->nd_rval);
}
rb_frozen_class_p(ruby_class); rb_frozen_class_p(ruby_class);
body = search_method(ruby_class, node->nd_mid, &origin); body = search_method(ruby_class, node->nd_mid, &origin);
if (body){ if (body){
@ -3004,6 +3013,11 @@ rb_eval(self, n)
rb_class2name(CLASS_OF(recv))); rb_class2name(CLASS_OF(recv)));
} }
if (node->nd_defn->nd_rval &&
((NODE*)node->nd_defn->nd_rval)->nd_clss != ruby_class) {
node->nd_defn->nd_rval =
(VALUE)rb_node_newnode(NODE_CREF,ruby_class,0, node->nd_defn->nd_rval);
}
if (OBJ_FROZEN(recv)) rb_error_frozen("object"); if (OBJ_FROZEN(recv)) rb_error_frozen("object");
klass = rb_singleton_class(recv); klass = rb_singleton_class(recv);
if (st_lookup(RCLASS(klass)->m_tbl, node->nd_mid, &body)) { if (st_lookup(RCLASS(klass)->m_tbl, node->nd_mid, &body)) {
@ -4982,8 +4996,8 @@ yield_under_i(self)
VALUE result; VALUE result;
int state; int state;
block = *ruby_block;
/* copy the block to avoid modifying global data. */ /* copy the block to avoid modifying global data. */
block = *ruby_block;
block.frame.cbase = ruby_frame->cbase; block.frame.cbase = ruby_frame->cbase;
ruby_block = &block; ruby_block = &block;
@ -6334,6 +6348,20 @@ proc_arity(proc)
} }
} }
static VALUE
proc_eq(self, other)
VALUE self, other;
{
struct BLOCK *data, *data2;
if (TYPE(other) != T_DATA) return Qfalse;
if (RDATA(other)->dmark != blk_mark) Qfalse;
Data_Get_Struct(self, struct BLOCK, data);
Data_Get_Struct(other, struct BLOCK, data2);
if (data->tag == data2->tag) return Qtrue;
return Qfalse;
}
static VALUE static VALUE
block_pass(self, node) block_pass(self, node)
VALUE self; VALUE self;
@ -6751,6 +6779,7 @@ Init_Proc()
rb_define_method(rb_cProc, "call", proc_call, -2); rb_define_method(rb_cProc, "call", proc_call, -2);
rb_define_method(rb_cProc, "arity", proc_arity, 0); rb_define_method(rb_cProc, "arity", proc_arity, 0);
rb_define_method(rb_cProc, "[]", proc_call, -2); rb_define_method(rb_cProc, "[]", proc_call, -2);
rb_define_method(rb_cProc, "==", proc_eq, 1);
rb_define_global_function("proc", rb_f_lambda, 0); rb_define_global_function("proc", rb_f_lambda, 0);
rb_define_global_function("lambda", rb_f_lambda, 0); rb_define_global_function("lambda", rb_f_lambda, 0);
rb_define_global_function("binding", rb_f_binding, 0); rb_define_global_function("binding", rb_f_binding, 0);