summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--test/ruby/test_module.rb4
-rw-r--r--vm_method.c11
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 <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);
}