[ruby-trunk - Bug #7575][Open] Struct のメンバーをアクセサで参照できない事がある

Issue #7575 has been reported by tadf (tadayoshi funaba).


Bug #7575: Struct のメンバーをアクセサで参照できない事がある

Author: tadf (tadayoshi funaba)
Status: Open
Priority: Low
Assignee:
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]

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

Issue #7575 has been updated by Glass_saga (Masaki M.).

調べてみましたが、"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

Bug #7575: Struct のメンバーをアクセサで参照できない事がある

Author: tadf (tadayoshi funaba)
Status: Open
Priority: Low
Assignee:
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]

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

$B$^$D$b$H(B $B$f$-$R$m$G$9(B

In message “Re: [ruby-dev:46756] [ruby-trunk - Bug #7575] Struct
$B$N%a%s%P!<$r%”%/%;%5$G;2>H$G$-$J$$;v$,$“$k(B”
on Tue, 18 Dec 2012 11:58:51 +0900, “Glass_saga (Masaki M.)”
[email protected] writes:

|$BD4$Y$F$$^$7$?$,!“(B"b\000”$B$r(Bintern$B$9$k$H(BID_JUNK$B$J(BID$B$K$J$C$F$7$^$&0Y$K!“(Bmake_struct()$B$G(B"b\000”$B$KBP1~$9$k%a%=%C%I$,Dj5A$5$l$J$$$h$&$G$9!#(B
|“b\000”$B$K$O(Bis_identchar()$B$G$J$$J8;z$,4^$^$l$F$$$k$N$G!“(Bintern$B$9$k$H(Bjunk$B$G$”$k$HH=Dj$5$l$^$9!#(B
|$B=>$C$F!"(Bintern$B$9$k$H(Bjunk$B$J(BID$B$H$J$k$h$&$JL>A0$N%a%s%P$NB8:
$r5v$9$+$I$&$+$H$$$&LdBj$@$H;W$o$l$^$9!#(B

$B5v$7$?$[$&$,NI$$$H;W$&$N$G$9$,!“$J$K$+LdBj$,$”$j$^$7$?$G$7$g$&$+!#(B

|$B$A$J$_$K(Bdefine_method$B$G$O!"(Bjunk$B$JL>A0$N%a%=%C%I$NDj5A$r5v$7$F$$$k$h$&$G$9!#(B

define_method$B$,$G$-$F$$$k$J$iD>@\E*$JLdBj$O$J$$$N$+$J!#(B

Issue #7575 has been updated by Glass_saga (Masaki M.).

File patch.diff added
Assignee set to Glass_saga (Masaki M.)

2012年12月18日 12:57 Yukihiro M. [email protected]:

許したほうが良いと思うのですが、なにか問題がありましたでしょうか。

define_methodができているなら直接的な問題はないのかな。

define_methodでのメソッド定義は本当に何でもありなようですが、それで問題が起こっていないのなら大丈夫そうですね。
make_struct()からidのチェックを外したpatchを添付します。
反対がなければコミットしようと思います。

Bug #7575: Struct のメンバーをアクセサで参照できない事がある

Author: tadf (tadayoshi funaba)
Status: Open
Priority: Low
Assignee: Glass_saga (Masaki M.)
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]

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