ruby-trunk-changes r62025 - r62039

今日は Kernel#system で子プロセスの異常終了時に例外を発生させるようにする :exception オプションの追加などがありました。

k0kubun: r62025 2018-01-24 23:11:25 +0900

Kernel#system のオプション引数に :exception を追加して、これに真を指定したらエラー時に false を返すかわりに例外を発生させるようにしています。 実装上は Process.spawn などと同じ exec 族のオプション struct rb_execarg にメンバーを追加していますが、実際に利用するのは Kernel#system の時だけだと思います。 https://github.com/ruby/ruby/pull/1795 [ruby-core:85013] [Feature #14386]

k0kubun: r62026 2018-01-24 23:31:40 +0900

r62025 の Kernel#system の :exception オプションの追加について rubyspec のテストと NEWS のエントリを追加しています。rubyspec は version の guard がないと古いバージョンでエラーになりそう(upstream に入れる時は)。そういえば rubyspec は rubyリポジトリに埋め込まれるようになったけど、安定版ブランチに入ったものは upstream に追随し続けるのか、安定版ブランチ内で独立してメンテするのか、どっちなんだろう……。

normal: r62027 2018-01-25 05:50:29 +0900

ruby.c の open_load_file() でブロック内で外のスコープと同名の変数を宣言していたのを、宣言をやめて同じ変数を使いまわすようにしています。

svn: r62028 2018-01-25 05:50:30 +0900

version.h の日付更新。

normal: r62029 2018-01-25 06:07:14 +0900

r61906 から r61910 でいくつか変数を include/ruby/ruby.h で明示的に extern していましたが、C-API として公開が不要なものは static をつけて非公開にするようにしています。 [ruby-core:84953] [Misc #14381]

normal: r62030 2018-01-25 07:39:56 +0900

encoding.c でエンコーディング名の文字列を OBJ_FREEZE() で freeze していたのを rb_fstring() や rb_fstring_cstr() を使うことで dedup するようにしています。

normal: r62031 2018-01-25 07:40:01 +0900

vm.c の thread_free() で th->altstack の解放を free(3) を呼ぶ前に NULL チェックしていましたが、free(3) は NULL を受け付けるのでチェックを削っています。

nobu: r62032 2018-01-25 08:17:20 +0900

標準添付ライブラリ optparse の OptionParser#summarize で行のデリミタとして $/ を参照してたのを nl という変数に変えてるんですが、nl の初期化がないような……。

kazu: r62033 2018-01-25 09:11:52 +0900

この度 CRuby の C のソースコードのインデントがスペースのみ使う方針に開発者会議で決められたそうなので、.editorconfig にその設定を反映させています。これまでは tab=8 でインデントの深さは 4 (空白とタブが混じる)みたいなルールだったと思いますが、徐々に混在しているので、統一しとこうってことですが、一気に変えるんじゃなくて、別の修正で変更する時にその箇所のインデントをこれにそろえよう、ということになったみたいです。 [ruby-core:84498] [Bug #14246]

ko1: r62034 2018-01-25 09:42:08 +0900

ということでやっぱり nl の代入が漏れてたみたいで r62032 を一旦 revert しています。

nobu: r62035 2018-01-25 10:48:41 +0900

r62032 のリトライ。 nl の代入を追加しています。

eregon: r62036 2018-01-25 18:50:29 +0900

rubyspec で File#chmod や File.chmod、File.umask の mode の範囲が異常だった時のテストを環境によって細かく分岐して mode_t のサイズに依存した境界値のテストをしていましたが、1つにまとめて非常に絶対値が大きい整数での例外発生だけ確認するようにしています。 [ruby-core:84933] [Bug #14375]

eregon: r62037 2018-01-25 18:50:41 +0900

r62036 の続き。 File.umask のテストで 1つにまとめた spec の位置を移動しています。似たテストをまとめるように移動したみたいです。

nobu: r62038 2018-01-25 20:21:47 +0900

拡張ライブラリ openssl の OpenSSL::Buffering の do_write, puts などのメソッドで改行コードとして特殊変数 $/ を参照していたのをやめて常に "\n" を使うようにしています。これは $/ の廃止に向けて警告を出すようにする変更への準備でしょう。[追記]$/ の警告出そうとして検索しててみつけたみたいですが、そもそも $/ は入力を行分割する時のデリミタなので出力時に使うのは単に誤りだった、ということだそうです。[/追記]

nobu: r62039 2018-01-25 21:00:00 +0900

compile.c の iseq_peephole_optimize() でコンパイルした VM 命令列の最適化時に freezestring 命令の次に send 命令があったら、すぐに dup されてしまうので freezestring 命令を削除して fstring の確保をスキップするようにしています。うーんコメントなどをみるに String#+@ の呼び出しの時に dup されるから…というふうにみえるのですが、引数がない send ということまでしかチェックしてなくて +@ メソッドであるということはみていないですね。これでいいのかな? 無引数のメソッドの receiver が常に dup されるってことはないですよね。