quote symbols

* sprintf.c (ruby__sfvextra): quote symbols as identifiers.

* string.c (rb_id_quote_unprintable): ditto.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62747 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2018-03-14 02:35:51 +00:00
parent 251c7892c1
commit c05fa459bb
3 changed files with 14 additions and 2 deletions

View File

@ -1378,6 +1378,12 @@ ruby__sfvextra(rb_printf_buffer *fp, size_t valsize, void *valp, long *sz, int s
}
value = rb_inspect(value);
}
else if (SYMBOL_P(value)) {
value = rb_sym2str(value);
if (sign == ' ' && !rb_str_symname_p(value)) {
value = rb_str_inspect(value);
}
}
else {
value = rb_obj_as_string(value);
if (sign == ' ') value = QUOTE(value);

View File

@ -10364,7 +10364,7 @@ rb_str_symname_p(VALUE sym)
ptr = RSTRING_PTR(sym);
len = RSTRING_LEN(sym);
if ((resenc != enc && !rb_str_is_ascii_only_p(sym)) || len != (long)strlen(ptr) ||
!rb_enc_symname_p(ptr, enc) || !sym_printable(ptr, ptr + len, enc)) {
!rb_enc_symname2_p(ptr, len, enc) || !sym_printable(ptr, ptr + len, enc)) {
return FALSE;
}
return TRUE;
@ -10394,7 +10394,11 @@ rb_str_quote_unprintable(VALUE str)
MJIT_FUNC_EXPORTED VALUE
rb_id_quote_unprintable(ID id)
{
return rb_str_quote_unprintable(rb_id2str(id));
VALUE str = rb_id2str(id);
if (!rb_str_symname_p(str)) {
return rb_str_inspect(str);
}
return str;
}
/*

View File

@ -24,6 +24,8 @@ class Test_SPrintf < Test::Unit::TestCase
assert_equal('["\n"]', Bug::Printf.q("\n"))
assert_equal('[aaa]', Bug::Printf.q('aaa'))
assert_equal('[a a]', Bug::Printf.q('a a'))
assert_equal('[]', Bug::Printf.q(''))
assert_equal('[""]', Bug::Printf.q(:''))
end
def test_encoding