Index: class.c =================================================================== --- class.c (revision 17222) +++ class.c (revision 17218) @@ -48,26 +48,13 @@ return rb_class_boot(super); } -struct clone_method_data { - st_table *tbl; - VALUE klass; -}; - static int -clone_method(mid, body, data) +clone_method(mid, body, tbl) ID mid; NODE *body; - struct clone_method_data *data; + st_table *tbl; { - 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)); + st_insert(tbl, mid, (st_data_t)NEW_METHOD(body->nd_body, body->nd_noex)); return ST_CONTINUE; } @@ -78,8 +65,7 @@ { rb_obj_init_copy(clone, orig); if (!FL_TEST(CLASS_OF(clone), FL_SINGLETON)) { - RBASIC(clone)->klass = RBASIC(orig)->klass; - RBASIC(clone)->klass = rb_singleton_class_clone(clone); + RBASIC(clone)->klass = rb_singleton_class_clone(orig); } RCLASS(clone)->super = RCLASS(orig)->super; if (RCLASS(orig)->iv_tbl) { @@ -92,12 +78,9 @@ st_delete(RCLASS(clone)->iv_tbl, (st_data_t*)&id, 0); } if (RCLASS(orig)->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); + RCLASS(clone)->m_tbl = st_init_numtable(); + st_foreach(RCLASS(orig)->m_tbl, clone_method, + (st_data_t)RCLASS(clone)->m_tbl); } return clone; @@ -143,22 +126,9 @@ if (RCLASS(klass)->iv_tbl) { clone->iv_tbl = st_copy(RCLASS(klass)->iv_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); - } + clone->m_tbl = st_init_numtable(); + st_foreach(RCLASS(klass)->m_tbl, clone_method, + (st_data_t)clone->m_tbl); rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone); FL_SET(clone, FL_SINGLETON); return (VALUE)clone; Index: ChangeLog =================================================================== --- ChangeLog (revision 17222) +++ ChangeLog (revision 17218) @@ -82,11 +82,6 @@ Fri Jun 13 13:14:31 2008 Yukihiro Matsumoto * ext/dl/ptr.c (dlmem_each_i): typo fixed. a patch from IKOMA -Sun Jun 15 21:06:12 2008 Yukihiro Matsumoto - - * class.c (clone_method): should copy cref as well. - [ruby-core:15833] - Yoshiki in [ruby-dev:33776]. Fri Jun 13 13:13:23 2008 URABE Shyouhei