ruby-trunk-changes r62250 - r62280

今日も主に MJIT のビルド時(ヘッダの生成/変換時)の環境によるエラー修正や、MJIT コンパイル時(実行時のJITコンパイル)の fd の処理の修正などがありました。

kazu: r62250 2018-02-06 21:40:41 +0900

tool/transform_mjit_header.rb の正規表現で不要なかっこ(grouping)があったのを削っています。

nobu: r62251 2018-02-06 22:23:25 +0900

mjit.c に r62248 で導入した build_header_path() で最後の append_str2() の結果が未使用という警告が出てたそうなので、不要ではあるけど再代入するようにしています。

k0kubun: r62252 2018-02-06 22:47:02 +0900

tool/transform_mjit_header.rb でエラー時にコンパイラの出力を STDERR に出してたのを一旦 pipe を使って読み込んで、もうすこし別りやすい出力をするようにしています。 AIX でのビルドエラーの調査のためみたいですね。

kazu: r62253 2018-02-06 22:58:04 +0900

mjit.c の get_string() の定義に NULL がかえることがあると書かれてましたが、ruby_strdup() を使ってて ruby_xmalloc() でメモリ確保するので NULL がかえることはない(例外が発生する)のでコメントを修正しています。

k0kubun: r62254 2018-02-06 23:07:57 +0900

vm_args.c と mjit_compile.c でそれぞれ定義されていたマクロ IS_ARGS_SPLAT() と IS_ARGS_KEYWORD() の定義を vm_insnhelper.h に移動しています。また vm_args.c に定義されていた CALLER_SETUP_ARG() もついでに(?)移動しています。

k0kubun: r62255 2018-02-06 23:27:15 +0900

mjit_compile.c が生成する C のソースコードのスタイルとインデントを整形しています。

nobu: r62256 2018-02-06 23:45:11 +0900

common.mk で MJIT 用のコンパイラオプションを MJIT_CPPFLAGS という変数にしておくようにしています。
MJIT_MIN_HEADER 変数の代入が MJIT_HEADER_BUILD_DIR の代入より前になっているのは、Makefile ってこういうの大丈夫なんでしたっけ。

k0kubun: r62257 2018-02-06 23:58:12 +0900

r62252 の tool/transform_mjit_header.rb のエラーメッセージ強化で exit false が抜けてたのを修正。

k0kubun: r62258 2018-02-07 00:19:10 +0900

