[#46908] [ruby-trunk - Bug #7774][Assigned] IFUNC上のbinding呼び出しでSEGV — "ktsj (Kazuki Tsujimoto)" <kazuki@...>

16 messages 2013/02/03

[#47075] [ruby-trunk - Bug #7924][Open] r39232 以降 net/http で正しく reponse を取得出来ないケースがある — "hsbt (Hiroshi SHIBATA)" <shibata.hiroshi@...>

15 messages 2013/02/23

[ruby-dev:47098] [ruby-trunk - Bug #7947][Open] Queue#clear の返り値が Queue 内部の配列になっている

From: "clicube (Cubing Cube)" <clicube@...>
Date: 2013-02-24 17:31:48 UTC
List: ruby-dev #47098
Issue #7947 has been reported by clicube (Cubing Cube).

----------------------------------------
Bug #7947: Queue#clear の返り値が Queue 内部の配列になっている
https://bugs.ruby-lang.org/issues/7947

Author: clicube (Cubing Cube)
Status: Open
Priority: Normal
Assignee: 
Category: 
Target version: 
ruby -v: ruby 2.0.0dev (2013-02-24 trunk 39476) [x86_64-darwin11.4.2]


■現象
Queue#clear
が
def clear
  @que.clear
end
と実装されていて, Array#clear は self を返すので,結果的に内部の配列 @que が返っています.

■問題と思われること
1.
内部で使っている変数にアクセスできてしまいます.
(これは instance_eval でアクセスしようと思えばできるわけですが)
2.
Array も Queue も #push や #pop があるため,
Queue#clear の返り値に対してメソッドチェーンで #push などを繋いだりすると,
エラーが起こらないにもかかわらず内部の変数を直接書き換えてしまう可能性があると考えます.

■パッチについて
今回はQueue#clearで気づきましたが,
QueueおよびSizedQueueのメソッドについて Array との対称性を考えると,
・Queue#push
・Queue#clear
・SizedQueue#push
・SizedQueue#clear
は self が返るべきかと考えました.
以上4メソッドについて変更を加えるパッチを添付します.

テストの実行結果は以下です.
$ ./ruby -I./lib -I. test/thread/test_queue.rb
Run options: 

# Running tests:

Finished tests in 1.680776s, 7.1396 tests/s, 13.6842 assertions/s.    
12 tests, 23 assertions, 0 failures, 0 errors, 0 skips

ruby -v: ruby 2.0.0dev (2013-02-24 trunk 39476) [x86_64-darwin11.4.2]

パッチのつくり方やテストの書き方/実行方法に自信がないのですが,これでいいのでしょうか.
IRCで相談に乗っていただいた方々,ありがとうございました.



-- 
http://bugs.ruby-lang.org/

In This Thread

Prev Next