зеркало из https://github.com/github/ruby.git
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:
Родитель
b52a501ca7
Коммит
971857c332
|
@ -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;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче