ruby-trunk-changes r61936 - r61955

今日は parse.y のなかの ripper 向けの処理をコメント内で DSL で記述するようにする変更などがありました。

nobu: r61936 2018-01-19 00:48:55 +0900

compile.c の ibf_dump_object_list() で VALUE の配列を確保するのに rb_ary_tmp_new() を直接呼んでいたのを ALLOCV_N() を使うようにしています。 どちらも Array オブジェクトにバッファをもたせることで GC でメモリ解放をまかせることができるようにしていますが、ALLOCV_N() のほうが小さいサイズならスタックに確保したり、ALLOCV_END() でバッファを解放できたりして高機能なので。

svn: r61937 2018-01-19 00:48:56 +0900

version.h の日付更新。

shyouhei: r61938 2018-01-19 10:45:36 +0900

INFINITY という定数マクロがよく参照されていますが、これは float 型の数値として定義されてるそうなので、CRuby で Float の実装として使っている(即値化されている flonum 以外で) double の時の定数として HUGE_VAL というのがあるそうでこっちを使うように変更しています。 また NAN も float なので nan() を使うようにしています。へー、知らなかった。

nobu: r61939 2018-01-19 11:36:32 +0900

vm_insnhelper.c の vm_check_keyword() で kw_bits が T_FIXNUM の範囲に収まらなかった時に条件が反転していた不具合があったのを修正しています。 r58390 の変更の修正とのこと。 [ruby-core:84921] [Bug #14373]

nobu: r61940 2018-01-19 12:09:24 +0900

r61939 に追加して、キーワード引数が 32 個を超えると正しく引数を参照できなくなる不具合を修正しています。 [ruby-core:84921] [Bug #14373]

shyouhei: r61941 2018-01-19 12:19:58 +0900

iseq.c で struct succ_index_table という型の構造体の宣言に変数の定義も同時にされていましたが、この succ_index_table という変数は参照されていなかったので削除しています。

shyouhei: r61942 2018-01-19 12:55:16 +0900

st.c の st_hashtype_num という変数に static 修飾子を追加しています。

shyouhei: r61943 2018-01-19 12:57:53 +0900

gc.c の ruby_gc_debug_indent という変数の定義は RUBY_MARK_FREE_DEBUG が有効な時だけ利用するので preprocessor の分岐でくくるようにしています。

shyouhei: r61944 2018-01-19 12:59:13 +0900

vm_insnhelper.c の vm_getivar() で if 文の内で return してなおかつ goto 文を使って別の分岐からジャンプするような書きかたがされているところがありましたが、if 文の後に括り出すようにしています。 gcc が -Wjump-misses-init というオプションをつけると警告していたそうです(誤検出だったみたいですが)。

nobu: r61945 2018-01-19 13:23:59 +0900

r61940 の再修正。 KW_SPECIFIED_BITS_MAX を 32 と定義していましたが VALUE が 32bit の環境では Fixnum は 31bit までしか表現できないので -1 しています。 [ruby-core:84921] [Bug #14373]

shyouhei: r61946 2018-01-19 14:18:18 +0900

enum defined_type に値 0 として DEFINED_NOT_DEFINED という定数の定義を追加して、0 初期化していたところをこの定数を利用するようにリファクタリングしています。

shyouhei: r61947 2018-01-19 16:07:49 +0900

array.c の rb_ary_product() で一時バッファのために rb_strtmp_new() を利用する tmpbuf() と tmpbuf_discard() というマクロを独自に定義して利用していましたが、ALLOCV_N() を利用するように書き直しています。r61827 のメモリアライメントをある型にそろえるようにするというのはここで struct RString::ptr が型は char * だけど異なる型の配列として利用するようにしていたので、そこを正しく指定できるようにするためだったみたいです(結局 struct RString::ptr についてはあきらめらめましたが)。

shyouhei: r61948 2018-01-19 16:16:54 +0900

r61947 の ALLOCV_N() を使うようにする変更を revert しています。 CI でエラーが検出されたとのこと。

shyouhei: r61949 2018-01-19 17:17:56 +0900

r61947 のリトライ。 t1 という変数の klass をクリアして内部オブジェクトにするのを削っています。 ALLOCV_N() でサイズが小さくて alloca() を使ってマシンスタック上に確保した時には t1 に 0 が代入されるため。また rb_alloc_tmp_buffer2() は T_IMEMO 型のオブジェクトを利用するので、klass のクリアは不要だったみたいです。

shyouhei: r61950 2018-01-19 18:12:06 +0900

ファイル操作関係で mode_t 型を使うべきところ int を使っていたところを修正しています。また configure.ac で RUBY_REPLACE_TYPE() というマクロで代替を探す時に short も対象にするように拡張して、mode_t の互換の型として unsigned short も候補にしています。実際 macOS では uint16_t なんだそうです。

mame: r61951 2018-01-19 19:26:12 +0900

parse.y のメソッド引数などの最後にカンマが余分にあった時のルールで ripper 向けのアクションに $$ への代入が抜けていた不具合を修正しています。とあるけど、excessed_comma というフックを呼び出すだけで $$ は new_args( ) の NODE そのままでいいっていうことなんじゃないかな。まあでも他のアクションみると dispatch1 の戻り値は $$ に入れるのが定石みたいですけど。

mame: r61952 2018-01-19 19:48:08 +0900

parse.y の ripper 向けのアクションを特別なコメントでくくって書いていたのを、同様なコメントでくくるけど ripper: ... のような DSL で記述して、それを ext/ripper/tools/dsl.rb という新規導入したツールで変換して ripper.y のアクションにするようにしています。

svn: r61953 2018-01-19 19:48:09 +0900

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

mame: r61954 2018-01-19 20:10:30 +0900

r61952 で新規追加した ext/ripper/tools/preproc.rb で parse.y の /*%c% ではじまるコメントを変換する処理は削っています。 DSL で代替の記法が導入されたので不要になったみたいです。

mame: r61955 2018-01-19 20:10:39 +0900

parse.y の new_command() という関数/関数マクロの定義を削除して本体向けと ripper 向けでそれぞれ異なる処理を直に書くようにしています。