ruby-trunk-changes r61685 - r61747

今日はなぜか大量のコミットがあり、ブロックパラメータの blk.call の最適化の追加修正、NODE の位置情報のつけかたの整理ほか parse.y のリファクタリングVMソースコード生成のツールの刷新、get_insns_info() に succinct bitvector というアルゴリズムを利用するようにする変更などがありました。

yui-knk: r61685 2018-01-08 20:50:35 +0900

r61676 の続き。 begin や class 文や { ... } などのブロックの nd_line のセットする位置に利用するトークンを変更しています。基本的に、閉じるトークンの前(本体)の最後の行を使うようにしているようですね。

yui-knk: r61686 2018-01-08 21:23:53 +0900

BEGIN ブロックが複数あった時の NODE_BLOCKS の位置情報を全体の範囲を含めるように修正しているようです。1ファイルに BEGIN ブロックって複数書けたんだ……。

yui-knk: r61687 2018-01-08 21:23:56 +0900

parse.y の block_append() や block_append_gen() で r61686 の結果未使用になった引数 location を削除しています。

mame: r61688 2018-01-08 21:30:35 +0900

parse.y の2つの NODE の範囲情報をマージして1つの rb_code_range_t にする処理を node.h に code_range_gen() という inline 関数として切り出しています。

yui-knk: r61689 2018-01-08 21:39:58 +0900

parse.y の remove_duplicate_keys() の未使用の引数 location を削除しています。

mame: r61690 2018-01-08 21:56:58 +0900

構造体 NODE のメンバー nd_loc を nd_crange と改名して、全体的に location (loc) はコード上の1点の位置(行, カラムからなる)を示すもの、code range (crange, cr) は開始位置と終了位置を持つ範囲のことを指すように型や変数、引数名などを変更しています。
code range (cr) というと文字列の Encoding 絡みの code range のほうも連想してしまいますね。まあだいたい文脈でわかると思いますけど。

ko1: r61691 2018-01-09 00:27:56 +0900

rb_execution_context_mark() で rb_execution_context_t の mark 時に Env からの参照の mark が漏れていたのを修正しています。r61624 と r61659 の blk.call の最適化で Proc オブジェクト化を回避した影響で Env の mark が必要になっていたようです。

svn: r61692 2018-01-09 00:27:57 +0900

version.h の日付更新。

ko1: r61693 2018-01-09 01:00:38 +0900

r61691 で追加したコードで VM_ENV_ESCAPED_P() で ep のフラグチェックをしていたのですが、この関数内では VM_ASSERT() での異常終了もしていたので、フラグチェックのみするようにしています。 "Not sure why there is an inconsistency." とのことなので、もしかすると assert も本当は通るべきなのかもしれませんけど。

ko1: r61694 2018-01-09 01:06:33 +0900

r61624、r61659 の続きでブロック引数の call メソッド呼び出しを特別扱いするのに rb_callinfo_t にフラグを増やしてそれをセットするようにしていたのを、setup_args() で INSN を getblockparamproxy のまま使うように修正しています。このほうがシンプルっぽい。

nobu: r61695 2018-01-09 08:35:36 +0900

rb_execution_context_mark() で ep の VM_ENV_FLAG_ESCAPED フラグチェックを #if VM_CHECK_MODE > 0 の時だけ VM_ASSERT() でチェックするようにしていましたが、そもそも VM_ASSERT() 自体が #if VM_CHECK_MODE > 0 の時だけチェックするように定義されているので、不要な #if は削除しています。

nobu: r61696 2018-01-09 09:06:00 +0900

dln.c の reloc_r_rightshift、 reloc_r_bitsize、 reloc_r_length などの変数に const 修飾子を追加しています。

yui-knk: r61697 2018-01-09 09:19:51 +0900

case 文の NODE_CASE2 やメソッド定義の def 文の NODE_DEFS の nd_line の設定はデフォルトのままでよいので不要な nd_set_line() 呼び出しを削除しています。

nobu: r61698 2018-01-09 09:25:27 +0900

include/ruby/ruby.h の rb_scan_args_verify() の定義でブロックに __extension__ を付けて gcc 拡張であることを明示するようにしています。

nobu: r61699 2018-01-09 10:10:15 +0900

