ruby-trunk-changes r62281 - r62306

今日も主に MJIT の不具合修正やヘッダ変換の処理の修正などがありました。

nobu: r62281 2018-02-07 22:26:09 +0900

mjit.c の get_uniq_filename() で一時ファイルの名前を格納するバッファが固定長で足りない可能性があったので、sprint_uniq_filename() で(というか snprintf(3) で)必要なサイズを調べてから xmalloc() でヒープ上に確保するようにしています。元は sprintf(3) だったので一時ディレクトリのパスのサイズによってはバッファオーバーランの可能性があったようですね。

k0kubun: r62282 2018-02-07 22:27:42 +0900

.gitignore に mjit 用の minimize したヘッダを無視するように追加しています。

nobu: r62283 2018-02-07 22:41:32 +0900

mjit.c の一時ファイルを生成するパスを作るための tmp ディレクトリのパスが環境変数 TMP をみるだけであとは "/tmp 決め打ちになってたので、rb_w32_system_tmpdir() や confstr() など環境に応じて適切な方法で一時ディレクトリのパスを取得するように system_tmpdir() という関数を導入しています。

nobu: r62284 2018-02-07 22:45:14 +0900

r62260 や r62269 の common.mk での mjit 用ヘッダの minimize のアクションでヘッダのインストールのため miniruby を使ったスクリプトを直に書いてたのを MAKE_LINK という変数にまとめています。そして defs/gmake.mk の $(MJIT_MIN_HEADER のルールでもこの変数をコマンドに使うようにしています。

k0kubun: r62285 2018-02-07 22:48:48 +0900

Solaris 上での Oracle Developer Studio や Fujitsu Compiler などでビルドした時に mjit 用ヘッダの生成がエラーになるのを修正しています。 サポートできるコンパイラかどうかをホワイトリスト方式で? チェックして未対応と判定したらあきらめて MJIT 無効の状態でビルドは進めるようにしているのだと思います。 [ruby-core:85392] [Bug #14446] [ruby-dev:50469] [Bug #14447]

kazu: r62286 2018-02-07 22:57:07 +0900

error.c の nometh_err_initialize_options() で条件演算子で RTEST() の結果で Qtrue もしくは Qfalse を使うようにしているところがありましたが、この変数 priv は代入の時点でも同じように条件演算子で Qtrue または Qfalse のどちらかが代入されるようにしてあったので、そのまま参照するように修正しています。

k0kubun: r62287 2018-02-07 23:01:51 +0900

r62285 の追加修正。コンパイラのチェックのためマクロの定義有無をチェックするところで正規表現リテラルに埋め込んでいる文字列を Regexp.escape でエスケープしておくようにしています。

k0kubun: r62288 2018-02-07 23:08:24 +0900

r62283 で mjit.c に導入した system_tmpdir() ですが環境変数から一時ディレクトリパスを得る時に、TMPDIR も TMP もみつからなかった時に最終的に文字列リテラルを代入してるところで const 修飾子が無効になるという警告が出てたので、その時は tmpdir を使いまわさず直接 return するようにしています。

nobu: r62289 2018-02-07 23:13:57 +0900

mjit.c のインデントにタブが入ってるところがあったので展開しています。

k0kubun: r62290 2018-02-07 23:25:03 +0900

tool/transform_mjit_header.rb で mjit 用ヘッダを minimize する時にコンパイラによる展開が失敗した時のメッセージをより強化して、変換前後のヘッダファイルの内容をダンプするようにしています。 AIX 上の gcc でビルドが失敗しているようで、それを調査するためみたいです。

k0kubun: r62291 2018-02-08 01:15:21 +0900

テストファイル test/ruby/test_jit.rb を追加して MJIT を使った実行のテストを少し追加しています。

svn: r62292 2018-02-08 01:15:22 +0900

version.h の日付更新。

svn: r62293 2018-02-08 01:15:22 +0900

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

k0kubun: r62294 2018-02-08 01:28:17 +0900

r62291 で追加した test/ruby/test_jit.rb で MJIT のデバッグメッセージ(?)のチェックを MJIT が有効な時だけ行なうように修正しています。

k0kubun: r62295 2018-02-08 01:39:17 +0900

MJIT のテストのためには make install しないといけない(MJIT 用の minimize したヘッダファイルの探索がインストールディレクトリにないと対応していないため)ので、.travis.yml で一時ディレクトリに make install するようにしています。

k0kubun: r62296 2018-02-08 01:56:59 +0900

error.c の rb_assert_failure() の宣言に MJIT_FUNC_EXPORTED をつけて MJIT 用に export するようにしています。 VM_CHECK_MODE が 1以上の時だけ参照しているようです。

k0kubun: r62297 2018-02-08 09:55:33 +0900

r62291 で追加した MJIT のテストですがいくつかの CI 環境でうまく通らないみたいなので一旦 revert しています。

nobu: r62298 2018-02-08 11:00:21 +0900

r62281 で mjit.c で一時ファイル名の生成のために snprintf(3) でまずサイズを確認してからメモリ確保しなおしてましたが、メモリ確保した後の sprint_uniq_filename() でも再度固定長のバッファに書き出そうとしてしまっていたので、確保したメモリ領域に書くように修正しています。

nobu: r62299 2018-02-08 11:08:26 +0900

win32/ifchange.bat に --color というオプションを追加しています。本当に色付けするわけではなくて tool/ifchange との互換性のためにつけたということみたいです。

nobu: r62300 2018-02-08 11:08:27 +0900

そして tool/ifchange と win32/ifchange.bat に --debug オプションを追加しています。 tool/ifchange は set -x で shell のトレース出力(っていうのかな)を有効にして、win32/ifchange.bat では echo on というのをしているようです。

nobu: r62301 2018-02-08 16:14:52 +0900

rubygems のテストで bundler のバージョンを取得するために gem コマンドを起動しているところで、ruby 本体でのテストのためにファイルパスの決定方法を修正しています。

usa: r62302 2018-02-08 16:23:21 +0900

r62301 の追加修正。 Gem::USE_BUNDLER_FOR_GEMDEPS という定数を参照してこれが偽の時は bundler 用のテストをスキップして BUNDLER_VERS 定数のセット自体を不要にしています。

usa: r62303 2018-02-08 16:34:41 +0900

と思ったら r62302 は revert されて、BUNDLER_VERS を "1.16.1" に固定しています。うーむ、どういうことだろう。定数の参照されてる場所をみてもよくわかりませんが、多分 bundler が ruby にバンドルされてた時にはここのバージョンを揃えておかないといけなかったので、その名残りがあった、とかかなぁ。

nobu: r62304 2018-02-08 16:49:41 +0900

common.mk で mjit 用のヘッダの依存関係を timestamp ファイルを導入して解決しています。

nobu: r62305 2018-02-08 16:49:42 +0900

thread.c の do_select() で struct timespec 型の変数が gcc 7 以降で未初期化の警告が出てしまうということで、 __GNUC__ が 7 または 8 の時だけ初期化子で初期化するようにしています。

nobu: r62306 2018-02-08 17:09:49 +0900

r62268 で File::NULL の内容を得るために mjit.c で file.c の変数を参照するため extern 宣言していたのを internal.h ヘッダに移動しています。