ruby-changes:5716
From: shyouhei <ko1@a...>
Date: Sun, 15 Jun 2008 21:06:45 +0900 (JST)
Subject: [ruby-changes:5716] Ruby:r17222 (ruby_1_8_6): merge revision(s) 15856:
shyouhei 2008-06-15 21:06:33 +0900 (Sun, 15 Jun 2008) New Revision: 17222 Modified files: branches/ruby_1_8_6/ChangeLog branches/ruby_1_8_6/class.c branches/ruby_1_8_6/version.h Log: merge revision(s) 15856: * class.c (clone_method): should copy cref as well. [ruby-core:15833] http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/ChangeLog?r1=17222&r2=17221&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/version.h?r1=17222&r2=17221&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/class.c?r1=17222&r2=17221&diff_format=u Index: ruby_1_8_6/class.c =================================================================== --- ruby_1_8_6/class.c (revision 17221) +++ ruby_1_8_6/class.c (revision 17222) @@ -48,13 +48,26 @@ return rb_class_boot(super); } +struct clone_method_data { + st_table *tbl; + VALUE klass; +}; + static int -clone_method(mid, body, tbl) +clone_method(mid, body, data) ID mid; NODE *body; - st_table *tbl; + struct clone_method_data *data; { - st_insert(tbl, mid, (st_data_t)NEW_METHOD(body->nd_body, body->nd_noex)); + NODE *fbody = body->nd_body; + + if (fbody && nd_type(fbody) == NODE_SCOPE) { + VALUE cref = data->klass ? + (VALUE)NEW_NODE(NODE_CREF,data->klass,0,fbody->nd_rval) : + fbody->nd_rval; + fbody = NEW_NODE(NODE_SCOPE, fbody->nd_tbl, cref, fbody->nd_next); + } + st_insert(data->tbl, mid, (st_data_t)NEW_METHOD(fbody, body->nd_noex)); return ST_CONTINUE; } @@ -65,7 +78,8 @@ { rb_obj_init_copy(clone, orig); if (!FL_TEST(CLASS_OF(clone), FL_SINGLETON)) { - RBASIC(clone)->klass = rb_singleton_class_clone(orig); + RBASIC(clone)->klass = RBASIC(orig)->klass; + RBASIC(clone)->klass = rb_singleton_class_clone(clone); } RCLASS(clone)->super = RCLASS(orig)->super; if (RCLASS(orig)->iv_tbl) { @@ -78,9 +92,12 @@ st_delete(RCLASS(clone)->iv_tbl, (st_data_t*)&id, 0); } if (RCLASS(orig)->m_tbl) { - RCLASS(clone)->m_tbl = st_init_numtable(); - st_foreach(RCLASS(orig)->m_tbl, clone_method, - (st_data_t)RCLASS(clone)->m_tbl); + struct clone_method_data data; + + data.tbl = RCLASS(clone)->m_tbl = st_init_numtable(); + data.klass = (VALUE)clone; + + st_foreach(RCLASS(orig)->m_tbl, clone_method, (st_data_t)&data); } return clone; @@ -126,9 +143,22 @@ if (RCLASS(klass)->iv_tbl) { clone->iv_tbl = st_copy(RCLASS(klass)->iv_tbl); } - clone->m_tbl = st_init_numtable(); - st_foreach(RCLASS(klass)->m_tbl, clone_method, - (st_data_t)clone->m_tbl); + { + struct clone_method_data data; + + data.tbl = clone->m_tbl = st_init_numtable(); + switch (TYPE(obj)) { + case T_CLASS: + case T_MODULE: + data.klass = obj; + break; + default: + data.klass = 0; + break; + } + + st_foreach(RCLASS(klass)->m_tbl, clone_method, (st_data_t)&data); + } rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone); FL_SET(clone, FL_SINGLETON); return (VALUE)clone; Index: ruby_1_8_6/ChangeLog =================================================================== --- ruby_1_8_6/ChangeLog (revision 17221) +++ ruby_1_8_6/ChangeLog (revision 17222) @@ -82,6 +82,11 @@ Fri Jun 13 13:14:31 2008 Yukihiro Matsumoto <matz@r...> * ext/dl/ptr.c (dlmem_each_i): typo fixed. a patch from IKOMA +Sun Jun 15 21:06:12 2008 Yukihiro Matsumoto <matz@r...> + + * class.c (clone_method): should copy cref as well. + [ruby-core:15833] + Yoshiki <ikoma@m...> in [ruby-dev:33776]. Fri Jun 13 13:13:23 2008 URABE Shyouhei <shyouhei@i...> Index: ruby_1_8_6/version.h =================================================================== --- ruby_1_8_6/version.h (revision 17221) +++ ruby_1_8_6/version.h (revision 17222) @@ -2,7 +2,7 @@ #define RUBY_RELEASE_DATE "2008-06-15" #define RUBY_VERSION_CODE 186 #define RUBY_RELEASE_CODE 20080615 -#define RUBY_PATCHLEVEL 189 +#define RUBY_PATCHLEVEL 190 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 8 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/