ruby-trunk-changes r62332 - r62347

今日は Hash リテラルへの ** での展開で SyntaxError になることがあった不具合の修正や、MJIT 用のヘッダ変換処理の修正や JIT コンパイル時の処理の修正、リファクタリングなどがありました。

k0kubun: r62332 2018-02-09 22:14:17 +0900

r62332 の AIX の CI 対策の tool/transform_mjit_header.rb の修正で変数名 typo していたのを修正しています。

nobu: r62333 2018-02-09 23:09:58 +0900

compile.c の引数リストや配列リテラルなどを処理する compile_array() で popped が真の時に VM スタックの一貫性が崩れて compile error になる不具合があったのを修正しています。たぶんどこかの時点で最適化が入って不要な値をスタックにのせるのを省いた時に対応が漏れてたとかかなと思うけど、どの変更の影響かわからない…。 [ruby-core:85486] [Bug #14459]

nobu: r62334 2018-02-10 00:21:18 +0900

mjit.c の convert_unit_to_func() で一時ファイルを fopen(3) で開く前に rb_cloexec_open() で O_EXCL と O_CREAT フラグをつけて開くことで、うっかり既存のファイルを開いてしまわずに必ず新規のファイルを開いたことを確認するようにしています。しかしその後で結局 fopen(3) で開いた FILE を使ってるので、このわずかなタイミングでファイルを消されて別のファイルが置かれる可能性はあるような。

nobu: r62335 2018-02-10 00:21:19 +0900

mjit.c でコンパイラ起動するための子プロセスで umask(0077) を実行して他のユーザーから生成するファイルがアクセスされないようにしています。

svn: r62336 2018-02-10 00:21:19 +0900

version.h の日付更新。

usa: r62337 2018-02-10 00:28:09 +0900

mjit.c の compile_c_to_so() で mswin 版でファイルパスを組み立てるところで、append_str() というマクロで第2引数に char * 型のポインタである so_file を渡していたので、文字列サイズを渡す append_str2() を使うように修正しています。append_str() は sizeof() で文字列長を取ってるので、第2引数がリテラルの時を想定しているみたいなので。

nobu: r62338 2018-02-10 10:07:04 +0900

mjit.c の rb_cloexec_open() で C のソースファイル用にファイルを rb_cloexec_open() で開く時のフラグに O_BINARY があれば追加するようにしています。

nobu: r62339 2018-02-10 10:23:47 +0900

mjit.c の convert_unit_to_func() のリファクタリング。 clang 版で .gch ファイルのパスをエスケープを考慮しつつ1文字ずつ書き出しているところを fptintf(3) のかわりに fputc(3) を使うようにしています。また suffix の ".gch" を削るのをループの条件部でやっていたのを、あらかじめ位置を検索しておいて終了位置のポインタを作っておくようにしてループの条件部を軽量化しています。

nobu: r62340 2018-02-10 10:28:51 +0900

mjit_compile.c で生成する C のソースコードに親の body->iseq_encoded のポインタを %p で埋め込んで変数に保存しておいて、テンプレートから生成する部分で位置計算後のポインタを埋め込むかわりにこの変数を元にポインタ演算する式を展開するようにしています。

nobu: r62341 2018-02-10 10:55:47 +0900

mjit.c で一時ファイルのパスの組み立て用に append_lit() という、追加する文字列サイズを rb_strlen_lit() で得るマクロ(内容的には append_str() の時と同じだと思うのですが…)を追加して、第2引数に文字列リテラルを使う場合はこっちを使うようにしています。
append_lit() を追加して使いわけるなら append_str() は strlen() で文字列長を数えるようにしてもいいような気が、と思ったけどそうか第2引数が配列(char v[] のような)の時にも使えるのか。

ktsj: r62342 2018-02-10 15:02:37 +0900

.gdbinit の print_lineno コマンドの実装に get_infns_info() の実装が succinct bitvector を使った時の対応を追加しています。

nobu: r62343 2018-02-10 15:22:38 +0900

ビルド時に mjit_config.h という MJIT_CC などの定数を定義マクロを定義するヘッダを生成して、mjit.c でこの定数から利用するコンパイラを決めるようにしています。ruby 本体のコンパイルに使ったコンパイラJIT 時にコンパイルするのは同じコンパイラでないといけないので。ただなんか他にも mjit.c のリファクタリングがごっそり入ってる感じですね。

nobu: r62344 2018-02-10 15:38:18 +0900

MJIT 用のヘッダを minimize する時のルールで複数 architecture 対応のヘッダを作る時1つのヘッダ内で #ifdef の分岐をしてから各 architecture 用のヘッダを #include する方式に変更しています。

nobu: r62345 2018-02-10 15:42:35 +0900

tool/vcs.rb の VCS::GIT#commit のオプション引数に :dry_run というオプションの対応を追加して、これまで $DEBUG が真の時に git commit の -n オプションを追加していたのを、この :dry_run オプションの値に応じて追加するようにしています。

nobu: r62346 2018-02-10 19:07:40 +0900

mjit.c の文字列の配列の型に const 修飾子を追加(ポインタではなくて中身の文字列部分のほうにかかるやつ、多分)しています。

nobu: r62347 2018-02-10 19:07:41 +0900

make mjit_config.h で環境変数などで V=1 が指定されてたら生成する mjit_config.h の内容もメッセージに出力するようにしています。