ruby-trunk-changes r56636 - r56665

今日はインタプリンタ内部で利用されている(Hash の実装でもある) st_table を open addressing 方式で実装しなおす変更がありました。また ChangeLogリポジトリから削除され、パッケージ作成時に自動生成されるようになりました。

hsbt: r56636 2016-11-06 21:36:47 +0900

NEWS ファイルの項目を辞書順になるように並べ替えています。

hsbt: r56637 2016-11-06 21:36:52 +0900

NEWS ファイルに RDoc の 5.0 への更新について追記しています。

naruse: r56638 2016-11-06 21:57:45 +0900

tool/make-snapshot と tool/vcs.rb で ChangeLog をバージョン管理ツールのログから生成するようにしています。 [ruby-core:74951] [Misc #12283]

naruse: r56640 2016-11-06 23:01:21 +0900

r56638 で tool/vcs.rb にデバッグ用の sleep や exit が残っていたので削除しています。

shugo: r56641 2016-11-06 23:41:39 +0900

r56610 で追加して r56619 で修正してた末尾呼び出し最適化についてのテストで SIGINT で子プロセスが止まらなかった時のために SIGKILL で止める処理も追加しています。 Windows で止まらないことがあったみたいです。

shugo: r56642 2016-11-07 00:33:10 +0900

r56610 で追加したテストについて子プロセスの Process::Status#termsig が nil じゃないか assertion を追加しています。

svn: r56643 2016-11-07 00:33:10 +0900

version.h の日付更新。

usa: r56644 2016-11-07 00:35:01 +0900

r56610 で追加したテストで Process::Status の termsig をチェックしていますが Windows では signal の情報は取得できないのでテストメソッドの定義を mswin と mingw ではスキップするようにしています。

naruse: r56645 2016-11-07 00:56:27 +0900

r56638 で ChangeLog を自動生成するようにしたのでついに ChangeLog を削除しています。 [ruby-core:74951] [Misc #12283]

naruse: r56648 2016-11-07 02:34:56 +0900

revision.h が ChangeLog に依存していたので(ChangeLog を編集しただけでもパッチレベル更新するようにしてたのかな)、依存関係を削除しています。

nobu: r56649 2016-11-07 09:04:20 +0900

tool/vcs.rb で 1.9 以前の BASERUBY 用に IO.popen の代替実装をしている部分で環境変数を Hash で渡す記法をサポートするようにしています。

ko1: r56650 2016-11-07 09:45:00 +0900

インタプリタが内部で使い、Hash の実装のベースにもなっている st.c の実装を変更しています。これまでの st_table は Hash Table の実装方法として chain 法を採用していましたが、新しい実装では open addressing を採用しています。
hash table の実装の改善については funny-falcon こと Yura Sokolov が昔 [Feature #5903] というチケットでも open addressing 化に取り組んでいましたが、Vladimir Makaroc 氏が今年 [Feature #12142] を投稿してから hash 実装改善の議論が再燃して、どちらかの実装を採用しようということで評価されていたのですが、最終的には Vladimir 氏のパッチをベースにしたものがコミットされたみたいです。評価結果は両者に決定的な差はなくて、どっちにするかずっと悩んでいた様子でしたね。
実装的には bins という hash 値を元に open addressing で配置を決めるための配列と、実際の値を格納する entries という 2つの配列を保持していて、bins には entries の配列内のインデックスを保持する方法で、rebuild (chain 法の時は rehash という呼びかたをしてたと思いますが open addressing 法では hash 値によるインデックスが衝突した時に次のハッシュ値を探すことを rehash というので呼びかたを変えたみたいですね) 時の bins の再構築を軽くして、また Ruby の Hash は順序を保存するのでこれはこれまで linked list を利用していたのを entries の順序を利用するようにしてポインタ操作を抑制して Enumerable のメソッドで巡回する時の操作を高速化しているようです。 [ruby-core:74124] [Feature #12142]

ko1: r56651 2016-11-07 10:03:04 +0900

r56650 の hash table の実装改善についての NEWS ファイルの記述を修正しています。

nobu: r56652 2016-11-07 10:23:04 +0900

tool/make-snapshot で ChangeLog を生成する時に年毎のファイルの最新版を取得するのに Dir.glob の順序に依存していたのでソートするようにしています。

shugo: r56653 2016-11-07 11:10:00 +0900

r56610 で追加したファイルで signal の種類をチェックするところで SIGSEGV でないことだけチェックするように修正しています。

nobu: r56654 2016-11-07 11:54:27 +0900

tool/vcs.rb で git を呼び出す時に古い git のために -C オプションのかわりに IO.pread の chdir オプションを使って chdir してから実行するようにしています。また環境変数 LANG や LC_ALL に C を設定して呼ぶようにしています。

nobu: r56655 2016-11-07 11:54:28 +0900

tool/vcs.rb の VCS#export_changelog メソッドの不要な引数を削除しています。ソースディレクトリのパスは VCS.new の引数の path から File.realpath で取得してインスタンス変数に保持しておくようにしています。

nobu: r56656 2016-11-07 12:25:28 +0900

tool/make-snapshot で doc/ChangeLog-YYYY の最新のファイルの最後のリビジョン番号の次の番号を vcs.export_changelog に渡すようにしていましたが、そのまま渡して git svn log コマンドを使うことで最初のリビジョンは含めないようにしています。

nobu: r56657 2016-11-07 12:28:57 +0900

hash.c の rb_objid_hash() で明示的なキャストを追加しています。警告除去かな。

nobu: r56658 2016-11-07 12:47:46 +0900

tool/vcs.rb でデバッグ用に IO.popen を Refinements を使って上書きしているのを 2.0.0 の場合警告が出るのを抑制するため $VERBOSE を nil にセットしておくようにしています。

naruse: r56660 2016-11-07 14:53:42 +0900

NEWS ファイルに ChangeLogリポジトリから削除して自動生成するようにしたことを追記しています。

shugo: r56662 2016-11-07 15:57:14 +0900

Net::SMTP のテスト時の open_timeout の値が 0.1 だったのを 1 にのばしています。 Solaris 10 などでテストが失敗していたそうです。

nobu: r56663 2016-11-07 16:45:18 +0900

r56208 で jump 命令による無条件ジャンプの先に leave があった時の末尾呼び出し最適化が効くようにした変更のテストを追加しています。 [ruby-core:78015] [Bug #12905]

hsbt: r56664 2016-11-07 18:46:42 +0900

NEWS ファイルに RubyGems を 2.6.8 に更新した旨追記しています。

kazu: r56665 2016-11-07 21:10:36 +0900

NEWS ファイルのメソッドの記法の修正。