ruby-trunk-changes r42218 - r42244

今日も bignum.c のリファクタリングや Hash#assoc の高速化、Enumerator の initialize を強制的に呼ぶ方法で freeze したオブジェクトが書き変えられないようにする対策などがありました。

akr:r42218 2013-07-29 00:14:20 +0900

bignum.c の bigdivrem() で x も y も共に配列サイズ 2 の時の最適化実装を導入しています。なるほどなぁ、勉強になります。

svn:r42219 2013-07-29 00:14:24 +0900

version.h の日付更新。

naruse:r42220 2013-07-29 05:27:50 +0900

File.expand_path のテストで環境変数 USER が空だったら失敗するように事前に assertion でチェックするようにしています。

nobu:r42221 2013-07-29 06:54:34 +0900

r42207 で変更した Windows 環境での pipe 名の作成のところの定数を enum を使って定義するように変更しています。デバッガでみた時にシンボル名が保存されるようにしているそうです。

nobu:r42222 2013-07-29 14:52:50 +0900

vm_eval.c の eval_string_from_file_helper() という関数をコールバック関数として定義されている型に揃えて引数の型を変更しています。

nobu:r42223 2013-07-29 14:52:53 +0900

mkmf.rb でコマンド実行時に RbConfig になかった変数の参照を環境変数で展開するのが変数ごとに1回しか展開されていなかったので、複数回展開できるようにしています。また with_framework のテストで $@ を String#sub で1回だけ置換していたのを gsub で全て置換するようにしています。 Mac OS X で mkmf.rb のテストが失敗していたのを修正しているようです。 [ruby-core:56253] [Bug #8702]

glass:r42224 2013-07-29 14:58:36 +0900

Hash#assoc で一時的に要素の比較方法などを定義した struct st_hash_type をすりかえることで rb_hash_lookup2() を流用して実装しています。最適化のためとのこと。しかし後で revert されています。

nobu:r42225 2013-07-29 16:34:10 +0900

ChangeLog のエントリだけコミットされて本体がありません。 Hash#assoc についての修正みたいなのですが。

nobu:r42226 2013-07-29 16:34:30 +0900

これも ChangeLog のエントリだけで変更の本体がありません。

nobu:r42227 2013-07-29 16:48:41 +0900

もうひとつ ChangeLog のみのコミットです。

nobu:r42228 2013-07-29 16:51:23 +0900

r42225、r42226、r42227 のコミット漏れを修正しているようです。でも今度は ChangeLog のエントリを revert してしまっているような……。内容は Hash#initialize_copy で要素が1つもない時に hash_type がコピーされていなかった不具合の修正、st_table のコピー時に以前の内容の解放漏れていたのを修正、assoc 用の hash_type の構造体の初期化の書きかたを修正しています。 [ruby-core:56256] [Bug #8703]

nobu:r42229 2013-07-29 16:53:22 +0900

r42228 で削除してしまった ChangeLog エントリを戻しています。

nobu:r42230 2013-07-29 17:00:34 +0900

ISeq にコンパイルする時にファイルパスを const char * で保持していたのを String オブジェクト(VALUE 型)で保持するようにしています。エンコーディングを保持できるようにするためとのこと。

nobu:r42231 2013-07-29 17:00:37 +0900

r42230 の ChangeLog エントリの追加です。

glass:r42232 2013-07-29 20:24:08 +0900

r42224 の Hash#assoc 最適化を revert しています。 table->type->compare は hash が一致した時しか呼ばれないためこのトリックは使えなかった模様。また Hash#assoc にキーとの比較が "==" で行なわれていることをチェックする({1 => :a}.assoc(1.0) は [1, :a] を返す)テストを追加しています。

knu:r42233 2013-07-29 21:06:39 +0900

enumerator_init() で Enumerator オブジェクトの freeze チェックを追加しています。 __send__ で強制的に initialize を再度呼んで Enumerator オブジェクトの利用する Enumerable オブジェクトを差し替えるというお行儀の悪いことができてしまうので、せめて freeze されたオブジェクトの場合は禁止するようにしています。 https://github.com/ruby/ruby/issues/368

knu:r42234 2013-07-29 21:06:42 +0900

r42233 と同様に Enumerator::Generator の初期化でもオブジェクトが freeze されていないかのチェックを追加しています。

knu:r42235 2013-07-29 21:20:17 +0900

r42234 のぶんの ChangeLog エントリの追記。

knu:r42236 2013-07-29 21:20:19 +0900

r42233, r42234 に続き、Enumerator::Lazy#initialize ではもともとオブジェクトが freeze されているかチェックしていたようで、テストだけ追加しています。

glass:r42237 2013-07-29 21:39:21 +0900

r42224 の Hash#assoc の最適化のリベンジのようです。元の hash_type が identhash の時だけ hash_type を一時的にすりかえる方法を利用するようにしているみたいです。これは Hash#compare_by_identity でキーの同値性で判定をするようにした時のことみたいです。

glass:r42238 2013-07-29 21:57:40 +0900

Hash#compared_by_identity で既に compared_by_identity? == true の時は何もせずに返すようにしています。

glass:r42239 2013-07-29 22:06:34 +0900

r42238 の追加変更。 rb_hash_compare_by_id_p() の前置 prototype 宣言を追加しています。

akr:r42240 2013-07-29 22:18:46 +0900

bignum.c の LOG2_KARATSUBA_DIGITS、KARATSUBA_DIGITS といった定数マクロの名前を LOG2_KARATSUBA_BIG2STR_DIGITS、KARATSUBA_BIG2STR_DIGITS と "BIG2STR" という文字列を含めるように改名しています。

zzak:r42241 2013-07-29 22:25:46 +0900

拡張ライブラリ curses のサンプルコード類を ext/curses 直下に置いていたのを sample/curses/ の下に移動しています。

nobu:r42242 2013-07-29 22:34:05 +0900

test/ruby/test_hash.rb の変更。 Hash を継承したクラスでもテストを実行するため、インスタンス変数 @cls に Hash に相当するクラスを格納しておいて Hash のテスト全てを継承したサブクラスにも適用するようにしていのですが、Hash のリテラルや Hash 定数を直接参照していたところがあったので @cls を利用するようにしています。

nobu:r42243 2013-07-29 22:37:56 +0900

r42241 で新規追加になったファイルの svn property 設定。

nobu:r42244 2013-07-29 22:55:29 +0900

RbConfig::SIZEOF モジュールを追加して各 C の型のサイズを取得できるようにしています。 [ruby-core:55638] [Feature #8568]
universal binary の時はどうなるのか、と思いましたが C 実装されているので多分使用中のアーキテクチャによって対応するサイズが返ってきそうです。