ruby-trunk-changes r47539 - r47560

今日は Symbol.find の削除、Object#freeze 時に特異クラスも同時に freeze するようにする変更、その他最適化などがありました。

nagachika: r47539 2014-09-12 02:13:46 +0900

r47533 の ChangeLog エントリの typo 修正。

svn: r47540 2014-09-12 02:13:58 +0900

version.h の日付更新。

nagachika: r47541 2014-09-12 02:16:45 +0900

同様の typo を class.c のコメントにもみつけたので修正しました。

normal: r47542 2014-09-12 04:25:32 +0900

RubyVM の命令列には once という1回だけ実行される処理のための命令があり、正規表現の o オプションの実装のために利用されているのですが(r42637 で導入 [ruby-dev:45923] [Bug #6701])、この実装を iseq_inline_storage_entry::once::done でフラグを持つのではなく、iseq_inline_storage_entry::once::running_thread に 0x01 というポインタとしてありえない値を入れることで実行済みを表現することで構造体サイズを削っています。 exit するだけのプログラムで 10KB ほど使用メモリ量が削減されたということで、割とインパクト小さい感じではありますが、inlinecache はRubyで書かれたメソッドとかが増えると増えていくので実用的なアプリケーションではもっと効果があるかもしれませんね。

naruse: r47543 2014-09-12 06:22:52 +0900

Symbol GC の導入による必要性が薄れた Symbol.find を削除しています。Symbol.find は 2.2 で追加された新機能なので、リリースされることなく廃止されることになりそうですね。 https://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20140904Japan
テストで必要としていたところがあったので、それはテスト用拡張ライブラリに実装を移しています。

normal: r47544 2014-09-12 06:57:34 +0900

string.c の Init_frozen_strings() で fstring 用の管理テーブル frozen_strings の初期化時に st_init_table_with_size() を利用して初期サイズを 1000 で作成するようにしています。起動時のリサイズで時間が取られないようにしているそうです。

hsbt: r47549 2014-09-12 14:40:01 +0900

gems/bundled_gems に記述されている同梱する gem パッケージのバージョンを test-unit (3.0.0 → 3.0.1) と minitest (5.4.0 → 5.4.1) で更新しています。

nobu: r47550 2014-09-12 16:44:10 +0900

include/ruby/ruby.h の VALUE 型の bit pattern の説明をしているコメントを、関連する定数マクロの定義の横に書くようにしています。 うーん、これ一覧できるコメントもあったほうが、学習のために読む人には優しい気がしますけどね。まあ散らばってると編集漏れがありそうですが。

nobu: r47551 2014-09-12 17:13:28 +0900

オブジェクトを freeze した時に、そのオブジェクトの特異クラスも freeze されたものとして扱って、特異メソッドの追加などができないようにしています。なるほど特異メソッドはそのオブジェクトの属性と言えなくもないですね。
なおコミットログや ChangeLog が "ditto." の行だけになってて削られてしまっている感じです。

normal: r47552 2014-09-12 18:22:18 +0900

vm.c の env_alloc() 関数を呼び元の vm_make_env_each() に展開して、xcalloc() のかわりに xmalloc() を使うことで不要な 0 埋めをせずに構造体を初期化するようにしています。 例の lambda calculation による FizzBuzzベンチマークで 1.5% 程度の高速化ということで、だいぶ細かい最適化ですねー。

kazu: r47553 2014-09-12 21:16:14 +0900

r47523, r47528, r47534 の ChangeLog エントリの typo 修正。

kazu: r47554 2014-09-12 21:17:29 +0900

r47529 で追加した coverage/README の typo 修正。

nobu: r47555 2014-09-12 22:11:13 +0900

拡張ライブラリ readline で struct RVALUE のスロットではなくてスタック上の自動変数の struct RString をオブジェクトとして初期化して利用していたところを、その専用の関数 rb_setup_fake_str() を利用するようにしています。

nobu: r47556 2014-09-12 23:16:57 +0900

.gdbinit を Incremental GC 導入に伴なう struct RBasic::flags の変更に追随させています。

nobu: r47557 2014-09-12 23:25:01 +0900

r47551 の freeze 時の特異クラスの扱いについての変更続き。特異クラスそのものを freeze させるのではなくて、クラスの freeze チェックの関数 rb_frozen_class_p() で特異クラスの時にそのインスタンスの freeze 状態もチェックするようにしていましたが、やっぱり Object#freeze 時にその特異クラスも freeze するようにしています。 これだと freeze 後に signleton_class で特異クラスを作った時に追加できてしまわないかな、と思いましたが、frozen なオブジェクトの特異クラスを作ると frozen 状態で作られるようで問題ないようでした。あとこの実装だと特異クラスに prepend で Module を挟むと freeze されないんじゃないかなと思ったのですが、実験してみるとそれでも freeze されるみたいでした。あれ、なんでだろう…。

kazu: r47558 2014-09-13 00:21:10 +0900

coverage/ と ext/-test-/win32/console/ の下のファイルたちを .gitignore への追加と同様に svn:ignore property にも設定しています。

nobu: r47559 2014-09-13 00:39:09 +0900

ext/Setup.nacl の行末の空白除去。

svn: r47560 2014-09-13 00:39:17 +0900

version.h の日付更新。