今日は refinement とメソッドキャッシュに関するいくつかの修正、Hash[] の引数のチェックを互換性のために緩める変更、PStore#transaction の例外処理の改善などがありました。
nari:r37613 2012-11-11 00:04:27 +0900
gc.c の struct heaps_slot に struct sorted_heaps_slot のメンバを埋め込み不要なポインタ参照をやめるようにして、さらに membase, slot などのメンバは struct heaps_header から取得できるため削除するリファクタリングをしています。 [ruby-core:43592] [Feature #6199]
svn:r37614 2012-11-11 00:04:32 +0900
version.h の日付更新。
shugo:r37616 2012-11-11 11:42:04 +0900
メソッド呼び出しの情報をまとめている rb_call_info_t に refinements というメンバを追加して、module_eval を使って refinement で上書きされたメソッドを呼ぶとインラインキャッシュが汚染されて using していないところでも refine されたメソッドを読んでしまうのを防ぐために、インラインキャッシュのチェック時に現在の refinement の状態とメソッドエントリがキャッシュされた時の refinement が一致するかをチェックするようにしています。
glass:r37617 2012-11-11 13:23:04 +0900
標準添付ライブラリ pstore の PStore#transaction での例外処理が大雑把で ThreadError を全て rescue で保続して PStore::Error で置き換えられていたのでもう少し細かく条件を絞って再入をチェックするようにしています。 また @lock の解放漏れを防ぐために ensure 節を追加しています。が、begin がこの位置で大丈夫かなぁ、と思ったものの、前にしたらしたで @lock がロック済みかをチェックしないといけなくなるわけで、けっこう難しいですね。非同期例外や Thread#kill で殺されないかぎりは大丈夫のような気もします。 [ruby-core:39238] [Bug #5269]
shugo:r37618 2012-11-11 13:45:31 +0900
グローバルなメソッドキャッシュ(クラス/モジュールと対応するメソッドがキャッシュされているもの)のクリアを refine の時もしていたので using を呼んだ時だけクリアするようにしていると思います。だいぶ理解が追い付かなくなってきました。
shugo:r37619 2012-11-11 15:14:16 +0900
トップレベルでの using は Kernel#using としてではなく、トップレベルオブジェクト(つまりトップレベルでのレシーバ) main の特異オブジェクトとして定義するように変更しています。
nobu:r37620 2012-11-11 15:38:17 +0900
Hash[] でハッシュを生成する時に不正な引数だった時の例外メッセージをより詳しい情報を出すようにしています。
nobu:r37621 2012-11-11 15:39:08 +0900
Hash[] での Hash 生成は 2.0 で引数のチェックが厳しくされていたのですが、動作しなくなる gem がいくつか発見されたので警告を出力するのみに留めるように再修正されています。 [ruby-dev:46440] [Bug #7300]
あとついでに r37616 の ChangeLog エントリの行末の空白除去が含まれています。
naruse:r37622 2012-11-11 17:15:53 +0900
r37572 で対処された Strinct#crypt で crypt(3) が NULL を返すケースについて、salt に英数字とピリオド、スラッシュ以外の文字が含まれていると glibc 2.16 以降ではエラーになるらしいということでテストにチェックを追加しています。 [ruby-core:49106] [Bug #7312]
tadf:r37623 2012-11-11 18:45:44 +0900
拡張ライブラリ date のパーサで TIGHT_PARSER が定義されている時のアポストロフィの扱いを修正しています。
tadf:r37624 2012-11-11 19:02:32 +0900
拡張ライブラリ date のテストで each で assertion を何度も実行しているところで、元となるデータに __LINE__ で行番号を持たせてメッセージにどの行のデータで失敗したのかわかるようにしています。