parse.y でトークンが tOROP と tANDOP の判定をしているところがあったのですが change_shortcut_operator_id() という関数が同じことをしているのでこれを利用するようにリファクタリングしています。

ktsj: r61700 2018-01-09 10:46:07 +0900

r61534, r61536 の rb_iseq_body_t の構造の変更にあわせて .gdbinit の print_lineno コマンドを修正しています。

mame: r61701 2018-01-09 10:49:40 +0900

r61615 と r61699 の演算子 || や && のトークンを判定する処理を関数に切り出したり、切り出されているのを利用している部分を revert して、トークンをそのまま渡すようにしています。演算子トークンを判定して 0 or 1 にして、その後結局 0 or 1 で判定していたりしてあまり意味がなくなってたみたいです。

nobu: r61702 2018-01-09 10:56:05 +0900

parse.y の parse_yylex() で *=, <<=, >>= などの演算子トークンを生成する時に set_yylval_id() に渡す値が idXXX でなくて tXXX になってて、ID でなくて token を渡していたのを修正しています。たぶんこれらの組み込みの演算子の場合は ID と token が同一なので問題になってなかったんだと思います。

nobu: r61703 2018-01-09 11:10:58 +0900

make commit という Makefile のターゲットで、コミット後に parse.c, lex.c, id.c など自動生成系のソースコードの再生成をするようにしています。

normal: r61704 2018-01-09 11:45:03 +0900

enumerator.c, gc.c, vm.c などで独自に rb_intern() していたところに id.h にグローバルに定義している ID と同じものがあったので使いまわすようにしています。

nobu: r61705 2018-01-09 12:37:36 +0900

r61703 の make commit のソースディレクトリを指定するための変数名を "-" を含まない名前に変更しています。 nmake では "-" は変数名には使えないようです。っていうか GNU make は使えるのか。

mame: r61706 2018-01-09 12:47:22 +0900

r58874 で pthread 版の timer thread の起動時に pthread_attr() に失敗した時に警告だけ出して継続していたのを、VM_ASSERT() で VM_CHECK_MODE では異常終了させるようにしています。たまにこの警告が出るそうで(CI 環境で?)、デバッグのために assertion を追加するそうです。

mame: r61707 2018-01-09 12:48:26 +0900

parse.y に #ifndef RIPPER の中にさらに #ifndef RIPPER としている箇所があって余計だったので内側の分岐を削除しています。

mame: r61708 2018-01-09 13:27:26 +0900

parse.y の PARSER_DEBUG という定数マクロを定義していましたが、既に参照しているところがなかったので削除しています。

mame: r61709 2018-01-09 14:03:03 +0900

parse.y の malloc/realloc/calloc/free などのマクロ定義していたのを削除しています。古い bison のサポートのためにあった? と思われるけど今となっては理由もよくわからないので消してみる、という感じみたいです。

mame: r61710 2018-01-09 14:19:18 +0900

lambda の記法で do ... end のブロックを書いた時に -> do rescue; end のような rescue 節を書くと文法エラーになっていたので書けるようにしています。 ->() による lambda の記法で do..end ブロックを書くのか。 https://twitter.com/takiuchi/status/950593389963051008

mame: r61711 2018-01-09 15:17:21 +0900

VM 命令へのコンパイル時に coverage 測定用の命令 tracecoverage が、利用されていないリテラルなど最適化で消えてしまう行に残っていたのを削除するようにしています。

nobu: r61712 2018-01-09 15:24:10 +0900

internal.h から #include "ruby/io.h" を削除して必要なソースファイルで個別に #include "ruby/io.h" するようにしています。

nobu: r61713 2018-01-09 15:24:11 +0900

internal.h から #include "ruby/encoding.h" も削除して必要なソースファイルで個別に #include するようにしています。

nobu: r61714 2018-01-09 15:55:54 +0900

common.mk の依存関係の記述を更新するためのツール tool/update-deps で環境変数 GNUMAKEFILES から -j オプションを削るようにしています。

nobu: r61715 2018-01-09 15:55:55 +0900

common.mk と enc/depend, ext/coverage/depend の依存関係の記述を更新しています。 r61712 や r61713 のヘッダの依存関係変更を反映させています。

normal: r61716 2018-01-09 16:15:44 +0900

