ruby-trunk-changes r61653 - r61684

今日は標準添付ライブラリ net/* の最適化やブロック引数への call メソッドの呼び出しの最適化などがありました。

nobu: r61653 2018-01-07 20:51:29 +0900

case 文の when 節に対応する NODE_WHEN の行番号を when の引数の行にあわせるようにしています。

nobu: r61654 2018-01-07 20:51:30 +0900

case 文の NODE_CASE2 の nd_line のセットするところで case_body の行番号を変更していたのを修正しています。これは元々意図していないセットだった(不具合修正)のかな。

mame: r61655 2018-01-07 21:55:10 +0900

コマンドラインオプション --dump=parsetree 時に ->(a:){} のような必須キーワード引数を持つ lambda で SEGV していたのを修正しています。

stomar: r61656 2018-01-08 02:47:53 +0900

doc/NEWS-2.5.0 の英文法の修正、だそうですが、多分これ元の意味は ERB が生成したコードが 2倍速い、という意味だと思うのですが、修正後はコード生成が2倍速い、という意味になってしまわないかなぁ。

svn: r61657 2018-01-08 02:47:54 +0900

version.h の日付更新。

stomar: r61658 2018-01-08 02:49:46 +0900

標準添付ライブラリ scanf の rdoc 用コメントの文法修正。

ko1: r61659 2018-01-08 04:18:49 +0900

r61624 の続き? VM 命令に getblockparamproxy 命令というのを追加して、ブロック引数に対する call メソッドの呼び出しの時には receiver を直接参照せずに rb_block_param_proxy という VM 内部で利用するオブジェクトをスタックに積み、これを使うことで Proc 化せずに呼び出すようにしています。もしかして r61624 だと Proc 化の抑制は完成していなかったのかな? [ruby-core:84689] [Feature #14330]

normal: r61662 2018-01-08 09:34:42 +0900

標準添付ライブラリ net/protocol でバッファに使う文字列オブジェクトを String#b で ASCII-8BIT 化するようにしています。 r61638 で一度入って r61640 で revert されたやつですね。

normal: r61663 2018-01-08 09:34:47 +0900

標準添付ライブラリ net/protocol の Net::Protocol#rbuf_fill で @rbuf が空文字列になっていたら、IO#read_nonblock に結果を格納するバッファとして直接渡してそこに格納させるようにして不要な一時オブジェクトの生成やコピーを抑制する最適化。 [ruby-core:84678] [Feature #14326]

normal: r61664 2018-01-08 10:11:33 +0900

r58846 で Net::Protocol のバッファの操作の Ruby レベルのでの race condition の修正をしたので、標準添付ライブラリ open-uri で Net::HTTPResponse#read_body のブロックの中で読み終えた文字列バッファに対して String#clear を呼んでバッファを解放させることで早めのメモリ解放を図る最適化を行なっています。すごい細かい最適化だ。けどメモリ使用量にはかなり効くようです。 [ruby-core:84662] [Feature #14320]

normal: r61665 2018-01-08 10:11:38 +0900

拡張ライブラリ zlib の Zlib::GzipReader#readpartial に読み込みに使うバッファの文字列オブジェクトを渡した時に、それを内部の read 系の関数群 rb_read_xxx() にも伝播させてそこに格納することで一時的な文字列オブジェクトの生成を抑制する最適化。 [ruby-core:84660] [Feature #14319]

mame: r61666 2018-01-08 10:29:35 +0900

node.h で定義されている NODE を新規生成する NEW_XXX() のマクロ群が全て位置情報も受け取るようにしています。

mame: r61667 2018-01-08 10:49:00 +0900

parse.y で NODE 位置情報をセットする時に nd_set_loc() を使い、同時に NODE の nd_line も範囲情報の開始行を使ってセットするようにしています。この nd_line っていうのは古くからあるほうだと思うけど location 情報とは別になってるのはなぜなんだろう。

mame: r61668 2018-01-08 11:19:47 +0900

parse.y の new_xxx() というマクロで new_xxx_gen() という関数を呼び出すようにしていたところを、NEW_XXX() マクロを直接呼び出すようにしています。この new_xxx_gen() マクロ群も謎の仕組みだったけど大部分は不要になったようですね。まだ少し残ってますけど。

yui-knk: r61669 2018-01-08 11:24:18 +0900

parse.y の NULL_LOC という変数を static 変数に変更しています。

mame: r61670 2018-01-08 11:36:12 +0900

r61668 の続き。 parse.y の new_lit(), new_str, new_dstr() などのマクロも削除して NEW_LIT() などのマクロを呼ぶようにしています。また一時オブジェクトの mark のため add_mark_object_gen() を通すようにしています。シンプルに書くためか add_mark_object_gen() は引数の obj をそのまま return するようにしています。

yui-knk: r61671 2018-01-08 11:38:21 +0900

parse.y の case 文の NODE_CASE2 と NODE_WHEN の nd_loc の設定は既に NEW_xxx() でデフォルトで行なわれるようになったので削除しています。

mame: r61672 2018-01-08 12:22:13 +0900

parse.y で演算子つき代入文などで演算子の && と || を判定する部分がいくつかあったので change_shortcut_operator_id() という関数として切り出しています。

mrkn: r61673 2018-01-08 13:35:20 +0900

doc/NEWS-2.5.0 の Time.at についてのエントリが Time#at と書かれてたので修正しています。

nobu: r61674 2018-01-08 14:17:08 +0900

r61669 の続き。 parse.y の NULL_LOC 変数にさらに const 修飾子も追加しています。

nobu: r61675 2018-01-08 14:17:09 +0900

compile.c の compile_case2() で branchif 命令を直接吐かずに compile_branch_condition() 関数を使ってコンパイルするようにリファクタリングしています。

mame: r61676 2018-01-08 15:30:53 +0900

この記法が何を意味しているのかわかってないんですが、parse.y で $$ に ruby_sourceline を代入して行番号情報を調整していたのをやめています。また $1 などを参照していたところも NODE の nd_loc を参照するように変更しています。

mame: r61677 2018-01-08 15:54:55 +0900

parse.y で nd_set_line に ruby_sourceline を渡していたところを対応する NODE の位置情報の終端位置の行番号を使うようにしています。

nobu: r61678 2018-01-08 15:55:12 +0900

コマンドラインオプション --dump=parsetree で AST をダンプする時に NODE_HEADER の出力に NODE_FL_NEWLINE フラグが立っているかどうかを示す文字を追加しています。

kazu: r61679 2018-01-08 17:12:04 +0900

doc/contributing.rdoc の kosaki さんのところのアカウント名を他の人と同じくかっこで括るようにしています。

nobu: r61680 2018-01-08 18:04:07 +0900

r61659 の続き。 Proc#call が再定義されていた時にブロック引数への call メソッドの呼び出しが再定義されたメソッドを呼ばない最適化が効いたままになっていたのを修正しています。 [ruby-dev:50414] [Bug #14335]

nobu: r61681 2018-01-08 18:11:26 +0900

vm_invoke_block_noinline() を vm_invoke_block_opt_call() に改名し、呼び元の vm_call_opt_call() や vm_call_opt_block_call() で共通して行なわれていた VM スタック操作をこの関数内で実行するように移動しています。

mame: r61682 2018-01-08 18:39:01 +0900

parse.y でヒアドキュメントのトークンの文字列オブジェクトのバッファを強制的に解放する dispose_string() という関数を削除して、この特殊処理をやめています。複雑な割に効果が望めなさそうだからとのこと。

hsbt: r61683 2018-01-08 19:12:41 +0900

bundled gem の minitest のバージョンを 5.11.1 に更新しています。

normal: r61684 2018-01-08 19:23:27 +0900

標準添付ライブラリ net/http の Net::HTTPResponse#inflate_adapter で定義しているレスポンスを処理する Proc オブジェクトで読み込んだバッファを String#clear で空にして、GC を待たずにバッファを解放させるようにしてメモリ消費量を抑えるようにしています。