ruby-trunk-changes r48189 - r48197

今日はブロックに lambda で作った Proc オブジェクトを渡した時の yield での呼び方に扱いについての仕様変更がありました。

nobu: r48189 2014-10-29 23:24:24 +0900

r48188 でメソッドの引数のデフォルト値の式にその引数自身があったら警告するようにした変更で、式にブロックつきメソッド呼び出しがあってその中に引数が登場した時にも警告するようにしています。 [ruby-core:65990] [Bug #10314]

nobu: r48190 2014-10-30 00:01:49 +0900

r48188 の引数のデフォルト値に引数自身が現れた時の警告で、ブロックの引数やブロック変数で遮蔽された時には警告しないようにしています。なかなか大変ですなぁ。 [ruby-core:65990] [Bug #10314]

svn: r48191 2014-10-30 00:01:58 +0900

version.h の日付更新。

nobu: r48192 2014-10-30 09:47:58 +0900

NUM2CHR() (が呼び出してる rb_num2char_inline()) で TYPE() で方をチェックしているところを RB_TYPE_P() を利用するようにしています。このために RB_TYPE_P() のinclude/ruby/ruby.h 内での定義位置を前のほうへ移動しています。

nobu: r48193 2014-10-30 11:16:15 +0900

lambda や ->() で作られた Proc オブジェクト(lambda 型)は引数の arity チェックが厳格で、return 文の解釈が変化する(break 扱いになる)という違いがありますが、lambda 型の Proc オブジェクトをブロックとしてメソッド呼び出しした時に、yield に配列を渡しても splat されずにエラーになっていたのを、to_ary で変換して引数に受け取れるようにしています。

# yield x, y と複数の値を渡せば(lambdaの引数と一致すれば)OK
def m1
  yield 0, 1
end

m1(&->(a, b) { p [a, b] }) # => [0, 1]

# yield [x, y] みたいに配列(や配列に変換できるオブジェクト)は ArgumentError だった
def m2
  yield [0, 1]
end

m2(&->(a, b) { p [a, b] }) # => ArgumentError: wrong number of arguments (1 for 2)

これが m2 も変換されてエラーにならなくなりました。
おお、これメソッド定義側で呼び元でどっちが渡されたかを想定しないといけないので微妙、というか非常に使いずらい点でしたが、仕様変更されましたね。 [ruby-core:65887] [Bug #9605]

duerst: r48194 2014-10-30 13:23:27 +0900

tool/downloader.rb で unicode 用のデータをダウンロードする時の URL を変更しています。latest を指していたのを Unicode 7.0.0 とバージョンを指定したパスを参照するようにしています。

nobu: r48195 2014-10-30 15:33:11 +0900

拡張ライブラリ tk で 数値か数値を表す文字列を受け取るところで NUM2CHR() を用いることで分岐を消しています。 ふーむ、これ RARRAY_PTR() でバッファにアクセスしてる配列のサイズチェックされてるのかなぁ。この関数内ではしていないような気がするけど……。

nobu: r48196 2014-10-30 16:39:51 +0900

tool/downloader.rb でダウンロードする Unicode 関係のファイルは Unicode のバージョン番号のサブディレクトリの下に配置するようにしています。バージョン番号は common.mk で UNICODE_VERSION = 7.0.0 として定義しています。

naruse: r48197 2014-10-30 18:48:59 +0900

r48058 で make に ALWAYS_UPDATE_UNICODE=yes と変数を渡すと Unicode 関係のファイルのダウンロード時に更新をチェックして必要なら再ダウンロードを行うようにしていましたが、ALWAYS_UPDATE_UNICODE=no が指定された時のことが考慮されていなかったので no が指定されたらオプション指定しないようにしています。 make の $(VAR:aaa=bbb) って aaa じゃなかった時はそのまま展開されるんですね。つまり ALWAYS_UPDATE_UNICODE には yes か no 以外を渡すとそのままコマンドラインに展開されてしまう(ので多分エラーになる)んですね。