Bug #7575

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

Added by tadayoshi funaba over 1 year ago. Updated over 1 year ago.

[ruby-dev:46750]
Status:Closed
Priority:Low
Assignee:Masaki Matsushita
Category:core
Target version:2.0.0
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 over 1 year 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 over 1 year ago

調べてみましたが、"b\000"をinternするとIDJUNKなIDになってしまう為に、makestruct()で"b\000"に対応するメソッドが定義されないようです。
"b\000"にはis_identchar()でない文字が含まれているので、internするとjunkであると判定されます。
従って、internするとjunkなIDとなるような名前のメンバの存在を許すかどうかという問題だと思われます。

ちなみにdefine_methodでは、junkな名前のメソッドの定義を許しているようです。

class Foo
definemethod("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 over 1 year 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するとIDJUNKなIDになってしまう為に、makestruct()で"b\000"に対応するメソッドが定義されないようです。
|"b\000"にはis_identchar()でない文字が含まれているので、internするとjunkであると判定されます。
|従って、internするとjunkなIDとなるような名前のメンバの存在を許すかどうかという問題だと思われます。

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

|ちなみにdefine_methodでは、junkな名前のメソッドの定義を許しているようです。

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

#3 Updated by Masaki Matsushita over 1 year ago

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

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

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

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

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

#4 Updated by Masaya Tarui over 1 year ago

  • Status changed from Open to Assigned

#5 Updated by Anonymous over 1 year 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]

Also available in: Atom PDF