[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]