ruby-changes:5044
From: knu <ko1@a...>
Date: Fri, 23 May 2008 00:53:33 +0900 (JST)
Subject: [ruby-changes:5044] knu - Ruby:r16537 (ruby_1_8): * class.c (clone_method): Totally revamp the previous fix which
knu 2008-05-23 00:53:22 +0900 (Fri, 23 May 2008) New Revision: 16537 Modified files: branches/ruby_1_8/ChangeLog branches/ruby_1_8/class.c branches/ruby_1_8/version.h Log: * class.c (clone_method): Totally revamp the previous fix which was incorrect. (rb_mod_init_copy): Ditto. (singleton_class_clone_int): Ditto. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ChangeLog?r1=16537&r2=16536&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/class.c?r1=16537&r2=16536&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/version.h?r1=16537&r2=16536&diff_format=u Index: ruby_1_8/class.c =================================================================== --- ruby_1_8/class.c (revision 16536) +++ ruby_1_8/class.c (revision 16537) @@ -48,42 +48,33 @@ return rb_class_boot(super); } -struct clone_method_data { - st_table *tbl; - VALUE klass; - VALUE cref; -}; - static int -clone_method(mid, body, data) +clone_method(mid, body, nklass) ID mid; NODE *body; - struct clone_method_data *data; + VALUE nklass; { NODE *fbody = body->nd_body; - if (fbody && data->cref) { - VALUE body; + if (fbody) { + NODE *cref = NEW_NODE(NODE_CREF, nklass, 0, 0); + VALUE nbody; switch (nd_type(fbody)) { case NODE_SCOPE: - if (fbody->nd_rval) { - NODE *tmp = NEW_NODE(nd_type(fbody->u2.node), data->cref, - fbody->u2.node->u2.node, fbody->u2.node->u3.node); - fbody = NEW_NODE(nd_type(fbody), fbody->u1.node, tmp, fbody->u3.node); - } - break; + fbody = rb_copy_node_scope(fbody, cref); + break; case NODE_BMETHOD: - body = rb_block_dup(fbody->nd_cval, data->klass, data->cref); - fbody = NEW_BMETHOD(body); + nbody = rb_block_dup(fbody->nd_cval, nklass, (VALUE)cref); + fbody = NEW_BMETHOD(nbody); break; case NODE_DMETHOD: - body = rb_method_dup(fbody->nd_cval, data->klass, data->cref); - fbody = NEW_DMETHOD(body); + nbody = rb_method_dup(fbody->nd_cval, nklass, (VALUE)cref); + fbody = NEW_DMETHOD(nbody); break; } } - st_insert(data->tbl, mid, (st_data_t)NEW_METHOD(fbody, body->nd_noex)); + st_insert(RCLASS(nklass)->m_tbl, mid, (st_data_t)NEW_METHOD(fbody, body->nd_noex)); return ST_CONTINUE; } @@ -109,13 +100,8 @@ st_delete(RCLASS(clone)->iv_tbl, (st_data_t*)&id, 0); } if (RCLASS(orig)->m_tbl) { - struct clone_method_data data; - RCLASS(clone)->m_tbl = st_init_numtable(); - data.tbl = RCLASS(clone)->m_tbl; - data.klass = clone; - data.cref = clone; - st_foreach(RCLASS(orig)->m_tbl, clone_method, (st_data_t)&data); + st_foreach(RCLASS(orig)->m_tbl, clone_method, clone); } return clone; @@ -136,15 +122,14 @@ } static VALUE -singleton_class_clone_int(obj, cref) - VALUE obj, cref; +singleton_class_clone_int(obj, nklass) + VALUE obj, nklass; { VALUE klass = RBASIC(obj)->klass; if (!FL_TEST(klass, FL_SINGLETON)) return klass; else { - struct clone_method_data data; /* copy singleton(unnamed) class */ NEWOBJ(clone, struct RClass); OBJSETUP(clone, 0, RBASIC(klass)->flags); @@ -163,10 +148,7 @@ clone->iv_tbl = st_copy(RCLASS(klass)->iv_tbl); } clone->m_tbl = st_init_numtable(); - data.tbl = clone->m_tbl; - data.klass = (VALUE)clone; - data.cref = cref; - st_foreach(RCLASS(klass)->m_tbl, clone_method, (st_data_t)&data); + st_foreach(RCLASS(klass)->m_tbl, clone_method, NIL_P(nklass) ? (VALUE)clone : nklass); rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone); FL_SET(clone, FL_SINGLETON); return (VALUE)clone; Index: ruby_1_8/ChangeLog =================================================================== --- ruby_1_8/ChangeLog (revision 16536) +++ ruby_1_8/ChangeLog (revision 16537) @@ -1,3 +1,10 @@ +Fri May 23 00:51:48 2008 Akinori MUSHA <knu@i...> + + * class.c (clone_method): Totally revamp the previous fix which + was incorrect. + (rb_mod_init_copy): Ditto. + (singleton_class_clone_int): Ditto. + Fri May 23 00:48:10 2008 Akinori MUSHA <knu@i...> * eval.c (rb_copy_node_scope), node.h: Rename from copy_node_scope Index: ruby_1_8/version.h =================================================================== --- ruby_1_8/version.h (revision 16536) +++ ruby_1_8/version.h (revision 16537) @@ -1,7 +1,7 @@ #define RUBY_VERSION "1.8.7" -#define RUBY_RELEASE_DATE "2008-05-22" +#define RUBY_RELEASE_DATE "2008-05-23" #define RUBY_VERSION_CODE 187 -#define RUBY_RELEASE_CODE 20080522 +#define RUBY_RELEASE_CODE 20080523 #define RUBY_PATCHLEVEL 5000 #define RUBY_VERSION_MAJOR 1 @@ -9,7 +9,7 @@ #define RUBY_VERSION_TEENY 7 #define RUBY_RELEASE_YEAR 2008 #define RUBY_RELEASE_MONTH 5 -#define RUBY_RELEASE_DAY 22 +#define RUBY_RELEASE_DAY 23 #ifdef RUBY_EXTERN RUBY_EXTERN const char ruby_version[]; -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/