mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	Fix method name escaping in ObjectSpace.dump
It's possible to define methods with any name, even if the parser doesn't support it and it can only be used with ex. send. This fixes an issue where invalid JSON was output from ObjectSpace.dump when a method name needed escaping.
This commit is contained in:
		
							parent
							
								
									b52a501ca7
								
							
						
					
					
						commit
						971857c332
					
				
				
				Notes:
				
					git
				
				2020-08-18 01:48:26 +09:00 
				
			
			
			
		
		
					 2 changed files with 20 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -313,7 +313,8 @@ dump_object(VALUE obj, struct dump_config *dc)
 | 
			
		|||
	dump_append(dc, ", \"file\":\"%s\", \"line\":%lu", ainfo->path, ainfo->line);
 | 
			
		||||
	if (RTEST(ainfo->mid)) {
 | 
			
		||||
	    VALUE m = rb_sym2str(ainfo->mid);
 | 
			
		||||
	    dump_append(dc, ", \"method\":\"%s\"", RSTRING_PTR(m));
 | 
			
		||||
	    dump_append(dc, ", \"method\":");
 | 
			
		||||
	    dump_append_string_value(dc, m);
 | 
			
		||||
	}
 | 
			
		||||
	dump_append(dc, ", \"generation\":%"PRIuSIZE, ainfo->generation);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -362,6 +362,24 @@ class TestObjSpace < Test::Unit::TestCase
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_dump_escapes_method_name
 | 
			
		||||
    method_name = "foo\"bar"
 | 
			
		||||
    klass = Class.new do
 | 
			
		||||
      define_method(method_name) { "TEST STRING" }
 | 
			
		||||
    end
 | 
			
		||||
    ObjectSpace.trace_object_allocations_start
 | 
			
		||||
 | 
			
		||||
    obj = klass.new.send(method_name)
 | 
			
		||||
 | 
			
		||||
    dump = ObjectSpace.dump(obj)
 | 
			
		||||
    assert_includes dump, '"method":"foo\"bar"'
 | 
			
		||||
 | 
			
		||||
    parsed = JSON.parse(dump)
 | 
			
		||||
    assert_equal "foo\"bar", parsed["method"]
 | 
			
		||||
  ensure
 | 
			
		||||
    ObjectSpace.trace_object_allocations_stop
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_dump_reference_addresses_match_dump_all_addresses
 | 
			
		||||
    assert_in_out_err(%w[-robjspace], "#{<<-"begin;"}\n#{<<-'end;'}") do |output, error|
 | 
			
		||||
      begin;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue