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:
John Hawthorn 2020-07-09 14:59:59 -07:00 коммит произвёл Aaron Patterson
Родитель b52a501ca7
Коммит 971857c332
2 изменённых файлов: 20 добавлений и 1 удалений

Просмотреть файл

@ -313,7 +313,8 @@ dump_object(VALUE obj, struct dump_config *dc)
dump_append(dc, ", \"file\":\"%s\", \"line\":%lu", ainfo->path, ainfo->line); dump_append(dc, ", \"file\":\"%s\", \"line\":%lu", ainfo->path, ainfo->line);
if (RTEST(ainfo->mid)) { if (RTEST(ainfo->mid)) {
VALUE m = rb_sym2str(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); dump_append(dc, ", \"generation\":%"PRIuSIZE, ainfo->generation);
} }

Просмотреть файл

@ -362,6 +362,24 @@ class TestObjSpace < Test::Unit::TestCase
end end
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 def test_dump_reference_addresses_match_dump_all_addresses
assert_in_out_err(%w[-robjspace], "#{<<-"begin;"}\n#{<<-'end;'}") do |output, error| assert_in_out_err(%w[-robjspace], "#{<<-"begin;"}\n#{<<-'end;'}") do |output, error|
begin; begin;