mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45076 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									5258f67d17
								
							
						
					
					
						commit
						1f29e8e2ba
					
				
					 8 changed files with 32 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -1,3 +1,10 @@
 | 
			
		|||
Fri Feb 21 20:42:01 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 | 
			
		||||
 | 
			
		||||
	* 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@ruby-lang.org>
 | 
			
		||||
 | 
			
		||||
	* lib/logger.rb (next_rotate_time, previous_period_end): consider
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								class.c
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								class.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -321,7 +321,7 @@ rb_mod_init_copy(VALUE clone, VALUE orig)
 | 
			
		|||
    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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2494,7 +2494,9 @@ BigDecimal_initialize_copy(VALUE self, VALUE other)
 | 
			
		|||
    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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -965,6 +965,7 @@ static VALUE cState_init_copy(VALUE obj, VALUE orig)
 | 
			
		|||
{
 | 
			
		||||
    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");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1563,6 +1563,7 @@ rb_deflate_init_copy(VALUE self, VALUE orig)
 | 
			
		|||
    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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								hash.c
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								hash.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1403,6 +1403,8 @@ rb_hash_initialize_copy(VALUE hash, VALUE hash2)
 | 
			
		|||
 | 
			
		||||
    Check_Type(hash2, T_HASH);
 | 
			
		||||
 | 
			
		||||
    if (hash == hash2) return hash;
 | 
			
		||||
 | 
			
		||||
    ntbl = RHASH(hash)->ntbl;
 | 
			
		||||
    if (RHASH(hash2)->ntbl) {
 | 
			
		||||
	if (ntbl) st_free_table(ntbl);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -108,6 +108,12 @@ class TestHash < Test::Unit::TestCase
 | 
			
		|||
    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]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -364,6 +364,17 @@ class TestModule < Test::Unit::TestCase
 | 
			
		|||
    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]'
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue