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
@ -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…
x
Reference in New Issue
Block a user