mjit.c で fopen() が NULL を返した時のエラー処理が抜けてたのを修正しています。チケットのほうは chroot すると動かなくなるということで、実行時に JITコンパイルのためにヘッダが必要なので、そりゃそうだなぁ……。ただエラーになるのはまずいので JIT が無効になるだけになるように、ということだと思います。 [ruby-core:85378] [Bug #14441]

svn: r62259 2018-02-07 00:19:11 +0900

version.h の日付更新。

nobu: r62260 2018-02-07 00:31:10 +0900

common.mk の MJIT 用ヘッダファイルの architecture 毎のものに変換するところで miniruby を使ってファイルをコピー(インストール)する処理を書いていいます。

nobu: r62261 2018-02-07 00:55:12 +0900

r62256 で切り出した common.mk の変数 MJIT_CPPFLAGS を CPPFLAGS に追加しないようにしています。拡張ライブラリのビルド時に使わないようにするためとのこと。

nobu: r62262 2018-02-07 01:03:10 +0900

mjit.c で MJIT 用ヘッダファイルを探索するのに MJIT_HEADER_BUILD_DIR を参照するようにしていたのを削って、インストールしたヘッダファイルのみ探索するようにしているようです。

nobu: r62263 2018-02-07 01:03:11 +0900

make clean-local で MJIT 関連のヘッダファイル群を削除するようにコマンドを追加しています。

k0kubun: r62264 2018-02-07 01:03:14 +0900

MJIT_FORCE_ENABLE というマクロを定義してビルドすると常に --jit オプションが指定されたように扱うようにしています。

k0kubun: r62265 2018-02-07 01:16:25 +0900

MJIT で実行時にコンパイルするために生成する C のソースファイルと同様にヘッダファイルも _ruby_mjit という prefix をつけるようにしています。

k0kubun: r62266 2018-02-07 01:57:46 +0900

mjit.c で出力を捨てるための null device を "/dev/null" と決め打ちで書いてたのを File::NULL の定数を参照してこれを使うようにしています。

usa: r62267 2018-02-07 03:59:18 +0900

mswin 環境向けに MJIT で利用するコンパイラオプションや生成するソースコードを修正しています。コミットログにも WIP とありますが cl.exe で MJIT するのかなり大変そうな様子でした。

nobu: r62268 2018-02-07 08:40:19 +0900

r62266 で mjit.c で rb_const_get() で File::NULL の内容を取得していましたが、直接 file.c の変数を参照するようにしています。

nobu: r62269 2018-02-07 08:40:20 +0900

r62260 で MJIT 用ヘッダの architecture 毎の生成のコマンドで miniruby を使ったヘッダのインストールをしていたところで、例外を rescue しているところで NotImplementedError も rescue するようにしています。 NotImplementedError は StandardError を継承していないので指定なしの rescue では捕捉されないのでした。

marcandre: r62270 2018-02-07 08:47:49 +0900

標準添付ライブラリ matrix の Matrix#elements_to_f, #elements_to_i, #elements_to_r などの deprecated になっているメソッドに rdoc 用コメントを追加しています。 こんなメソッドあったのか。 [ruby-core:73567] [Feature #12032]

marcandre: r62271 2018-02-07 08:52:30 +0900

標準添付ライブラリ ostruct で OpenStruct のインスタンスが freeze されていた時のエラーを捕捉して RuntimeError で投げ直していたので、FrozenError 発生させるように修正しています。 https://github.com/ruby/ruby/pull/1808

normal: r62272 2018-02-07 10:57:14 +0900

thread.c, thread_pthread.c などで時間の表現として struct timeval を標準的に使うようにしていましたが、struct timespec を使うほうが変換が少なくてすむということで、struct timespec を内部で使うようにしています。 [ruby-core:85416] [Feature #14452]

usa: r62273 2018-02-07 12:21:28 +0900

r62267 のさらに続き。 mswin 環境での MJIT サポートのためのコンパイラオプションの変更を分岐を減らすリファクタリングと、メモリ解放の位置を修正しています。

usa: r62274 2018-02-07 13:04:33 +0900

internal.h で extern 宣言されていた ruby_engine という変数の宣言を削除しています。また ruby.c に #include "ruby/version.h" を削除しています。 include/ruby/version.h に ruby_engine は宣言されているので、これを取り込むためですかね。

nobu: r62275 2018-02-07 15:14:56 +0900

r62272 で thread.c や thread_pthread.c などで利用している時間の表現を struct timeval から struct timespec に変更しましたが、tv_usec と tv_nsec の型の違いのため明示的なキャストを追加しています。また一部の条件でのみ利用される変数の宣言をその条件のブロック内に移動して警告除去しています。

nobu: r62276 2018-02-07 15:49:32 +0900

r62275 のさらに続き。 tv_usec は suseconds_t という型なのですが、どれだけの精度があるかわからない(規格的に決められていない)ので int32_t にキャストするようにしています。うーんでも 10**6 が入るサイズなのはまずまちがいないわけで suseconds_t へのキャストだとだめなんでしょうか?
[追記]mswin 環境で suseconds_t が未定義だったためコンパイルエラーになるので、必要な(おそらく)精度のあるint32_t で代替したということだそうです。[/追記]

nobu: r62277 2018-02-07 16:29:02 +0900

r62268 で file.c の変数 ruby_null_device を mjit.c で extern 宣言しているところで変数の型がちょっと間違ってたので修正しています。

nobu: r62278 2018-02-07 16:48:24 +0900

mjit.c で子プロセスに渡す fd のために fopen(3) で開いた FILE* を fclose() で閉じてしまってたので、閉じないようにして、vfork(2) 後に close(2) で閉じるようにしています。また fopen(3) で FILE 構造体を作ってしまってたので rb_cloexec_open() で fd だけ作るようにしています。

nobu: r62279 2018-02-07 17:14:15 +0900

mjit.c の init_header_filename() でヘッダファイルが開けるかの確認で fopen(3) で開いてみて確認していたのを rb_cloexec_open() で開いて fd だけでチェックするようにしています。

k0kubun: r62280 2018-02-07 20:44:36 +0900

r62279 の変更で #include Windows 環境でも必要になったので、preprocessor の分岐内で #include していたのを外に出しています。