ruby-trunk-changes r47653 - r47678

今日は RubyKaigi 後ということもあってかたくさんコミットがありました。 Enumerable#chunk と #slice_before には deprecated になった仕様があったり、Time.new の offset が受け付ける文字列の制限に変更があったり、DRbServer の停止が graceful になったりなどの変更がありました。

akr: r47653 2014-09-21 00:01:44 +0900

Enumerable#chunk と Enumerable#slice_before のブロックのブロックパラメータの2つ目に state を受け取る呼び方は deprecate として、警告を出力するようにしています。

svn: r47654 2014-09-21 00:01:56 +0900

version.h の日付更新。

glass: r47655 2014-09-21 02:35:06 +0900

標準添付ライブラリ tempfile および tmpdir で引数を *rest で受けてメソッド内で処理していたのを省略可能引数をやキーワードrest引数を活用したメソッド定義をして明示的な処理を避けるようにしています。

nobu: r47656 2014-09-21 10:40:21 +0900

r47655 での変更でメソッドの引数とその中でのメソッド呼び出しのブロックパラメータが同じ名前だったのを修正しています。また tempfile のテストで ConditionVariable が必要だそうで require "thread" を追加しています。

nobu: r47657 2014-09-21 11:03:34 +0900

sigaction(2) によるシグナルハンドラの登録が errno=EINVAL で返ってきた時は、ハンドラを登録できないシグナルが指定された場合というのがありえるので、rb_bug() ではなく Errno::EINVAL 例外の発生にするようにしています。また Signal.trap に :KILL や :STOP を渡した時に Errno::EINVAL が発生することを確認するテストを追加しています。

suke: r47658 2014-09-21 11:18:37 +0900

拡張ライブラリ win32ole で Time を WIN32OLE_VARIANT に変換した時に秒単位以下の精度も変換するようにしていたのをやっぱりやめています。 なんとなく丸めをした時に桁上がりを処理していないのが問題だったようなので精度を落とさなくても解決可能だった気もするのと、以下の文は正しいんでしょうか?

    if (msec >= 59) {                                                                        
      msec -= 60;                                                                            
    }

条件が ">" なんじゃないかという。この後で 1 足してるからいいのかもしれない。 [ruby-dev:48558] [Bug #10258]

glass: r47659 2014-09-21 11:23:32 +0900

Array#include? の実装で要素との比較をするのに rb_equal() を呼んでいたのを rb_equal_opt() を呼ぶことで組込みクラスのオブジェクトの比較にメソッド呼び出しを伴わない直接比較関数の呼び出しを行うようにしてパフォーマンス改善をしています。 [ruby-core:64954] [Feature #10227]

nobu: r47660 2014-09-21 11:42:40 +0900

r47657 の続きで ruby_signal() は errno に関わらず sigaction(2) 失敗時は SIG_ERR を返して、呼び元によって、インタプリタ起動時には rb_bug() で終了し、Signal.trap メソッドからの呼び出しではEINVAL だけでなく全てのエラーを SystemCallError で Errno::EXXX の例外発生にするようにと変更しています。

nobu: r47661 2014-09-21 11:48:38 +0900

r47655 と r47659 の ChangeLog エントリのインデント修正。

hsbt: r47662 2014-09-21 12:10:27 +0900

標準添付ライブラリ rexml でコメントアウトされていたデバッグ用と思われるコードを削除しています。

glass: r47663 2014-09-21 12:21:17 +0900

標準添付ライブラリ csvCSV.new で headers と fields の数が多いほうを Array#zip の receiver にしようとしているところで、数が一致していた時に reverse が必要な無駄が多いパスを通るようになっていたので、条件を変更しています。 [ruby-core:63215] [Feature #9952]

normal: r47664 2014-09-21 12:26:47 +0900

ロードするファイルパスを取得するための rb_find_file_ext_safe() で取得失敗時に明示的に一時バッファのサイズを 0 にしてメモリ使用量を抑えて GC の必要性が上がるのを抑えるようにしています。

nobu: r47665 2014-09-21 12:31:46 +0900

Signal についてのテストメソッドを1つ消しています。 Thread 内の sleep がシグナル割り込みで例外発生にならないことを確認しているものですが、Rubyレベルのシグナルハンドラの実行は常にメインスレッドで行われるので、とあります。それを確認するためにこのテストがあったのでは? という気もしますが。

normal: r47666 2014-09-21 12:50:23 +0900

iseq.c に文末のセミコロンが2重になっていたところがあったので修正しています。

akr: r47667 2014-09-21 13:54:46 +0900

bootstraptest/test_thread.rb の Thread#kill した時の ensure 節が実行されることを確認するテストで、Thread.pass を1回しか実行していなかったのを、対象の Thread が sleep に入ったことを確認するまでループするようにしています。

akr: r47668 2014-09-21 13:55:49 +0900

test/ruby/test_thread.rb の test_main_thread_status_at_exit で子 Thread が begin 節に入ったことを確認してからメインスレッドを終了させるように Queue を使った同期を行うようにしています。

nobu: r47669 2014-09-21 14:10:14 +0900

SIGEXIT というシグナル番号 0 のシグナルはインタプリタ内部で利用されているものなので(?)、sigaction(2) に渡さないようにしています。うーん Signal.trap(:EXIT) で登録したシグナルハンドラは、インタプリタ終了時に呼ばれるようです。知らなかった。at_exit でいいじゃないかという気もしますが、実行は at_exit より前なので実行できる内容に違いがあるのかも。

akr: r47670 2014-09-21 14:14:47 +0900

thread_pthread.c に native_set_thread_name() という関数を追加して、Thread に ps -L で表示した時のコマンド名で区別できる名前を付けるようにしています。

kazu: r47671 2014-09-21 16:27:52 +0900

r47624 の ChangeLog エントリの typo 修正。

kazu: r47672 2014-09-21 16:28:58 +0900

r47655、r47658、r47659 の ChangeLog エントリのインデント修正や余分な空白の除去。

nari: r47673 2014-09-21 18:22:42 +0900

st.c の重複していたので不要なマクロ定義を削除しています。また node.c の未使用のマクロ定義も削除しています。

nari: r47674 2014-09-21 18:52:37 +0900

parse.y の parser_class_nest() で未使用の構造体メンバとそのアクセス用マクロを削除しています。

nari: r47675 2014-09-21 19:07:44 +0900

st.c の未使用マクロを削除しています。

glass: r47676 2014-09-22 01:58:47 +0900

Time.new に渡す offset の文字列で分のところが 60 以上の時にエラーにするようにしています。 [ruby-dev:47539] [Bug #8679]

svn: r47677 2014-09-22 01:59:02 +0900

version.h の日付更新。

akr: r47678 2014-09-22 02:06:05 +0900

標準添付ライブラリ drb の DRbServer の停止を graceful にするようにしています。これまでは Thread#kill して DRbServer の接続待ちスレッドを止めていたのですが、shutdown 通知用の pipe を用意してこれを select することで終了を通知されたらループを抜けるようにしています。 これにより @protocol.close が実行されるようになり test-all での fd の leak 検出でひっかからなくなる、ということかと思います。