ruby-trunk-changes r40324 - r40338

今日は VM の命令列 iseq をコンパイルする時に不要なオブジェクトの生成を抑えるパフォーマンス改善の変更などがありました。

akr:r40324 2013-04-16 23:07:50 +0900

ext/socket/unixsocket.c で構造体の padding のために構造体の最後に配列を置いていたのですが clang で警告が出るそうで共用体を使うように変更しています。

hsbt:r40327 2013-04-17 10:16:58 +0900

URI.decode_www_form_component の rdoc の typo 修正。 http://github.com/ruby/ruby/issue/289

svn:r40328 2013-04-17 10:17:02 +0900

version.h の日付更新。

nobu:r40329 2013-04-17 10:58:25 +0900

thread.c の sleep_timeval() で struct timeval の tv_sec メンバの型が Windows だと time_t でなく long なのでオーバフロー計算に変数を使っていたのをやめて全てマクロで計算するようにしています。

nobu:r40330 2013-04-17 11:39:02 +0900

標準添付ライブラリの test/unit の assert で省略可能な引数の message が省略されたことを識別するために UNASSIGNED という定数にオブジェクトを入れてデフォルト引数にすることで判定していたのを、 rest 引数として宣言して空だったら省略されたと判定するように変更しています。このあと無引数の super (ZSUPER) で親クラスに引数がそのまま渡されそうな気がするんですけどこれでいいのかなぁ、と思いましたが余分な引数があったらここをスルーして元の assert で ArgumentError になるだけだからいいのか。

nobu:r40331 2013-04-17 14:20:14 +0900

テストのユーティリティ envutil.rb で定義している assert_separately で r40059 で親クラスの $: を -I オプションとして付加するようにした時に環境変数の指定のための Hash の引数があった場合はそれを先頭に残して2つ目から追加するようにしています。

nobu:r40332 2013-04-17 14:20:18 +0900

readline のテストで locale が UTF-8 である必要があるテストについて assert_separately を使って子プロセスで LC_ALL を指定して実施するようにしています。 r40331 の assert_separately の修正はこのためだったんですね。

nobu:r40333 2013-04-17 15:39:41 +0900

curses のテストで子プロセスに環境変数 TERM を設定しないと CI など TERM が設定されていない環境でテストがこけるので設定しています。

tmm1:r40334 2013-04-17 19:55:29 +0900

VM の 命令列 iseq が保持するファイルパスの文字列が path と absolute_path で同一だったら同じ String オブジェクトを使い回すようにして余分なオブジェクトを使わないですむようにしています。 [ruby-core:53639] [Bug #8149]
tmm1 さんは今日新たにコミット権を得た Github のかたです。 Welcome to ruby core team!

akr:r40335 2013-04-17 20:01:17 +0900

拡張ライブラリ socket の UNIXSocket のアドレスで1文字目に '\0' を使った abstract namespace(ファイルシステム上にはソケットが置かれない)を指定した時に文字列サイズの上限チェックをするようにしています。

tmm1:r40336 2013-04-17 20:20:23 +0900

VM の命令列 iseq が内部的に保持する mark_ary というマークしておきたいオブジェクトを追加するための配列を生成していたのを必要に応じて作るように遅延させています。不要な Array オブジェクトを生成してスロットを消費することで GC 時間がかかってしまうのを避けるようにしているのだと思います。 [ruby-core:53619] [Bug #8142]
struct rb_iseq_struct::mark_ary にはコンパイル時だけじゃなくインラインキャッシュのデータも実行時に入れられるんですね。
これを読んでて iseq::compile_data にも mark_ary というのがあるのに気がつきましたが、こちらは使われていないような気がします。もう不要になったメンバでしょうか。

tmm1:r40337 2013-04-17 20:43:27 +0900

r40336 の ChangeLog の時刻を JST に修正。

akr:r40338 2013-04-17 22:08:13 +0900

r40335 で 拡張ライブラリ socket で UNIX ドメインソケットのソケットアドレスサイズの上限を計算するマクロ SOCKLEN_MAX の定義の不要な式を減らしてシンプルにしています。