ruby-changes:6112
From: shyouhei <ko1@a...>
Date: Sat, 28 Jun 2008 19:12:36 +0900 (JST)
Subject: [ruby-changes:6112] Ruby:r17623 (ruby_1_8, ruby_1_8_7): * class.c: revert to r15855.
shyouhei 2008-06-28 19:12:15 +0900 (Sat, 28 Jun 2008) New Revision: 17623 Modified files: branches/ruby_1_8/ChangeLog branches/ruby_1_8/class.c branches/ruby_1_8_7/ChangeLog branches/ruby_1_8_7/class.c Log: * class.c: revert to r15855. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ChangeLog?r1=17623&r2=17622&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_7/class.c?r1=17623&r2=17622&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_7/ChangeLog?r1=17623&r2=17622&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/class.c?r1=17623&r2=17622&diff_format=u Index: ruby_1_8/class.c =================================================================== --- ruby_1_8/class.c (revision 17622) +++ ruby_1_8/class.c (revision 17623) @@ -48,37 +48,29 @@ return rb_class_boot(super); } +struct clone_method_data { + st_table *tbl; + VALUE klass; +}; + static int -clone_method(mid, body, nklass) +clone_method(mid, body, data) ID mid; NODE *body; - VALUE nklass; + struct clone_method_data *data; { NODE *fbody = body->nd_body; - if (fbody) { - VALUE nbody; - - switch (nd_type(fbody)) { - case NODE_SCOPE: - fbody = rb_copy_node_scope(fbody, ruby_cref); - break; - case NODE_BMETHOD: - nbody = rb_block_dup(fbody->nd_cval, nklass, (VALUE)ruby_cref); - fbody = NEW_BMETHOD(nbody); - break; - case NODE_DMETHOD: - nbody = rb_method_dup(fbody->nd_cval, nklass, (VALUE)ruby_cref); - fbody = NEW_DMETHOD(nbody); - break; - } + 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(RCLASS(nklass)->m_tbl, mid, (st_data_t)NEW_METHOD(fbody, body->nd_noex)); + st_insert(data->tbl, mid, (st_data_t)NEW_METHOD(fbody, body->nd_noex)); return ST_CONTINUE; } -static VALUE singleton_class_clone_int _((VALUE, VALUE)); - /* :nodoc: */ VALUE rb_mod_init_copy(clone, orig) @@ -86,7 +78,8 @@ { rb_obj_init_copy(clone, orig); if (!FL_TEST(CLASS_OF(clone), FL_SINGLETON)) { - RBASIC(clone)->klass = singleton_class_clone_int(orig, clone); + 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) { @@ -99,8 +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, clone); + 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; @@ -120,9 +117,9 @@ return rb_mod_init_copy(clone, orig); } -static VALUE -singleton_class_clone_int(obj, nklass) - VALUE obj, nklass; +VALUE +rb_singleton_class_clone(obj) + VALUE obj; { VALUE klass = RBASIC(obj)->klass; @@ -146,21 +143,28 @@ 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, NIL_P(nklass) ? (VALUE)clone : nklass); + { + 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; } } -VALUE -rb_singleton_class_clone(obj) - VALUE obj; -{ - return singleton_class_clone_int(obj, Qnil); -} - void rb_singleton_class_attached(klass, obj) VALUE klass, obj; Index: ruby_1_8/ChangeLog =================================================================== --- ruby_1_8/ChangeLog (revision 17622) +++ ruby_1_8/ChangeLog (revision 17623) @@ -1,3 +1,7 @@ +Sat Jun 28 18:48:48 2008 URABE Shyouhei <shyouhei@r...> + + * class.c: revert to r15855. + Sat Jun 28 01:08:42 2008 Tanaka Akira <akr@f...> * time.c (time_timeval): fix rounding negative float. Index: ruby_1_8_7/class.c =================================================================== --- ruby_1_8_7/class.c (revision 17622) +++ ruby_1_8_7/class.c (revision 17623) @@ -48,37 +48,29 @@ return rb_class_boot(super); } +struct clone_method_data { + st_table *tbl; + VALUE klass; +}; + static int -clone_method(mid, body, nklass) +clone_method(mid, body, data) ID mid; NODE *body; - VALUE nklass; + struct clone_method_data *data; { NODE *fbody = body->nd_body; - if (fbody) { - VALUE nbody; - - switch (nd_type(fbody)) { - case NODE_SCOPE: - fbody = rb_copy_node_scope(fbody, ruby_cref); - break; - case NODE_BMETHOD: - nbody = rb_block_dup(fbody->nd_cval, nklass, (VALUE)ruby_cref); - fbody = NEW_BMETHOD(nbody); - break; - case NODE_DMETHOD: - nbody = rb_method_dup(fbody->nd_cval, nklass, (VALUE)ruby_cref); - fbody = NEW_DMETHOD(nbody); - break; - } + 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(RCLASS(nklass)->m_tbl, mid, (st_data_t)NEW_METHOD(fbody, body->nd_noex)); + st_insert(data->tbl, mid, (st_data_t)NEW_METHOD(fbody, body->nd_noex)); return ST_CONTINUE; } -static VALUE singleton_class_clone_int _((VALUE, VALUE)); - /* :nodoc: */ VALUE rb_mod_init_copy(clone, orig) @@ -86,7 +78,8 @@ { rb_obj_init_copy(clone, orig); if (!FL_TEST(CLASS_OF(clone), FL_SINGLETON)) { - RBASIC(clone)->klass = singleton_class_clone_int(orig, clone); + 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) { @@ -99,8 +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, clone); + 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; @@ -120,9 +117,9 @@ return rb_mod_init_copy(clone, orig); } -static VALUE -singleton_class_clone_int(obj, nklass) - VALUE obj, nklass; +VALUE +rb_singleton_class_clone(obj) + VALUE obj; { VALUE klass = RBASIC(obj)->klass; @@ -146,21 +143,28 @@ 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, NIL_P(nklass) ? (VALUE)clone : nklass); + { + 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; } } -VALUE -rb_singleton_class_clone(obj) - VALUE obj; -{ - return singleton_class_clone_int(obj, Qnil); -} - void rb_singleton_class_attached(klass, obj) VALUE klass, obj; Index: ruby_1_8_7/ChangeLog =================================================================== --- ruby_1_8_7/ChangeLog (revision 17622) +++ ruby_1_8_7/ChangeLog (revision 17623) @@ -1,3 +1,7 @@ +Sat Jun 28 18:49:50 2008 URABE Shyouhei <shyouhei@r...> + + * class.c: revert to r15855. + Fri Jun 20 18:25:18 2008 Nobuyoshi Nakada <nobu@r...> * string.c (rb_str_buf_append): should infect. -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/