ruby-trunk-changes r66168 - r66197

今日は Process.spawn である特別な状況で MJIT がコンパイラを起動するのと競合して fork 後の execve がエラーになることがある不具合の修正や、BigDecimal() の exception: キーワード引数追加、文字列リテラルの要素からなる配列リテラルVM 命令の最適化などがありました。

nobu: r66168 2018-12-03 22:12:29 +0900

.gitignore に /exe/goruby を追加しています。

nobu: r66169 2018-12-03 22:12:34 +0900

tool/update-deps で coroutine/ サブディレクトリも検査するようにして make update-deps で common.mk の依存関係を更新しています。

ko1: r66170 2018-12-03 22:39:42 +0900

NEWS ファイルに TraecPoint#enable のキーワード引数 target: と target_line: について追記しています。

normal: r66171 2018-12-04 04:49:54 +0900

Process.spawn のテストで実行用のファイルを書き出して作ってから Process.spawn するものが MJIT が有効だと時々落ちるという不具合の修正。コミットログにシーケンス図的なものが書かれていますが、MJIT も worker thread からコンパイラを起動するために vfork+execve するので、main thread というか Ruby の Thead 側で書き込みのために開いたファイルの fd が MJIT worker thread からのコンパイラ起動のための vfork 時に子プロセスに複製されてて、execve() する時に close-on-exec で閉じられるのですが、その前に main thread 側で Process.spawn の vfork+execve が動いてしまうと、main thread 側では対象のファイルの fd は閉じているのですが、MJIT worker thread から fork したプロセスに fd が残っているため、execve(2) が ETXTBUSY (実行ファイルを書き込みモードで開いている fd がある)でエラーになる可能性があったようです。すごいなー。waitpid の独自実装用のキューを利用して同時に fork しないように排他処理を追加しています。

svn: r66172 2018-12-04 04:49:56 +0900

version.h の日付更新。

normal: r66173 2018-12-04 06:00:32 +0900

r66171 の修正でなぜか waitpid_lock の参照のためにさきに rb_vm_t* の変数に格納するようにリファクタリングしていたのが -Wclobbered で警告が出てしまうそうなので、最終的に必要な waitpid_lock への参照を直接変数に格納しておくようにしています。

tenderlove: r66174 2018-12-04 08:53:11 +0900

r66106 文字列を要素とする配列リテラルで duparray を使うようにコンパイルする VM 命令の最適化のリトライ。前は peephole optimization で putobject+newarray を変換する最適化をしていましたが、そもそも compile_array() で文字列リテラルが frozen_string_literal: true が指定されてたら duparray を使うようにコンパイルされるように static_literal_value() や static_literal_node_p() に手を入れています。

svn: r66175 2018-12-04 08:53:16 +0900

r66174 のインデントのタブを空白に展開。

naruse: r66176 2018-12-04 09:40:48 +0900

r66160 の続き。 rubyspec の File.expand_path のテストでホームディレクトリの取得に echo を使ってたのを Dir.home を参照するようにしています。

naruse: r66177 2018-12-04 09:40:49 +0900

これも r66160 の続きで rubyspec の Dir.home のテストで solaris では echo で ~username を展開させるんじゃなくて getenv コマンドを使うようにプラットフォームで分けるようにしています。こっちは Dir.home 自体のテストだから Dir.home 使うわけにいきませんからね。

nobu: r66178 2018-12-04 10:41:55 +0900

r66171 およびそれが -Wclobbered でコンパイラ警告が出るのに対処しようとした r66173 でもまだ不完全だったようで、変数に const 修飾子を加えてさらに while() ループのブロック内にこれをコピーする変数も追加しています。 fork()/vfork() がブロック内にあるからなんだと思いますがいつものこ警告は解決が難しいですね。

nobu: r66179 2018-12-04 11:24:15 +0900

メソッドの引数が 0個または 1個の時に rb_scan_args() を使ってたところで結果の格納が不要なものや arity だけで判定できるものは rb_check_arity() を呼ぶようにリファクタリングしています。

duerst: r66180 2018-12-04 13:11:51 +0900

String#each_grapheme_cluster などでの絵文字の分割のテストで絵文字を "A" と "Z" で挟んだ文字列を使ってたのをタブ("\t")で挟むように変更しています。より自然な文字に、とのことだけど A Z でもいいような気はする。

mrkn: r66181 2018-12-04 13:22:06 +0900

r66155 で revert されてた Symbol#to_proc で暗黙の変換されるブロック引数に Refinements がきかないことがある不具合の修正。 なんですがこれもやっぱり次で revert されています。 [ruby-dev:50638] [Bug #15114]
聞くところによると git-svn によるコミットで accidental に入っちゃったみたいです。

mrkn: r66182 2018-12-04 13:22:08 +0900

r66181 を revert しています。今回も VM_CHECK_MODE が 2以上の時の VM_ASSERT() にひっかかるようです。 [ruby-dev:50638] [Bug #15114]

mrkn: r66183 2018-12-04 13:22:09 +0900

拡張ライブラリ bigdecimal を upstream の 1.4.0.pre-20181204a に更新しています。 Kernel#BigDecimal() にキーワード引数 exception: を追加して、不正なフォーマットの文字列など変換できない引数だった時に例外にせずに nil を返すことができるようにしています。

svn: r66184 2018-12-04 13:22:12 +0900

r66183 のインデントのタブを空白に展開。

duerst: r66185 2018-12-04 15:31:40 +0900

絵文字の grapheme cluster 分割のテストで codepoint 0x1F3FB から 0x1F3FF のものは肌の色を指定するもの? (skin tones)のため前の文字に結合する性質がある? みたいでテストから除外しています。

usa: r66186 2018-12-04 15:53:05 +0900

mjit.c で const char ** な cc_common_args という変数を memcpy(3) や free(3) の const ではない引数に渡していて警告が出ていたのでキャストするようにしています。

naruse: r66187 2018-12-04 16:52:08 +0900

r66177 の rubyspec の Dir.home のテストの getent のコマンドライン引数に ~ が混じってたので削除。

hsbt: r66188 2018-12-04 17:00:57 +0900

rubygems に upstream の最新版をマージしています。

kazu: r66189 2018-12-04 17:22:10 +0900

標準添付ライブラリで String#sub で文字列の先頭を置換というか削る処理をしているところを String#delete_prefix を利用するようにリファクタリングしています。

nobu: r66190 2018-12-04 18:16:49 +0900

array.c の配列オブジェクトの先頭または末尾から要素を取り出す ary_take_first_or_last() という static 変数で rb_scan_args() のかわりに rb_check_arity() を使うようにして Array#first や Array#last で余計な引数が渡された時に発生する ArgumentError のメッセージを変更しています。

k0kubun: r66191 2018-12-04 18:37:23 +0900

AppVeyor で除外するテストに Array のテスト test_unshift_over_ary_max テストメソッドのものを追加しています。メモリを多く使うのでつらいらしい。

duerst: r66192 2018-12-04 19:49:55 +0900

Unicode の grapheme cluster や正規表現の \X でのマッチのテストで COMBINING DIAERESIS という codepoint を使ってたところを一部 COMBINING DIAERESIS BELOW に変更しています。ウムラウトのようなアクセント記号の一種みたいです。出力をみやすくするためとのこと。

duerst: r66193 2018-12-04 19:51:57 +0900

r66192 の変更漏れ修正。

nobu: r66194 2018-12-04 20:16:11 +0900

r66124 の bigdecimal の更新で extconf.rb で生成する Makefile で不要な ls/dir が実行されるようになってたので削除するようにしています。

nobu: r66195 2018-12-04 20:16:14 +0900

同じく bigdecimal の extconf.rb で生成する Makefile に依存関係を追加してたのを普通に depend ファイルに記述するようにしています。そのための gemspec ファイルのファイル名を変数定義として Makefile に出力するようにしています。

nobu: r66196 2018-12-04 20:16:15 +0900

bigdecimal の extconf.rb で libruby-bigdecimal というライブラリを linker option に追加するようにしていたのをやめています。サブディレクトリの bigdecimal/util の extconf.rb では親ディレクトリの共有ライブラリとリンクするように書き換えています。

k0kubun: r66197 2018-12-04 20:45:05 +0900

r65904 の rubygems の更新で r65722 で一部タイムアウトを MJIT が有効な時に引き上げたのが revert されてしまっていたので再度適用しています。