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
This commit is contained in:
nobu 2013-10-09 09:03:07 +00:00
Родитель ef46e8d264
Коммит e70f74c3d2
3 изменённых файлов: 12 добавлений и 8 удалений

Просмотреть файл

@ -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> 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 * string.c (rb_fstring): because of lazy sweep, str may be unmaked

Просмотреть файл

@ -247,6 +247,7 @@ class TestModule < Test::Unit::TestCase
"", "",
":", ":",
["String::", "[Bug #7573]"], ["String::", "[Bug #7573]"],
"\u{3042}",
].each do |name, msg| ].each do |name, msg|
expected = "wrong constant name %s" % name expected = "wrong constant name %s" % name
msg = "#{msg}#{': ' if msg}wrong constant name #{name.dump}" msg = "#{msg}#{': ' if msg}wrong constant name #{name.dump}"
@ -1653,11 +1654,12 @@ class TestModule < Test::Unit::TestCase
end end
def test_invalid_attr def test_invalid_attr
%w[ %W[
foo? foo?
@foo @foo
@@foo @@foo
$foo $foo
\u{3042}$
].each do |name| ].each do |name|
assert_raise_with_message(NameError, /#{Regexp.quote(name)}/) do assert_raise_with_message(NameError, /#{Regexp.quote(name)}/) do
Module.new { attr_accessor name.to_sym } Module.new { attr_accessor name.to_sym }

Просмотреть файл

@ -812,7 +812,6 @@ rb_method_boundp(VALUE klass, ID id, int ex)
void void
rb_attr(VALUE klass, ID id, int read, int write, int ex) rb_attr(VALUE klass, ID id, int read, int write, int ex)
{ {
const char *name;
ID attriv; ID attriv;
VALUE aname; VALUE aname;
rb_method_flag_t noex; 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)) { 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); aname = rb_id2str(id);
if (!name) { if (NIL_P(aname)) {
rb_raise(rb_eArgError, "argument needs to be symbol or string"); rb_raise(rb_eArgError, "argument needs to be symbol or string");
} }
aname = rb_sprintf("@%s", name); attriv = rb_intern_str(rb_sprintf("@%"PRIsVALUE, aname));
rb_enc_copy(aname, rb_id2str(id));
attriv = rb_intern_str(aname);
if (read) { if (read) {
rb_add_method(klass, id, VM_METHOD_TYPE_IVAR, (void *)attriv, noex); rb_add_method(klass, id, VM_METHOD_TYPE_IVAR, (void *)attriv, noex);
} }