Bug #2995

TestHash#test_recursive_check fails

Added by shugo (Shugo Maeda) about 2 years ago. Updated about 1 year ago.

[ruby-dev:40735]
Status:Closed Start date:03/23/2010
Priority:Normal Due date:
Assignee:nobu (Nobuyoshi Nakada) % Done:

100%

Category:core
Target version:1.9.2
ruby -v:ruby 1.9.2dev (2010-03-23 trunk 27020) [i686-linux]

Description

前田です。

以下の変更(r26961)で、TestHash#test_recursive_checkが失敗するようになっている
のですが、この変更は意図的でしょうか。

Wed Mar 17 16:25:53 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

        * hash.c (rb_hash_aset): allow recursive key.  [ruby-core:24648]

[ruby-core:24648]を見ると、

  >> h={}
  => {}
  >> h[:key] = h
  => {:key=>{....}}
  >> h.hash
  ArgumentError: recursive key for hash

のように値に自分自身を含むHashのhashメソッド呼び出しで例外が起こるという話で、

  h[h] = :foo

のようにキーに自分自身を与えるというのとは違う話のように読めます。

また、test_recursive_checkにあるように

  h = {}
  h[h] = :foo

のようなコードを実行しても、h[h]で:fooは取得できません。
r26961はどういう意図の変更なのでしょうか。

Associated revisions

Revision 27062
Added by shugo (Shugo Maeda) about 2 years ago

* test/ruby/test_hash.rb (test_recursive_key): recursive keys are permitted now. [ruby-dev:40735]

History

Updated by nobu (Nobuyoshi Nakada) about 2 years ago

なかだです。

At Tue, 23 Mar 2010 19:15:10 +0900,
Shugo Maeda wrote in [ruby-dev:40735]:
> 以下の変更(r26961)で、TestHash#test_recursive_checkが失敗するようになっている
> のですが、この変更は意図的でしょうか。

一応意図的ですが、検討不足でした。

> また、test_recursive_checkにあるように
> 
>   h = {}
>   h[h] = :foo
> 
> のようなコードを実行しても、h[h]で:fooは取得できません。

rehashすれば取得できるようですが、キーで再帰するHashはreplaceや
updateでも作れるので、エラーにするなら以下のようにするべきでしょ
うか。

> r26961はどういう意図の変更なのでしょうか。

http://twitter.com/lchin/status/10610389214
http://twitter.com/lchin/status/10610640493
あたりです。r24943での変更漏れかと思ったのですが。


diff --git i/hash.c w/hash.c
index 0b863bd..0e4e3dc 100644
--- i/hash.c
+++ w/hash.c
@@ -276,4 +276,7 @@ hash_update(VALUE hash, VALUE key)
 	rb_raise(rb_eRuntimeError, "can't add a new key into hash during iteration");
     }
+    if (hash == key) {
+	rb_raise(rb_eArgError, "recursive key for hash");
+    }
 }



-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

Updated by shugo (Shugo Maeda) about 2 years ago

前田です。

2010年3月24日17:08 Nobuyoshi Nakada <nobu@ruby-lang.org>:
> > 以下の変更(r26961)で、TestHash#test_recursive_checkが失敗するようになっている
> > のですが、この変更は意図的でしょうか。
>
> 一応意図的ですが、検討不足でした。
>
> > また、test_recursive_checkにあるように
> >
> >   h = {}
> >   h[h] = :foo
> >
> > のようなコードを実行しても、h[h]で:fooは取得できません。
>
> rehashすれば取得できるようですが、キーで再帰するHashはreplaceや
> updateでも作れるので、エラーにするなら以下のようにするべきでしょ
> うか。

なるほど、[]=の中でselfとキーが同じオブジェクトだった時は、[]=の内部で
rehashするといいんですかね。

> > r26961はどういう意図の変更なのでしょうか。
>
> http://twitter.com/lchin/status/10610389214
> http://twitter.com/lchin/status/10610640493
> あたりです。r24943での変更漏れかと思ったのですが。

Hashのキーにすると危ないものは他にもあるので、このケースだけエラーに
する必要もないかなと思います。
1.8との互換性という意味でもエラーにしない方がいいかもしれないですね。

とくに異論がなければ、テストの方を修正するということでどうでしょうか。

--
Shugo Maeda

Updated by shugo (Shugo Maeda) about 2 years ago

前田です。

2010年3月25日12:17 Shugo Maeda <shugo@ruby-lang.org>:
> Hashのキーにすると危ないものは他にもあるので、このケースだけエラーに
> する必要もないかなと思います。
> 1.8との互換性という意味でもエラーにしない方がいいかもしれないですね。
>
> とくに異論がなければ、テストの方を修正するということでどうでしょうか。

とりあえずテストの方を修正しておきました。

-- 
Shugo Maeda

Updated by shugo (Shugo Maeda) about 2 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100
This issue was solved with changeset r27062.
Shugo, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.

Also available in: Atom PDF