ruby-trunk-changes r49078 - r49083

今日はブロック内のダイナミック変数をブロック外で参照している時の警告をやめる変更と、昨日の Resolv::DNS::Name の比較の修正のリファクタリングがありました。

2014年も終わりです。今年もコミットを読み続けた1年でした。よいお年を。

akr: r49078 2014-12-31 13:45:05 +0900

r49071 や r49073 の標準添付ライブラリ resolv の Resolv::DNS::Name#== の比較の修正の再修正で、再度 join(".") で dot で連結するのではなくて配列のまま比較するようにしています。大文字小文字の無視については配列の要素の Resolv::DNS::Label::Str の比較が大文字小文字を無視するように実装されているのでそのままでいいようです。

svn: r49079 2014-12-31 13:45:13 +0900

version.h の日付更新。

nobu: r49082 2014-12-31 16:48:47 +0900

変数のスコープに関する警告で、前のメソッド呼び出しのブロック内のダイナミック変数と同名のメソッド呼び出しを関数的に(receiver を省略して)呼ぶと誤検出して警告が出てしまうということで、WARN_PAST_SCOPE というマクロが真に定義された時だけ(未定義の時は 0 に定義するようにされている)この警告を出力するようにしています。Ruby では変数の参照とメソッドの呼び出しが区別がないので、変数がなければメソッドの呼び出しになりますから、正当なメソッド呼び出しでも過去のブロックで衝突していると誤検出してしまうんですね。まあ、いずれにせよメソッド名と同名のローカル変数/ダイナミック変数はやめたほうがいいと思いますけどね。とはいえブロックの中だと場合によっては module_eval や instance_eval で別のコンテキストで実行される可能性もあるので難しいところですね。 [ruby-core:67162] [Bug #10661]

akr: r49083 2014-12-31 17:50:10 +0900

Resolv::DNS::Label::Str で downcase で小文字に正規化する前に force_encoding('ASCII-8BIT') でエンコーディングを ASCII-8BIT に変換するようにしています。 downcase がエンコーディングを意識してしまわないように、RFC 4343 の仕様に準拠させるためだそうです。ふーむこの場合 US-ASCII じゃなくて ASCII-8BIT でいいんですかね?