mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* lib/yaml.rb (quick_emit): use combination of object_id and hash to
identify repeated object references, since GC will reuse memory of objects during output of YAML. [ruby-Bugs-8548] [ruby-Bugs-3698] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13940 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									808becf9e0
								
							
						
					
					
						commit
						2fb73a8b0a
					
				
					 4 changed files with 27 additions and 9 deletions
				
			
		| 
						 | 
				
			
			@ -1,3 +1,9 @@
 | 
			
		|||
Fri Nov 16 02:51:59 2007  why the lucky stiff  <why@ruby-lang.org>
 | 
			
		||||
 | 
			
		||||
	* lib/yaml.rb (quick_emit): use combination of object_id and hash to
 | 
			
		||||
	  identify repeated object references, since GC will reuse memory of
 | 
			
		||||
		objects during output of YAML. [ruby-Bugs-8548] [ruby-Bugs-3698]
 | 
			
		||||
 | 
			
		||||
Thu Nov 15 19:49:03 2007  NAKAMURA Usaku  <usa@ruby-lang.org>
 | 
			
		||||
 | 
			
		||||
	* ext/curses/extconf.rb: check macro if cannot find func.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -384,6 +384,10 @@ module YAML
 | 
			
		|||
            else
 | 
			
		||||
                emitter.reset( opts )
 | 
			
		||||
            end
 | 
			
		||||
        oid =
 | 
			
		||||
            case oid when Fixnum, NilClass; oid
 | 
			
		||||
            else oid = "#{oid.object_id}-#{oid.hash}"
 | 
			
		||||
            end
 | 
			
		||||
        out.emit( oid, &e )
 | 
			
		||||
	end
 | 
			
		||||
	
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,7 +12,7 @@ class Object
 | 
			
		|||
    def to_yaml_style; end
 | 
			
		||||
    def to_yaml_properties; instance_variables.sort; end
 | 
			
		||||
	def to_yaml( opts = {} )
 | 
			
		||||
		YAML::quick_emit( object_id, opts ) do |out|
 | 
			
		||||
		YAML::quick_emit( self, opts ) do |out|
 | 
			
		||||
            out.map( taguri, to_yaml_style ) do |map|
 | 
			
		||||
				to_yaml_properties.each do |m|
 | 
			
		||||
                    map.add( m[1..-1], instance_variable_get( m ) )
 | 
			
		||||
| 
						 | 
				
			
			@ -35,7 +35,7 @@ class Hash
 | 
			
		|||
        end
 | 
			
		||||
    end
 | 
			
		||||
	def to_yaml( opts = {} )
 | 
			
		||||
		YAML::quick_emit( object_id, opts ) do |out|
 | 
			
		||||
		YAML::quick_emit( self, opts ) do |out|
 | 
			
		||||
            out.map( taguri, to_yaml_style ) do |map|
 | 
			
		||||
                each do |k, v|
 | 
			
		||||
                    map.add( k, v )
 | 
			
		||||
| 
						 | 
				
			
			@ -83,7 +83,7 @@ class Struct
 | 
			
		|||
        end
 | 
			
		||||
    end
 | 
			
		||||
	def to_yaml( opts = {} )
 | 
			
		||||
		YAML::quick_emit( object_id, opts ) do |out|
 | 
			
		||||
		YAML::quick_emit( self, opts ) do |out|
 | 
			
		||||
			#
 | 
			
		||||
			# Basic struct is passed as a YAML map
 | 
			
		||||
			#
 | 
			
		||||
| 
						 | 
				
			
			@ -104,7 +104,7 @@ class Array
 | 
			
		|||
    yaml_as "tag:yaml.org,2002:seq"
 | 
			
		||||
    def yaml_initialize( tag, val ); concat( val.to_a ); end
 | 
			
		||||
	def to_yaml( opts = {} )
 | 
			
		||||
		YAML::quick_emit( object_id, opts ) do |out|
 | 
			
		||||
		YAML::quick_emit( self, opts ) do |out|
 | 
			
		||||
            out.seq( taguri, to_yaml_style ) do |seq|
 | 
			
		||||
                each do |x|
 | 
			
		||||
                    seq.add( x )
 | 
			
		||||
