Project

General

Profile

Actions

Bug #7575

closed

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

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

Status:
Closed
Priority:
Normal
Target version:
ruby -v:
ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]
Backport:
[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 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

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

Related issues 1 (0 open1 closed)

Related to Ruby master - Bug #8756: SEGFAULT caused by `p Struct.new(:q?).instance_methods`ClosedGlass_saga (Masaki Matsushita)08/09/2013Actions

Updated by Glass_saga (Masaki Matsushita) over 9 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 over 9 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)" 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) over 9 years ago

2012年12月18日 12:57 Yukihiro Matsumoto :

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

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

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

Actions #4

Updated by tarui (Masaya Tarui) over 9 years ago

  • Status changed from Open to Assigned
Actions #5

Updated by Anonymous over 9 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]
Actions

Also available in: Atom PDF