ruby-trunk-changes 2019-09-08

今日は主に Array や Hash のリテラルVM 命令列へのコンパイル処理のリファクタリングや最適化の強化がありました。

[8c908c9890] Yusuke Endoh 2019-09-07 13:08:39 UTC

compile_array() の配列リテラルコンパイルの方針についての巨大な配列リテラルのための工夫とかをコメントでわかりやすく解説してくれています。そういえばこういう工夫あったなぁ。さらに要素がコンパイル時に決定するリテラルだった場合に newarray を使わず ISeq 内に直接配列オブジェクトを埋め込んで dup するだけにする最適化は、静的でない要素(この最適化ができない要素)より前だけに使われてましたが、後ろ側にも適用できるのでそうするようにしています。

[a9b63db3b6] git 2019-09-07 13:22:30 UTC

8c908c989077c74eed26e02912b98362e509b8a3 の行末の空白除去。

[ae8b977742] Takashi Kokubun 2019-09-07 14:13:46 UTC

vm_exec.h の DISPATCH_ARCH_DEPEND_WAY() というマクロの定義を VM のループ方式が token threaded の時? の位置に移動して通常定義されないようにしているようです。

[5a6954ba74] Nobuyoshi Nakada 2019-09-07 08:28:05 UTC

tool/lib/vcs.rb の VCS::GIT#export の git clone コマンドに -c advice.detachedHead=false というオプションを追加しています。なんだろうこれは。なんか不安な響きのある設定ですが…。

[f3bae2c6cf] Nobuyoshi Nakada 2019-09-07 15:21:42 UTC

tool/make-snapshot のダウンロードしてくる系のファイル群をソースディレクトリにコピーする時に preserve: true オプションをつけていたのをやめています。そして Makefile に追加する touch-unicode-files というルールのなかでこれらのファイルも File.utime で更新時刻などを揃えておくようにしています。再現可能なパッケージ作成のためみたいです。

[b543f5b20f] git 2019-09-07 15:23:56 UTC

version.h の日付更新

[7cba9a8406] Yusuke Endoh 2019-09-07 14:55:51 UTC

8c908c989077c74eed26e02912b98362e509b8a3 の compile_array() のリファクタリングと最適化強化で追加した関数マクロの定義を関数の末尾で undef するようにしています。

[bb78c83678] Yusuke Endoh 2019-09-07 14:56:19 UTC

compile_hash() でこの関数内で一時的に使うだけの Array オブジェクトを iseq_add_mark_object_compile_time() で mark 用配列に追加していたのをやめています。

[050f67c9c6] Yusuke Endoh 2019-09-07 14:57:37 UTC

compile_hash() で node->nd_head が NULL なノード(keyword 引数っぽいものらしい?)で要素の取り出しかたがトリッキーだったのをシンプルにリファクタリングしています。元のは要素が2つペア取り出せるかチェックするために複雑になってたけど偶数個ある保証があるからシンプルにしても大丈夫っていうことらしい。

[86b74d1a73] Yusuke Endoh 2019-09-07 15:11:50 UTC

compile.c の iseq_compile_each0() で node->nd_head のタイプが NODE_ZLIST かそもそも NULL だったら compile_hash() を呼ばず newhash 命令を直接生成してたのを常に compile_hash() を呼んでその中で NODE_ZLIST 用の処理を吸収するようにしています。

[95f9d7c76d] Yusuke Endoh 2019-09-07 15:21:23 UTC

compile.c のキーワード引数っぽいノードかどうかというのを判定する処理を keyword_node_p() という関数に切り出すリファクタリング

[a3f5265fd1] Yusuke Endoh 2019-09-07 15:22:26 UTC

parse.y の "{ key => value }" みたいな式を parse しているルールのアクション部で NODE にかっこがついてたかどうかのフラグを代入する時に使う疑似メンバー名(NODE は 3つ子ノードへのポインタを持つツリー構造ですが、NODE のタイプ毎に 3つの子 (u1, u2, u3)に違う名前をマクロ定義して使っている)を nd_alen から nd_brace に修正しています。どちらも具体的には同じ要素を指すように定義されているので結果は同じですが一応。

[2d017d6126] Nobuyoshi Nakada 2019-09-07 15:48:18 UTC

tool/make-snapshot でディレクトリの指定も svnリポジトリの指定もなかった時に実行されている make-snapshot ツール自体を含むソースツリーからリポジトリが検出できないかチェックしてみるようにしています。いやー "this tool has been intended to use in a working directory" ってありますが、少なくとも現状は安定版ブランチのリリースの時には違うんですよねー。いや、まあでも今の master は既に git なので、master のものを使う場合はその git で指定したタグの参照を fetch してきてそれを対象にしてくれると思うのでいいのか?

[4f63634af1] Yusuke Endoh 2019-09-07 16:21:19 UTC

compile_each0() の NODE_OP_ASGN1 の NODE のコンパイル時に引数の要素を指すのに使っていた ANCHOR は使わなくても変数 ret で代用できたので削除しています。

[3568029823] aycabta 2019-09-07 13:06:58 UTC

rdoc の .gemspec ファイルの spec.files のリストから .document と .gitignore を削除しています。

[95297a15f1] Yusuke Endoh 2019-09-07 17:54:56 UTC

8c908c989077c74eed26e02912b98362e509b8a3 で compile_array() にしたのと同様に compile_hash() の内容を詳細なコメントに追加し、最適化を動的な要素の後でも有効にしています。

[46bfe907f1] Yusuke Endoh 2019-09-07 18:06:38 UTC

compile_hash() のキーワード引数的なものを扱う時にそれが空の Hash リテラルによる keyword splat だけだった時に不要な Hash オブジェクトを生成するのを抑制しています。

[e9bc8b35c6] aycabta 2019-09-07 18:26:09 UTC

標準添付ライブラリ reline の Esc キーのコードを vi モードの時に em_meta_next から ed_unassigned に変更しています。単に無視するらしい。

[aedf6946a7] Nobuyoshi Nakada 2019-09-08 03:54:06 UTC

rubyspec の logger のテストで Logger::LogDevice.new() に対するキーワード引数を Hash リテラルのように書いてたのが警告になるのでかっこを消しています。こう書いてもいままでキーワード引数として受け取れてた(今も受け取れるが警告が出る)んだなー。寛大すぎるよな。

[b10940a839] Benoit Daloze 2019-09-08 10:41:14 UTC

rubyspec の Proc#to_s のテストでファイル内の位置が表示されるようになったのをチェックしているところで __FILE__ と __LINE__ を使って変更に強くなるようにしています。