ruby-trunk-changes r52209 - r52226

今日は obj.?meth のようにすると obj が nil でない時だけ meth を呼び出すという新しい文法が追加されています。また Kernel#loop にも StopIteration で止めた時に戻り値に影響するように機能が追加されています。

shugo: r52209 2015-10-22 11:21:06 +0900

標準添付ライブラリ ftp の Net::FTP#getbinaryfile と Net::FTP#gettextfile メソッドのテストを追加しています。

svn: r52210 2015-10-22 11:21:58 +0900

version.h の日付更新。

nobu: r52211 2015-10-22 13:13:52 +0900

ARGV で引数から開かれた File オブジェクトを得るのに先に文字列化してからエンコーディングの変換の操作をするようにしています。 ARGV に後から nil などを突っ込んでから ARGF を使うと Segmentation Fault が発生していたようです。 [ruby-core:71140] [Bug #11610]

nobu: r52212 2015-10-22 13:16:21 +0900

Dir.glob の '{' と '}' の解釈で、対応する開き "{" がない "}" はメタキャラクタとして利用せずただの文字として使うようにしています。 https://github.com/ruby/ruby/pull/1061 [ruby-core:71138] [Bug #11609]

nobu: r52213 2015-10-22 15:25:33 +0900

tool/generic_erb.rb に --color オプションを追加して出力の "unchanged" と "updated" の出力に色をつけるようにしています。 r52202 からの configure & make 時の出力の colorize の一環でしょうね。

nobu: r52214 2015-10-22 15:30:12 +0900

なんとここに来て(2.3 のリリースが近いと思うのですが)新しい文法の機能が追加されました。
obj.?meth で obj が nil でなければ meth メソッドを呼ぶ、という意味になります。このため VM にも branchnil という命令が追加され(あれ、無かったのか)これを利用する ISeq にコンパイルされます。 [Feature #11537]
テストをみて気がつくのですが、obj.?attr = 42 のような代入付きのメソッドには効かないみたいですね(nil でも呼ばれる)。また obj が nil でメソッドが呼ばれない時は引数の評価もされません。
あとここまでくると respond_to? で true になる時だけ呼ぶっていうのが欲しくなってきますね。

nobu: r52215 2015-10-22 17:56:30 +0900

r52213 の tool/generic_erb.rb で tput コマンドを利用していたため動かない時の考慮をしています。 [ruby-core:71143] [Bug #11611]

shugo: r52216 2015-10-22 18:32:19 +0900

標準添付ライブラリ net/imap で Net::IMAP#idle に省略可能な引数 timeout を追加して、 wait のタイムアウトを指定できるようにしています。 [ruby-core:63693] [Bug #10031]

svn: r52217 2015-10-22 18:32:44 +0900

r52216 の行末の空白を除去。

knu: r52218 2015-10-22 18:58:01 +0900

Kernel#loop メソッドは最後のブロックの評価した値を戻り値として返すようにしています。あれ、そうなってませんでしたっけ? と思ったけど loop { } から抜けるには break するので、これが break に渡した値を返すのは loop に限らない話で、loop はブロック内で StopIteration 例外が発生することでも止めることができて、この時には元になった Enumerator の最後のブロックの評価値(StopIteration.new の引数で指定されたオブジェクト)が返されるようになったようです。ううむ loop のこういう使いかたは知らなかった。 [ruby-core:71133] [Feature #11498]

nobu: r52219 2015-10-22 22:53:01 +0900

r52202 で出力を colorize した tool/ifchange でも tput を使っていたので tput がなくてエラーになる場合を考慮するようにしています。 [ruby-core:71143] [Bug #11611]

nobu: r52220 2015-10-22 23:02:38 +0900

tool/ifchange で --color オプションを追加して auto, always などの指定を受け付けるようにしています。 また tool/generic_erb.rb でも tool/ifchange でも tput の出力をそのまま使うのではなくて "\e[" で始まるかどうかを確認するためだけに使うようにしているみたいです。

nobu: r52221 2015-10-22 23:56:37 +0900

ext/extmk.rb で実行される sub make で make showflags が重複して実行されるのを防いでいます。

naruse: r52222 2015-10-23 00:00:13 +0900

test/ruby/test_io.rb の test_dup_many で loop で Errno::EMFILE などのリソース不足のエラーになるまで IO.pipe で IO オブジェクトを作り続けるテストで Process.setrlimit を使って開けるファイル数を減らすことでテストが高負荷にならないようにしています。

svn: r52223 2015-10-23 00:00:39 +0900

version.h の日付更新。

nobu: r52224 2015-10-23 00:19:06 +0900

Array#map, #collect の rdoc 用コメントでサンプルコードの空白を調整…ああ、ブロックの開き "{" の前に空白を入れるように統一してるんですね。 https://github.com/ruby/ruby/pull/1062

nobu: r52225 2015-10-23 00:22:22 +0900

String#tr の rdoc 用コメントでバックスラッシュをエスケープするようにしています。 https://github.com/ruby/ruby/pull/1063

shugo: r52226 2015-10-23 00:51:07 +0900

標準添付ライブラリ un (ruby -run で動くようにこういう名前になってる)でブロックパラメータ名がブロックの外の変数と同名で -w つきで実行すると警告が出るようになっていたのを修正しています。