ruby-trunk-changes r61305 - r61323

今日は File.open や File.read, File.binread, File.write などのメソッドで "|" ではじまる引数が渡された時に警告を出し、IO でも File でもない時はコマンド起動を抑制するようにする変更などがありました。

marcandre: r61305 2017-12-18 03:19:41 +0900

r61147 で追加された Integer#allbits?, #anybits?, #nobits? などのメソッドで引数の mask に to_int で Integer に変換する処理を追加しています。 [ruby-core:77251] [Feature #12753]

svn: r61306 2017-12-18 03:19:42 +0900

version.h の日付更新。

svn: r61307 2017-12-18 03:19:42 +0900

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

usa: r61308 2017-12-18 03:43:49 +0900

r60987 や r61055 の revision.h の生成時のルールで tool/file2lastrev.rb の実行のエラーを無視しないようにする変更ですが、BASERUBY がない時にはエラーになるのでやっぱりコマンドの前に - を入れて無視するように戻しています。

watson1978: r61309 2017-12-18 10:49:33 +0900

Hash オブジェクトで利用されている st_table を linked list 構造で管理して、直接 free() せずに再利用するようにすることで malloc()/free() を減らすようにしています。 ST_TABLE_POOL_MAX_LENGTH という定数(500 に定義されています)までは再利用するようにして、解放時にリストにある数がこれを超えてたら直接 free() するようにしています。これで Hash オブジェクトを頻繁に生成削除するようなケースで高速化するみたいです。 https://github.com/ruby/ruby/pull/1766 [ruby-core:84008] [Feature #14146]

nobu: r61310 2017-12-18 10:51:53 +0900

標準添付ライブラリ pp の rdoc 用コメントで require 'pp' するという部分を削っています。うーん、Kernel#pp はいきなり使えますけど、PP モジュールを参照するにはやっぱり require "pp" しないといけないのでは、と思ったけど rdoc のサンプルに PP モジュールを明示的に使った例ってないんですね。

nobu: r61311 2017-12-18 10:54:19 +0900

r61309 で "//" による行コメントが入ってたので C のコメントに変更しています。

nobu: r61312 2017-12-18 10:55:55 +0900

tool/vcs.rb で git svn dcommit に --add-author-from オプションをつけるようにしています。 コミットログに From: 行を追加するようにしているようです。このコミット自体にも同じオプションを使ったみたいですね。

mame: r61313 2017-12-18 11:44:36 +0900

2.5 の coverage の変更で式(文?)の途中で改行があるような場合に line coverage がうまく取れてなかったようなので修正されています。 [ruby-core:84294] [Bug #14191]

nobu: r61314 2017-12-18 12:38:20 +0900

io.c の open_key_args() で引数の扱いを整理して、rb_io_open_with_args() という関数は削除して常に rb_io_open() を利用するようにしています。 IO.open の open_args というキーワード引数が効いてなかったそうです。むしろそんな引数あったっけ…。

nobu: r61315 2017-12-18 13:12:06 +0900

r61314 の変更についてのテストを追加しているそうです。ってことはただのリファクタリングじゃなかったのかな?

nobu: r61316 2017-12-18 13:23:16 +0900

テスト用のユーティリティ EnvUtil の verbose_warning で $stderr をすりかえる文字列オブジェクトに flush メソッドも呼べるように特異メソッド定義を追加しています。

nobu: r61317 2017-12-18 13:32:54 +0900

rb_io_open() および rb_io_open_generic() の引数に klass を追加して、receiver が IO でなかった時に "|cmd" のような pipe 経由のコマンド起動を含むものが呼ばれたら警告を出力するようにしています。つまり File.open("|cmd") や File.write("|cmd") は IO のクラスメソッドを継承したものを呼んでいるのでコマンドを起動してしまうのですが、File の場合はコマンド起動しないほうが望ましいのでは? ということでとりあえず警告を出すようにしているようです。

ko1: r61318 2017-12-18 13:42:53 +0900

File.open に File::TMPFILE フラグを指定した時に Errno::EOPNOTSUPP という例外が発生することがある(O_TMPFILE がサポートされていない時)ようで rescue して skip するようにしています。

nobu: r61319 2017-12-18 16:10:15 +0900

r61317 で IO.binread の実装で誤って file 専用の open 用関数 rb_file_open_generic() を使ってしまっていたためコマンドが使えない状態になっていたので rb_io_open_generic() を使うように修正しています。

nobu: r61320 2017-12-18 16:15:07 +0900

r61317 の File.open などでコマンド起動時の警告するようにした変更で File 以外の IO を継承したクラスの場合は ArgumentError を発生させるようになってましたが、File の時のみ警告するようにして、それ以外は常に pipe を開かない(コマンドを起動しない)ようにしているようです。あれ、File はコマンド起動するままでいいのかな。[追記]なんと実際に File.open でパイプ経由コマンド起動を期待しているコードがあったみたいです。将来的には変更するにしても 2.5 リリース直前なので今はまずかろうということですね、多分。[/追記]
つまり IO と File 以外の IO を継承したクラスで、たとえば Socket.read("|cmd") とすると、実際に "|cmd" というパイプ文字をファイル名として含むファイルを読もうとするようです。

nobu: r61321 2017-12-18 16:39:05 +0900

r61320 で修正したテストですが Windows では "|" を含むファイル名は作れない? みたいで Errno::EINVAL も許容するようにしています。

normal: r61322 2017-12-18 17:54:30 +0900

標準添付ライブラリ webrick の gemspec のバージョンを 1.4.1 に更新しています。 [ruby-core:84285] [Bug #14189]

naruse: r61323 2017-12-18 18:03:59 +0900

include/ruby/ruby.h, include/ruby/intern.h, internal.h などで型が void の関数に const をつけていると警告が出ることがあるようなので CONSTFUNC() というマクロを使っていたのを外しています。