ruby-trunk-changes r58394 - r58402

今日は unless の条件部に副作用をもつリテラルがあった時に最適化で消されてしまう不具合の修正や VM の命令実行部分のリファクタリングなどがありました。

ko1: r58394 2017-04-18 21:30:59 +0900

r58390 の insns.def のリファクタリングで関数に切り出した trace() で変数の型の違いで clang でコンパイルエラーになっていたのを修正しています。

nobu: r58395 2017-04-18 22:02:56 +0900

test/ruby/test_optimization.rb の子プロセスを起動するテストでスクリプトを渡すためのヒアドキュメントの書きかたを begin; と end; をトークンにする技法を利用するように書き換えています。

shyouhei: r58396 2017-04-18 22:05:38 +0900

r58390 の insns.def のリファクタリングで文末のセミコロンが抜けてたところがあったので修正しています。単文の関数だとコンパイラによってはビルドできてしまっていたみたいです。

nobu: r58397 2017-04-18 22:14:05 +0900

vm_insnhelper.c のインデント修正のみ。

nobu: r58398 2017-04-18 22:14:06 +0900

スクリプトVM 命令列にコンパイルする時の最適化で、条件分岐に使われるオブジェクトにリテラルが書かれていたら省略して分岐を消すようにしていましたが、 2.4 以降 `` のリテラルなど副作用を持つリテラルも存在するので、これを省略してしまうと挙動が変わるので対象としないように修正しています。 `` はともかく(いやともかくじゃないけど) NODE_ARRAY や NODE_HASH も対象になってたみたいで、個人的にはこれを見逃がしてしまったのは痛恨の極みです…。 [ruby-core:80740] [Bug #13444]

nobu: r58399 2017-04-18 22:14:08 +0900

vm_insnhelper.c のインデントの修正追加。

normal: r58400 2017-04-19 10:08:16 +0900

拡張ライブラリ socket で Linux や Socket::MSG_DONTWAIT が定義されている環境では read_nonblock と write_nonblock の実装に recv_nonblock と sendmsg_nonblock を利用するようにしています。これは fd に O_NONBLOCK フラグを付けるのを避けるようにしているのだそうです。ふーむ。 O_NONBLOCK は付けないほうが望ましいんですかね? 別のプロセスから渡された fd だと副作用があるとかはあるのかも。 [ruby-core:80780] [Feature #13362]

svn: r58401 2017-04-19 10:08:17 +0900

version.h の日付更新。

shyouhei: r58402 2017-04-19 16:27:03 +0900

vm_insnhelper.c で opt_xxx の二項演算子系の命令の最適化つきのものの処理を括り出して vm_opt_binop_dispatch() という関数を作成して vm_opt_xxx() でこれを利用するようにリファクタリングしています。コンパイルされたバイナリが小さくなるようです。