Bug #7575

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

Added by tadayoshi funaba about 2 years ago. Updated about 2 years ago.

[ruby-dev:46750]
Status:Closed
Priority:Low
Assignee:Masaki Matsushita
ruby -v:ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux] Backport:

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 methodb' for # (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

patch.diff Magnifier (1.35 KB) Masaki Matsushita, 12/20/2012 10:33 PM


Related issues

Related to Ruby trunk - Bug #8756: SEGFAULT caused by `p Struct.new(:q?).instance_methods` Closed 08/09/2013

Associated revisions

Revision 38547
Added by glass about 2 years ago

  • 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]

Revision 38547
Added by glass about 2 years ago

  • 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]

History

#1 Updated by Masaki Matsushita about 2 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

#2 Updated by Anonymous about 2 years ago

まつもと ゆきひろです

In message "Re: [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ができているなら直接的な問題はないのかな。

#3 Updated by Masaki Matsushita about 2 years ago

  • File patch.diffMagnifier added
  • Assignee set to Masaki Matsushita

2012年12月18日 12:57 Yukihiro Matsumoto matz@ruby.or.jp:

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

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

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

#4 Updated by Masaya Tarui about 2 years ago

  • Status changed from Open to Assigned

#5 Updated by Anonymous about 2 years ago

  • % Done changed from 0 to 100
  • Status changed from Assigned to Closed

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]

Also available in: Atom PDF