| 
						 | 
				
			
			@ -124,7 +124,7 @@ class Exception
 | 
			
		|||
        o
 | 
			
		||||
    end
 | 
			
		||||
	def to_yaml( opts = {} )
 | 
			
		||||
		YAML::quick_emit( object_id, opts ) do |out|
 | 
			
		||||
		YAML::quick_emit( self, opts ) do |out|
 | 
			
		||||
            out.map( taguri, to_yaml_style ) do |map|
 | 
			
		||||
                map.add( 'message', message )
 | 
			
		||||
				to_yaml_properties.each do |m|
 | 
			
		||||
| 
						 | 
				
			
			@ -161,7 +161,7 @@ class String
 | 
			
		|||
        end
 | 
			
		||||
    end
 | 
			
		||||
	def to_yaml( opts = {} )
 | 
			
		||||
		YAML::quick_emit( is_complex_yaml? ? object_id : nil, opts ) do |out|
 | 
			
		||||
		YAML::quick_emit( is_complex_yaml? ? self : nil, opts ) do |out|
 | 
			
		||||
            if is_binary_data?
 | 
			
		||||
                out.scalar( "tag:yaml.org,2002:binary", [self].pack("m"), :literal )
 | 
			
		||||
            elsif to_yaml_properties.empty?
 | 
			
		||||
| 
						 | 
				
			
			@ -227,7 +227,7 @@ class Range
 | 
			
		|||
        end
 | 
			
		||||
    end
 | 
			
		||||
	def to_yaml( opts = {} )
 | 
			
		||||
		YAML::quick_emit( object_id, opts ) do |out|
 | 
			
		||||
		YAML::quick_emit( self, opts ) do |out|
 | 
			
		||||
            # if self.begin.is_complex_yaml? or self.begin.respond_to? :to_str or
 | 
			
		||||
            #   self.end.is_complex_yaml? or self.end.respond_to? :to_str or
 | 
			
		||||
            #   not to_yaml_properties.empty?
 | 
			
		||||
| 
						 | 
				
			
			@ -310,7 +310,7 @@ class Time
 | 
			
		|||
        end
 | 
			
		||||
    end
 | 
			
		||||
	def to_yaml( opts = {} )
 | 
			
		||||
		YAML::quick_emit( object_id, opts ) do |out|
 | 
			
		||||
		YAML::quick_emit( self, opts ) do |out|
 | 
			
		||||
            tz = "Z"
 | 
			
		||||
            # from the tidy Tobias Peters <t-peters@gmx.de> Thanks!
 | 
			
		||||
            unless self.utc?
 | 
			
		||||
| 
						 | 
				
			
			@ -347,7 +347,7 @@ end
 | 
			
		|||
class Date
 | 
			
		||||
    yaml_as "tag:yaml.org,2002:timestamp#ymd"
 | 
			
		||||
	def to_yaml( opts = {} )
 | 
			
		||||
		YAML::quick_emit( object_id, opts ) do |out|
 | 
			
		||||
		YAML::quick_emit( self, opts ) do |out|
 | 
			
		||||
            out.scalar( "tag:yaml.org,2002:timestamp", self.to_s, :plain )
 | 
			
		||||
        end
 | 
			
		||||
	end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1272,6 +1272,14 @@ EOY
 | 
			
		|||
      assert_equal([{}], o.keys)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    #
 | 
			
		||||
    # contributed by riley lynch [ruby-Bugs-8548]
 | 
			
		||||
    #
 | 
			
		||||
    def test_object_id_collision
 | 
			
		||||
      omap = YAML::Omap.new
 | 
			
		||||
      1000.times { |i| omap["key_#{i}"] = { "value" => i } }
 | 
			
		||||
      raise "id collision in ordered map" if omap.to_yaml =~ /id\d+/
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
if $0 == __FILE__
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue