diff --git a/ext/objspace/objspace_dump.c b/ext/objspace/objspace_dump.c index d5996f67a8..f7b9b0b26c 100644 --- a/ext/objspace/objspace_dump.c +++ b/ext/objspace/objspace_dump.c @@ -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); } diff --git a/test/objspace/test_objspace.rb b/test/objspace/test_objspace.rb index 5073bbee06..42fbc3e03c 100644 --- a/test/objspace/test_objspace.rb +++ b/test/objspace/test_objspace.rb @@ -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;