Project

General

Profile

Bug #7575

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

Added by tadf (tadayoshi funaba) over 4 years ago. Updated over 4 years ago.

Status:
Closed
Priority:
Normal
Target version:
ruby -v:
ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]
[ruby-dev:46750]

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 (1.35 KB) patch.diff Glass_saga (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`Closed2013-08-09

Associated revisions

Revision 38547
Added by glass over 4 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 over 4 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 over 4 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 over 4 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 [ruby-dev:46756] Updated by Glass_saga (Masaki Matsushita) over 4 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 [ruby-dev:46757] Updated by Anonymous over 4 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 [ruby-dev:46782] Updated by Glass_saga (Masaki Matsushita) over 4 years ago

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

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

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

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

#4 Updated by tarui (Masaya Tarui) over 4 years ago

  • Status changed from Open to Assigned

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

Also available in: Atom PDF