ruby-trunk-changes r64510 - r64521

今日は trace の有無による VM命令の書き換え方法の変更や、ISeq をバイナリからロードした時に TracePoint が効かない不具合の修正などがありました。

mame: r64510 2018-08-23 00:04:05 +0900

r61847 でリファクタリングして切り出した parse.y の arg_append() という引数リストの NODE を組み立てる関数で NODE_ARGSCAT というタイプの NODE の時の対応を追加しています。結果的には展開されるので実行結果は変わらないと思いますが、内部的には複数の配列の連結として処理されるため無駄なリソースを使ってしまっていたみたいです。 [ruby-core:88608] [Bug #15018]

svn: r64511 2018-08-23 00:04:06 +0900

version.h の日付更新。

nobu: r64512 2018-08-23 01:02:03 +0900

compile.c の if/unless などの部分を VM 命令にコンパイルする compile_branch_condition() で NODE_ARRAY、NODE_ARGSCAT、NODE_DREGX、NODE_DSTR など必ず真になる NODE が条件部にあったら無条件ジャンプ命令としてコンパイルするようにしています。

naruse: r64513 2018-08-23 04:18:22 +0900

rubyspec の socket のテストで bind してない socket に sysaccept を呼ぶテストを AIX でも実行除外するようにしています。

ko1: r64514 2018-08-23 13:12:14 +0900

RubyVM::InstructionSequence でバイナリからロードしたメソッドでは TracePoint によるイベントフックが効かないという不具合があったので、ロード時に TracePoint が有効だったら iseq のフラグを立てるようにしています。 [ruby-core:86626] [Bug #14702]

ko1: r64515 2018-08-23 14:54:38 +0900

iseq_ibf_load() で変数 iseq の宣言に const がついてましたが const のない引数に渡すことがあるので警告除去のために削除しています。

nobu: r64516 2018-08-23 16:22:27 +0900

iseq_peephole_optimize() で putself や putnil などの副作用なく VM スタックに値を積む命令のすぐ次に pop があって無駄に捨てられてるケースで命令を削除する最適化で、対象の命令に concatstrings も追加しています。

nobu: r64517 2018-08-23 16:45:39 +0900

r64516 と同様に pop ですぐに捨てられる値を VM スタックに push する命令の削除の最適化で concatarray も対象にしています。

mame: r64518 2018-08-23 17:32:30 +0900

VM の命令実行部分で OPT_DIRECT_THREADED_CODE や OPT_CALL_THREADED_CODE (call threaded code ってなんだっけ)などが有効な実装の時に各命令のコードのメモリ上のアドレスを持たせるテーブルを compile.c から iseq.c に移動して、insn_data_t という構造体を導入して単にアドレスだけでなく命令のサイズと、対応するコードの trace 無効時のものと trace 有効時のアドレスを持たせるようにしています。なるほどこれを使って trace なしの時に notrace のほうにジャンプさせるようにすることで命令を実装したコードを共通化しようってことかな。

mame: r64519 2018-08-23 17:32:31 +0900

r64518 で導入した強化された命令のテーブル encoded_insn_data で trace の on/off による命令の書き換えをシンプルにしています。

kazu: r64520 2018-08-23 17:33:54 +0900

NEWS ファイルの MJIT についての項目で JIT を有効にするためのオプションとして --jit のかわりに --enable=jit を書くようにしています。

mame: r64521 2018-08-23 17:49:23 +0900

r64518 で導入した rb_vm_encoded_insn_data_table_init() で clang でのビルドのために明示的なキャストを追加しています。