From c53464c7e96c1455d1ed957766d6b8d206442d76 Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 7 Jul 2015 03:49:14 +0000 Subject: symbol.c: preserve encoding * symbol.c (rb_check_id, rb_check_symbol): preserve encoding of the given name. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51175 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- symbol.c | 10 ++++------ test/-ext-/symbol/test_type.rb | 14 ++++++++++++++ test/ruby/test_method.rb | 11 +++++++++++ 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/symbol.c b/symbol.c index 63064d3b5f..9fbe3dda74 100644 --- a/symbol.c +++ b/symbol.c @@ -963,9 +963,8 @@ rb_check_id(volatile VALUE *namep) else if (!RB_TYPE_P(name, T_STRING)) { tmp = rb_check_string_type(name); if (NIL_P(tmp)) { - tmp = rb_inspect(name); - rb_raise(rb_eTypeError, "%s is not a symbol nor a string", - RSTRING_PTR(tmp)); + rb_raise(rb_eTypeError, "%+"PRIsVALUE" is not a symbol nor a string", + name); } name = tmp; *namep = name; @@ -996,9 +995,8 @@ rb_check_symbol(volatile VALUE *namep) else if (!RB_TYPE_P(name, T_STRING)) { tmp = rb_check_string_type(name); if (NIL_P(tmp)) { - tmp = rb_inspect(name); - rb_raise(rb_eTypeError, "%s is not a symbol nor a string", - RSTRING_PTR(tmp)); + rb_raise(rb_eTypeError, "%+"PRIsVALUE" is not a symbol nor a string", + name); } name = tmp; *namep = name; diff --git a/test/-ext-/symbol/test_type.rb b/test/-ext-/symbol/test_type.rb index f1749f55da..3c21e61a18 100644 --- a/test/-ext-/symbol/test_type.rb +++ b/test/-ext-/symbol/test_type.rb @@ -120,5 +120,19 @@ module Test_Symbol assert_symtype(Bug::Symbol.attrset("foo!="), :attrset?) assert_equal(:"foo!=", Bug::Symbol.attrset(:foo!)) end + + def test_check_id_invalid_type + cx = EnvUtil.labeled_class("X\u{1f431}") + assert_raise_with_message(TypeError, /X\u{1F431}/) { + Bug::Symbol.pinneddown?(cx) + } + end + + def test_check_symbol_invalid_type + cx = EnvUtil.labeled_class("X\u{1f431}") + assert_raise_with_message(TypeError, /X\u{1F431}/) { + Bug::Symbol.find(cx) + } + end end end diff --git a/test/ruby/test_method.rb b/test/ruby/test_method.rb index 71d3b30dbf..ac92729f0a 100644 --- a/test/ruby/test_method.rb +++ b/test/ruby/test_method.rb @@ -251,6 +251,13 @@ class TestMethod < Test::Unit::TestCase m = o.method(:bar).unbind assert_raise(TypeError) { m.bind(Object.new) } + cx = EnvUtil.labeled_class("X\u{1f431}") + assert_raise_with_message(TypeError, /X\u{1f431}/) { + o.method(cx) + } + end + + def test_bind_module_instance_method feature4254 = '[ruby-core:34267]' m = M.instance_method(:meth) assert_equal(:meth, m.bind(Object.new).call, feature4254) @@ -276,6 +283,10 @@ class TestMethod < Test::Unit::TestCase assert_raise(TypeError) do Class.new.class_eval { define_method(:bar, o.method(:bar)) } end + cx = EnvUtil.labeled_class("X\u{1f431}") + assert_raise_with_message(TypeError, /X\u{1F431}/) { + Class.new {define_method(cx) {}} + } end def test_define_method_no_proc -- cgit v1.2.3