Bug #7575
closedStruct のメンバーをアクセサで参照できない事がある
Description
Struct のメンバーをアクセサで参照できない事がある。
$ ruby -v -e 'Foo = Struct.new("Foo", "a", "b\000"); foo = Foo.new(1,2); p foo.send("a"); p foo.send("b\000")'
ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]
1
-e:1:in <main>': undefined method
b' for #<struct Struct::Foo a=1, :"b\x00"=2> (NoMethodError)
$ ruby -v -r ostruct -e 'foo = OpenStruct.new("a"=>1, "b\000"=>2); p foo.send("a"); p foo.send("b\000")'
ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]
1
2
Files
Updated by Glass_saga (Masaki Matsushita) about 12 years ago
調べてみましたが、"b\000"をinternするとID_JUNKなIDになってしまう為に、make_struct()で"b\000"に対応するメソッドが定義されないようです。
"b\000"にはis_identchar()でない文字が含まれているので、internするとjunkであると判定されます。
従って、internするとjunkなIDとなるような名前のメンバの存在を許すかどうかという問題だと思われます。
ちなみにdefine_methodでは、junkな名前のメソッドの定義を許しているようです。
class Foo
define_method("foo@") { p 1 }
define_method("foo\000") { p 2 }
end
f = Foo.new
f.send("foo@") #=> 1
f.send("foo\000") #=> 2
Updated by Anonymous about 12 years ago
まつもと ゆきひろです
In message "Re: [ruby-dev:46756] [ruby-trunk - Bug #7575] Struct のメンバーをアクセサで参照できない事がある"
on Tue, 18 Dec 2012 11:58:51 +0900, "Glass_saga (Masaki Matsushita)" glass.saga@gmail.com writes:
|調べてみましたが、"b\000"をinternするとID_JUNKなIDになってしまう為に、make_struct()で"b\000"に対応するメソッドが定義されないようです。
|"b\000"にはis_identchar()でない文字が含まれているので、internするとjunkであると判定されます。
|従って、internするとjunkなIDとなるような名前のメンバの存在を許すかどうかという問題だと思われます。
許したほうが良いと思うのですが、なにか問題がありましたでしょうか。
|ちなみにdefine_methodでは、junkな名前のメソッドの定義を許しているようです。
define_methodができているなら直接的な問題はないのかな。
Updated by Glass_saga (Masaki Matsushita) almost 12 years ago
- File patch.diff patch.diff added
- Assignee set to Glass_saga (Masaki Matsushita)
2012年12月18日 12:57 Yukihiro Matsumoto matz@ruby.or.jp:
許したほうが良いと思うのですが、なにか問題がありましたでしょうか。
define_methodができているなら直接的な問題はないのかな。
define_methodでのメソッド定義は本当に何でもありなようですが、それで問題が起こっていないのなら大丈夫そうですね。
make_struct()からidのチェックを外したpatchを添付します。
反対がなければコミットしようと思います。
Updated by tarui (Masaya Tarui) almost 12 years ago
- Status changed from Open to Assigned
Updated by Anonymous almost 12 years ago
- Status changed from Assigned to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r38547.
tadayoshi, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
- struct.c (make_struct): remove junk ID check to allow members who
have junk name like "foo\000". - test/ruby/test_struct.rb: Test for above.
[Bug #7575] [ruby-dev:46750]