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

ruby-changes:34420

From: nobu <ko1@a...>
Date: Mon, 23 Jun 2014 11:33:21 +0900 (JST)
Subject: [ruby-changes:34420] nobu:r46501 (trunk): object.c: rb_obj_copy_ivar

nobu	2014-06-23 11:33:15 +0900 (Mon, 23 Jun 2014)

  New Revision: 46501

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=46501

  Log:
    object.c: rb_obj_copy_ivar
    
    * object.c (rb_obj_copy_ivar): extract function to copy instance
      variables only for T_OBJECT from init_copy.

  Modified files:
    trunk/ChangeLog
    trunk/internal.h
    trunk/object.c
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 46500)
+++ ChangeLog	(revision 46501)
@@ -1,3 +1,8 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Mon Jun 23 11:32:59 2014  Nobuyoshi Nakada  <nobu@r...>
+
+	* object.c (rb_obj_copy_ivar): extract function to copy instance
+	  variables only for T_OBJECT from init_copy.
+
 Mon Jun 23 11:11:16 2014  Nobuyoshi Nakada  <nobu@r...>
 
 	* signal.c (check_stack_overflow): drop the last tag too close to
Index: object.c
===================================================================
--- object.c	(revision 46500)
+++ object.c	(revision 46501)
@@ -255,6 +255,30 @@ rb_obj_singleton_class(VALUE obj) https://github.com/ruby/ruby/blob/trunk/object.c#L255
     return rb_singleton_class(obj);
 }
 
+void
+rb_obj_copy_ivar(VALUE dest, VALUE obj)
+{
+    if (!(RBASIC(dest)->flags & ROBJECT_EMBED) && ROBJECT_IVPTR(dest)) {
+	xfree(ROBJECT_IVPTR(dest));
+	ROBJECT(dest)->as.heap.ivptr = 0;
+	ROBJECT(dest)->as.heap.numiv = 0;
+	ROBJECT(dest)->as.heap.iv_index_tbl = 0;
+    }
+    if (RBASIC(obj)->flags & ROBJECT_EMBED) {
+	MEMCPY(ROBJECT(dest)->as.ary, ROBJECT(obj)->as.ary, VALUE, ROBJECT_EMBED_LEN_MAX);
+	RBASIC(dest)->flags |= ROBJECT_EMBED;
+    }
+    else {
+	long len = ROBJECT(obj)->as.heap.numiv;
+	VALUE *ptr = ALLOC_N(VALUE, len);
+	MEMCPY(ptr, ROBJECT(obj)->as.heap.ivptr, VALUE, len);
+	ROBJECT(dest)->as.heap.ivptr = ptr;
+	ROBJECT(dest)->as.heap.numiv = len;
+	ROBJECT(dest)->as.heap.iv_index_tbl = ROBJECT(obj)->as.heap.iv_index_tbl;
+	RBASIC(dest)->flags &= ~ROBJECT_EMBED;
+    }
+}
+
 static void
 init_copy(VALUE dest, VALUE obj)
 {
@@ -266,25 +290,7 @@ init_copy(VALUE dest, VALUE obj) https://github.com/ruby/ruby/blob/trunk/object.c#L290
     rb_copy_generic_ivar(dest, obj);
     rb_gc_copy_finalizer(dest, obj);
     if (RB_TYPE_P(obj, T_OBJECT)) {
-        if (!(RBASIC(dest)->flags & ROBJECT_EMBED) && ROBJECT_IVPTR(dest)) {
-            xfree(ROBJECT_IVPTR(dest));
-            ROBJECT(dest)->as.heap.ivptr = 0;
-            ROBJECT(dest)->as.heap.numiv = 0;
-            ROBJECT(dest)->as.heap.iv_index_tbl = 0;
-        }
-        if (RBASIC(obj)->flags & ROBJECT_EMBED) {
-            MEMCPY(ROBJECT(dest)->as.ary, ROBJECT(obj)->as.ary, VALUE, ROBJECT_EMBED_LEN_MAX);
-            RBASIC(dest)->flags |= ROBJECT_EMBED;
-        }
-        else {
-            long len = ROBJECT(obj)->as.heap.numiv;
-            VALUE *ptr = ALLOC_N(VALUE, len);
-            MEMCPY(ptr, ROBJECT(obj)->as.heap.ivptr, VALUE, len);
-            ROBJECT(dest)->as.heap.ivptr = ptr;
-            ROBJECT(dest)->as.heap.numiv = len;
-            ROBJECT(dest)->as.heap.iv_index_tbl = ROBJECT(obj)->as.heap.iv_index_tbl;
-            RBASIC(dest)->flags &= ~ROBJECT_EMBED;
-        }
+	rb_obj_copy_ivar(dest, obj);
     }
 }
 
Index: internal.h
===================================================================
--- internal.h	(revision 46500)
+++ internal.h	(revision 46501)
@@ -733,6 +733,7 @@ rb_float_new_inline(double d) https://github.com/ruby/ruby/blob/trunk/internal.h#L733
 #define rb_float_new(d)   rb_float_new_inline(d)
 
 /* object.c */
+void rb_obj_copy_ivar(VALUE dest, VALUE obj);
 VALUE rb_obj_equal(VALUE obj1, VALUE obj2);
 VALUE rb_class_search_ancestor(VALUE klass, VALUE super);
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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