From e70f74c3d287e2f8cb3aed80ffaaad0902a3af2c Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 9 Oct 2013 09:03:07 +0000 Subject: [PATCH] vm_method.c: preserve encoding * vm_method.c (rb_attr): preserve encoding of the attribute ID in error message. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43215 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ test/ruby/test_module.rb | 4 +++- vm_method.c | 11 ++++------- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 25382d68bf..be3a8c0ee7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Wed Oct 9 18:03:01 2013 Nobuyoshi Nakada + + * vm_method.c (rb_attr): preserve encoding of the attribute ID in + error message. + Wed Oct 9 17:40:16 2013 Nobuyoshi Nakada * string.c (rb_fstring): because of lazy sweep, str may be unmaked diff --git a/test/ruby/test_module.rb b/test/ruby/test_module.rb index 9ad2f39fa9..2847e9b5df 100644 --- a/test/ruby/test_module.rb +++ b/test/ruby/test_module.rb @@ -247,6 +247,7 @@ class TestModule < Test::Unit::TestCase "", ":", ["String::", "[Bug #7573]"], + "\u{3042}", ].each do |name, msg| expected = "wrong constant name %s" % name msg = "#{msg}#{': ' if msg}wrong constant name #{name.dump}" @@ -1653,11 +1654,12 @@ class TestModule < Test::Unit::TestCase end def test_invalid_attr - %w[ + %W[ foo? @foo @@foo $foo + \u{3042}$ ].each do |name| assert_raise_with_message(NameError, /#{Regexp.quote(name)}/) do Module.new { attr_accessor name.to_sym } diff --git a/vm_method.c b/vm_method.c index da1a94c70a..584982d51d 100644 --- a/vm_method.c +++ b/vm_method.c @@ -812,7 +812,6 @@ rb_method_boundp(VALUE klass, ID id, int ex) void rb_attr(VALUE klass, ID id, int read, int write, int ex) { - const char *name; ID attriv; VALUE aname; rb_method_flag_t noex; @@ -836,15 +835,13 @@ rb_attr(VALUE klass, ID id, int read, int write, int ex) } if (!rb_is_local_id(id) && !rb_is_const_id(id)) { - rb_name_error(id, "invalid attribute name `%s'", rb_id2name(id)); + rb_name_error_str(id, "invalid attribute name `%"PRIsVALUE"'", QUOTE_ID(id)); } - name = rb_id2name(id); - if (!name) { + aname = rb_id2str(id); + if (NIL_P(aname)) { rb_raise(rb_eArgError, "argument needs to be symbol or string"); } - aname = rb_sprintf("@%s", name); - rb_enc_copy(aname, rb_id2str(id)); - attriv = rb_intern_str(aname); + attriv = rb_intern_str(rb_sprintf("@%"PRIsVALUE, aname)); if (read) { rb_add_method(klass, id, VM_METHOD_TYPE_IVAR, (void *)attriv, noex); }