pthread 版で timer thread の起動時に pthread_attr_setstacksize() でスタックサイズの設定に失敗した時に rb_bug() で異常終了させるようにしています。

mame: r61717 2018-01-09 16:33:38 +0900

r61706 の timer thread 起動時の VM_ASSERT() を pthread_attr_init() のエラー時じゃなくて pthread_create() のエラー時のほうに移動しています。 [ruby-core:84756]

mame: r61718 2018-01-09 17:05:40 +0900

bootstraptest の Process.setrlimit を使ったテストを if false をつけてコメントアウトというか実行されないようにしています。r61706 および r61717 で timer thread が起動しない状態だとこのテストは通らないため。

normal: r61719 2018-01-09 17:26:38 +0900

pthread_attr_init() が利用可能かチェックして #ifdef HAVE_PTHREAD_ATTR_INIT で分岐しているところがありましたが、これは NaCl のサポート時に入れられたもので、NaCl のサポートは終了しているので削除しています。 [ruby-core:84758] [Misc #14342]

normal: r61720 2018-01-09 17:26:43 +0900

r61719 に続いて pthread_cond_init() と pthread_condattr_init() のチェックも省いて #ifdef の分岐を消しています。これも NaCl サポート時に入ったものだったのでもう不要とのこと。 [ruby-core:84758] [Misc #14342]

mame: r61721 2018-01-09 17:45:35 +0900

r61690 で NODE などの location と code range (crange, cr) でソース上の位置と範囲を指す語彙を整理しましたが、code range が文字列の Encoding 関係の code range とまぎらわしいということで code location (code_loc) と改名して、location は position に変更しています。

nobu: r61722 2018-01-09 20:52:17 +0900

r61716 で pthread_attr_setstacksize() のスタックサイズのセットに失敗したら異常終了するようにしたら、EINVAL で失敗していたことがあったみたいで、BUFSIZ の整数倍になるように調整しています。

nobu: r61723 2018-01-09 21:26:23 +0900

template/insns_info.inc.tmpl で rb_vm_insn_name_info を文字列リテラルのサイズの制限を超えるため構造体として宣言してメンバーに分割していたのですが、構造体メンバーの数にも C90 で制限(127 まで)があるそうなので、無名のネストした struct でさらに分割するようにしています。

nobu: r61724 2018-01-09 21:33:38 +0900

parse.y でメソッド定義の def 文のルール部で引数の前でトークンの値に cond_stack と cmdarg_stack をセットしておいて、ソース部で COND_SET(), CMDARG_SET() で戻すようにしています。ループの条件部に def 文を書いたりした時のためみたいです。というかこんなこと書けるんだな…。

kazu: r61725 2018-01-09 21:35:12 +0900

r61712 と r61713 の internal.h の依存関係の変更にあわせて、#include "internal.h" よりも前に "ruby/io.h" や "ruby/encoding.h" を #include するようにしています。また "internal.h" が先に #include されていたら #error でコンパイルエラーにして気付けるようにしています。

kazu: r61726 2018-01-09 21:35:54 +0900

parse.y のインデント修正のみ。

mame: r61727 2018-01-09 22:04:24 +0900

r61724 の再修正。 cond_stack の状態を退避するために struct local_vars という構造体の メンバーを追加して、local_push_gen() で cmdarg_stack と同様に cond_stack も保持しておくようにしています。 cmdarg_stack は元から退避されてたんですね。また class 文も同様に条件部に書けるようにしています。

shyouhei: r61728 2018-01-09 22:30:27 +0900

vm_core.h に rb_snum_t という signed long の型の宣言を追加しています。

shyouhei: r61729 2018-01-09 22:30:28 +0900

insns.def の命令ごとのコメント部分から日本語の説明や @c (カテゴリ?)の記述を削除して、また // の行コメントで inc (VM スタックの増加量)を指定するところを sp_inc という変数に変更しています。ここで r61728 で追加した rb_snum_t の型を利用しています。これにあわせてソース生成の tool/instruction.rb も変更し、また insns.def の変更に使ったスクリプトを tool/ruby_vm/scripts/converter.rb に置いています。

shyouhei: r61730 2018-01-09 22:30:29 +0900

insns.def の先頭にファイルの内容についての説明のコメントを追加しています。

