ruby-trunk-changes r46358 - r46366

今日は psych で空の Symbol のロードの対応、self.foo= のようなメソッドの private な時の呼び出しチェックの拡張/修正や実装方法の変更などがありました。

tenderlove: r46358 2014-06-06 07:42:58 +0900

拡張ライブラリ psych で空の Symbol (:"") を dump した YAML をロードできるように修正しています。 [ruby-core:62825] [Bug #9873]
空文字列を Symbol にできたんだなぁ…

svn: r46359 2014-06-06 07:43:08 +0900

version.h の日付更新。

nobu: r46360 2014-06-06 13:39:37 +0900

IO#read(len, str) で第2引数にバッファ用の String オブジェクトを渡した時に実際に読み込みできるようになるまで str を切り詰めないようにしています。 [ruby-core:55951] [Bug #8625]
まあでも、普通の使いかただと IO#read に渡した文字列がいつ変化するかわからない(いつデータがくるかわからない)ので、具体的にどのタイミングで切り詰められるかに依存したようなことはしないほうがいいと思いますけどね。

nobu: r46361 2014-06-06 15:05:19 +0900

NODE::nd_recv をチェックするのに数値が直接ソース内に書かれていたので、定数 NODE_PRIVATE_RECV を導入して、さらに比較するマクロ private_recv_p() も定義してこれを使うようにリファクタリングしています。

nobu: r46362 2014-06-06 16:54:37 +0900

r46361 で導入した attr_receiver() という関数を使えるところがもう一箇所あったのでこの関数で置き換えています。

nobu: r46363 2014-06-06 16:58:31 +0900

test/ruby/test_assignment.rb の test_assign が内部に大量の assertion を持っていたので、グループ化していくつかのテストメソッドに分解しています。

nobu: r46364 2014-06-06 16:58:35 +0900

r3509 のテストの追加…2003年!? 10年以上前の変更のテスト追加です。 #foo= や #[]= のような代入記号つきのメソッドを private にした時に receiver が self の時だけ呼べるようになっているという性質のテストです。へー、この挙動は知りませんでした。 private は普通 receiver を明記しない呼びかたしかできませんが、 foo = 0 はローカル変数への代入になってしまうし [0] = 1 みたいにも書けないのでこの場合は self を書かざるを得ないんですね。

nobu: r46365 2014-06-06 17:07:13 +0900

r46364 とも関連していますが private な #foo= が定義されている時に self.foo += 1 や self.foo |= 1 のような演算子つきの代入でも self は許容できるようにしています。 [ruby-core:62949] [Bug #9907]

nobu: r46366 2014-06-06 22:19:31 +0900

r46361 や r46365 の続きで private な代入記号つきメソッドの呼び出しチェックのため receiver が self かをチェックできるようにする方法を node の type で判定するようにしています。