diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | test/ruby/test_module.rb | 4 | ||||
-rw-r--r-- | vm_method.c | 11 |
3 files changed, 12 insertions, 8 deletions
@@ -1,3 +1,8 @@ +Wed Oct 9 18:03:01 2013 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * vm_method.c (rb_attr): preserve encoding of the attribute ID in + error message. + Wed Oct 9 17:40:16 2013 Nobuyoshi Nakada <nobu@ruby-lang.org> * 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); } |