svn: r61731 2018-01-09 22:30:30 +0900

r61729 で追加された tool/ruby_vm/tests/.gitkeep に改行を追加しています。

svn: r61732 2018-01-09 22:30:30 +0900

r61729 の新規追加ファイルの svn property 設定。

shyouhei: r61733 2018-01-09 22:30:31 +0900

insns.def から VM のソースを自動生成する tool/instruction.rb を削除して、かわりに tool/ruby_vm/ 配下のスクリプト群とERBテンプレートファイルを導入しています。ついでに stack caching などの最近は使われていなかった(ビルド時の指定による)機能の削除なども行なっているそうです。
stack caching は YARV Maniacs の逆襲でコードリーディングした時はじめて発表のネタに選んだ題材なので思い出深いなぁ。

shyouhei: r61734 2018-01-09 22:30:33 +0900

r61733 で導入した tool/ruby_vm/views/_insn_type_chars.erb が生成するソースコードenum が最後の要素の後にカンマを出力していて C99 より前のコンパイラでビルドできなかったので修正しています。

shyouhei: r61735 2018-01-09 22:30:34 +0900

同じく r61733 の tool/ruby_vm/views/_insn_name_info.erb および tool/ruby_vm/views/_insn_operand_info.erb で insn_name_info の宣言に文字列の配列を使っていたのを、構造体メンバーに分割する template/insns_info.inc.tmpl と同様の手法を使うようにしています。 position independent を保つためとのこと。

shyouhei: r61736 2018-01-09 22:30:35 +0900

r61735 の続きで tool/ruby_vm/views/_insn_*_info.erb で生成する C ソースコードで、関数内に閉じていたテーブルに rb_vm_insn_len_info, rb_vm_insn_len_info, rb_vm_insn_name_offset など名前をつけて extern してソースコード間で共有するようにしています。

svn: r61737 2018-01-09 22:30:39 +0900

r61733 の新規追加ファイルの svn property 設定。

mame: r61738 2018-01-09 23:05:21 +0900

iseq.c の iseq_data_to_ary() で rb_iseq_body_t::insns_info を直接参照していた部分を get_insn_info() を呼び出して抽象的に扱うようにしています。

mame: r61739 2018-01-09 23:05:23 +0900

r61537 で get_insns_info() の探索の実装を切り替えできるようにしましたが、VM_INSN_INFO_TABLE_IMPL == 2 の時に succinct bitvector というアルゴリズムを使って探索するようにしています。デフォルトも VM_INSN_INFO_TABLE_IMPL == 2 にしているので通常これを使うようにしているようです。これにより長い ISeq の時に高速に探索できるようになるので TracePoint を有効にした時の処理がもうちょっと高速になることが期待できます。

mame: r61740 2018-01-09 23:11:39 +0900

r61739 で定義したマクロ imm_block_rank_get() および small_block_rank_get() に明示的キャストを追加。

naruse: r61741 2018-01-10 00:41:10 +0900

r61733 で導入した tool/ruby_vm/scripts/insns2vm.rb でヒアドキュメントのインデント除去つきの <<~ が利用されていたので、2.2 以前の ruby でも動くように通常の << によるヒアドキュメントを使うように修正しています。

svn: r61742 2018-01-10 00:41:11 +0900

version.h の日付更新。

svn: r61743 2018-01-10 00:41:11 +0900

svn property の設定ですが、どれに反応したんだろう?

naruse: r61744 2018-01-10 00:47:53 +0900

VM ソース生成ツールの tool/ruby_vm/views/optinsn.inc.erb の Enumerable#grep_v も 2.3 からのメソッドなので Enumerable#reject を利用するように書き換えています。

svn: r61745 2018-01-10 00:47:54 +0900

svn property の設定ですが、これもどれに反応したんだろう?

ko1: r61746 2018-01-10 01:27:50 +0900

tool/ruby_vm/views/_insn_stack_increase.erb で生成する C ソースで各 VM 命令の VM スタックサイズの変更量を char 型の変数に受けるようにしていましたが、signed char と符号ありであることを明示的に宣言するようにしています。

svn: r61747 2018-01-10 01:27:51 +0900

これも svn property の設定。これは tool/ruby_vm/ のファイル群の mode かなにかを編集されたものを都度書きかえているのかなぁ。