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

ruby-changes:32997

From: nobu <ko1@a...>
Date: Fri, 21 Feb 2014 20:42:10 +0900 (JST)
Subject: [ruby-changes:32997] nobu:r45076 (trunk): class.c: do nothing if copying self

nobu	2014-02-21 20:42:03 +0900 (Fri, 21 Feb 2014)

  New Revision: 45076

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

  Log:
    class.c: do nothing if copying self
    
    * class.c (rb_mod_init_copy): do nothing if copying self.
      [ruby-dev:47989] [Bug #9535]
    * hash.c (rb_hash_initialize_copy): ditto.

  Modified files:
    trunk/ChangeLog
    trunk/class.c
    trunk/ext/bigdecimal/bigdecimal.c
    trunk/ext/json/generator/generator.c
    trunk/ext/zlib/zlib.c
    trunk/hash.c
    trunk/test/ruby/test_hash.rb
    trunk/test/ruby/test_module.rb
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 45075)
+++ ChangeLog	(revision 45076)
@@ -1,3 +1,10 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Fri Feb 21 20:42:01 2014  Nobuyoshi Nakada  <nobu@r...>
+
+	* class.c (rb_mod_init_copy): do nothing if copying self.
+	  [ruby-dev:47989] [Bug #9535]
+
+	* hash.c (rb_hash_initialize_copy): ditto.
+
 Fri Feb 21 16:45:54 2014  Nobuyoshi Nakada  <nobu@r...>
 
 	* lib/logger.rb (next_rotate_time, previous_period_end): consider
Index: class.c
===================================================================
--- class.c	(revision 45075)
+++ class.c	(revision 45076)
@@ -321,7 +321,7 @@ rb_mod_init_copy(VALUE clone, VALUE orig https://github.com/ruby/ruby/blob/trunk/class.c#L321
     if (RB_TYPE_P(clone, T_CLASS)) {
 	class_init_copy_check(clone, orig);
     }
-    rb_obj_init_copy(clone, orig);
+    if (!OBJ_INIT_COPY(clone, orig)) return clone;
     if (!FL_TEST(CLASS_OF(clone), FL_SINGLETON)) {
 	RBASIC_SET_CLASS(clone, rb_singleton_class_clone(orig));
 	rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);
Index: ext/bigdecimal/bigdecimal.c
===================================================================
--- ext/bigdecimal/bigdecimal.c	(revision 45075)
+++ ext/bigdecimal/bigdecimal.c	(revision 45076)
@@ -2494,7 +2494,9 @@ BigDecimal_initialize_copy(VALUE self, V https://github.com/ruby/ruby/blob/trunk/ext/bigdecimal/bigdecimal.c#L2494
     Real *pv = rb_check_typeddata(self, &BigDecimal_data_type);
     Real *x = rb_check_typeddata(other, &BigDecimal_data_type);
 
-    DATA_PTR(self) = VpCopy(pv, x);
+    if (self != other) {
+	DATA_PTR(self) = VpCopy(pv, x);
+    }
     return self;
 }
 
Index: ext/zlib/zlib.c
===================================================================
--- ext/zlib/zlib.c	(revision 45075)
+++ ext/zlib/zlib.c	(revision 45076)
@@ -1563,6 +1563,7 @@ rb_deflate_init_copy(VALUE self, VALUE o https://github.com/ruby/ruby/blob/trunk/ext/zlib/zlib.c#L1563
     Data_Get_Struct(self, struct zstream, z1);
     z2 = get_zstream(orig);
 
+    if (z1 == z2) return self;
     err = deflateCopy(&z1->stream, &z2->stream);
     if (err != Z_OK) {
 	raise_zlib_error(err, 0);
Index: ext/json/generator/generator.c
===================================================================
--- ext/json/generator/generator.c	(revision 45075)
+++ ext/json/generator/generator.c	(revision 45076)
@@ -965,6 +965,7 @@ static VALUE cState_init_copy(VALUE obj, https://github.com/ruby/ruby/blob/trunk/ext/json/generator/generator.c#L965
 {
     JSON_Generator_State *objState, *origState;
 
+    if (obj == orig) return obj;
     Data_Get_Struct(obj, JSON_Generator_State, objState);
     Data_Get_Struct(orig, JSON_Generator_State, origState);
     if (!objState) rb_raise(rb_eArgError, "unallocated JSON::State");
Index: hash.c
===================================================================
--- hash.c	(revision 45075)
+++ hash.c	(revision 45076)
@@ -1403,6 +1403,8 @@ rb_hash_initialize_copy(VALUE hash, VALU https://github.com/ruby/ruby/blob/trunk/hash.c#L1403
 
     Check_Type(hash2, T_HASH);
 
+    if (hash == hash2) return hash;
+
     ntbl = RHASH(hash)->ntbl;
     if (RHASH(hash2)->ntbl) {
 	if (ntbl) st_free_table(ntbl);
Index: test/ruby/test_module.rb
===================================================================
--- test/ruby/test_module.rb	(revision 45075)
+++ test/ruby/test_module.rb	(revision 45076)
@@ -364,6 +364,17 @@ class TestModule < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_module.rb#L364
     assert_equal([:MIXIN, :USER], User.constants.sort)
   end
 
+  def test_self_initialize_copy
+    bug9535 = '[ruby-dev:47989] [Bug #9535]'
+    m = Module.new do
+      def foo
+        :ok
+      end
+      initialize_copy(self)
+    end
+    assert_equal(:ok, Object.new.extend(m).foo, bug9535)
+  end
+
   def test_dup
     bug6454 = '[ruby-core:45132]'
 
Index: test/ruby/test_hash.rb
===================================================================
--- test/ruby/test_hash.rb	(revision 45075)
+++ test/ruby/test_hash.rb	(revision 45076)
@@ -108,6 +108,12 @@ class TestHash < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_hash.rb#L108
     assert_empty(h)
   end
 
+  def test_self_initialize_copy
+    h = @cls[1=>2]
+    h.instance_eval {initialize_copy(h)}
+    assert_equal(2, h[1])
+  end
+
   def test_dup_will_rehash
     set1 = @cls[]
     set2 = @cls[set1 => true]

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

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