summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sprintf.c6
-rw-r--r--string.c8
-rw-r--r--test/-ext-/test_printf.rb2
3 files changed, 14 insertions, 2 deletions
diff --git a/sprintf.c b/sprintf.c
index e91d1f7e88..eed2c92282 100644
--- a/sprintf.c
+++ b/sprintf.c
@@ -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);
diff --git a/string.c b/string.c
index ebf5618c88..710c753336 100644
--- a/string.c
+++ b/string.c
@@ -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;
}
/*
diff --git a/test/-ext-/test_printf.rb b/test/-ext-/test_printf.rb
index cd3ba76364..feaeadd975 100644
--- a/test/-ext-/test_printf.rb
+++ b/test/-ext-/test_printf.rb
@@ -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