ruby-trunk-changes r44021 - r44041

今日も GC まわりの変更/機能追加削除/不具合修正などがありました。

mrkn:r44021 2013-12-06 01:34:59 +0900

拡張ライブラリ bigdecimal で Float の -0.0 を変換する場合にその符号を結果に反映させるようにしています。 [ruby-core:58858] [Bug #9214]

svn:r44022 2013-12-06 01:35:05 +0900

version.h の日付更新。

hsbt:r44023 2013-12-06 10:56:44 +0900

標準添付ライブラリ webrick の rdoc コメントで参照している CGI の仕様の URL がリンク切れになっていたので RFC 3875 のリンクをかわりに書いています。 https://github.com/ruby/ruby/pull/466

hsbt:r44024 2013-12-06 11:10:11 +0900

標準添付ライブラリ webrick の rdoc の typo 修正。 https://github.com/ruby/ruby/pull/464

hsbt:r44025 2013-12-06 11:54:55 +0900

標準添付ライブラリ erb の rdoc では RAA へのリンクがあったのですが RAA は今年終了したのでかわりに RubyGems や The Ruby Toolbox へのリンクを書くようにしています。 [ruby-core:58789] [Bug #9197]

a_matsuda:r44026 2013-12-06 13:34:35 +0900

標準添付ライブラリ webrick のコメントの typo を修正しています。 sucess → success

tmm1:r44027 2013-12-06 14:11:51 +0900

GC.start に引数に :full_mark と :immediate_sweep というキーワード引数を受け取るようにして、 full GC を行うのか minor GC を行うのかと LazySweep を行うのかを指定できるようにしています。 デフォルトは full GC + LazySweep なしです。

tmm1:r44028 2013-12-06 14:32:11 +0900

r44027 の GC.start のキーワード引数の rdoc 用コメントにこの新機能は実装依存であることと(まあ RGenGC や LazySweep がないと意味がない指定ですしね)、将来に渡って保証されるものではないと追記しています。

ko1:r44029 2013-12-06 15:26:02 +0900

rb_gc() からの GC のトリガの種類を表すフラグを GPR_FLAG_METHOD から GPR_FLAG_CAPI に変更しています。 GC.start で呼ばれる関数が gc_start_internal() に変化したのでこの関数による GC は C API として呼ばれた時だけになったためでしょう。 また gc_start_internal() と rb_gc() で heap_pages_free_unused_pages() を呼んでいたのを削除しています。 after_sweep() で呼ばれているため不要とのこと。

nobu:r44030 2013-12-06 15:31:06 +0900

r44029 の ChangeLog エントリの行末の空白除去。

ko1:r44031 2013-12-06 16:22:25 +0900

GC.start でオプション引数が渡されなかった時も指定された時と同じ処理で GC を実行するようにしています。 rb_gc_start() を呼んでいたのをやめています。

nobu:r44032 2013-12-06 16:47:29 +0900

gc.c のインデント修正。

nobu:r44033 2013-12-06 16:47:47 +0900

misc/ruby-mode.el でブロックの内容が 1行だけの時にそれをメソッド呼び出しも含めて1行にする変換とその逆変換を追加しているみたいです。

nobu:r44034 2013-12-06 16:50:19 +0900

Hash でキーの検索のための hash メソッドの呼び出しで再帰的構造を検出するために利用する st_table を rb_hash_new() で作成していたのを、ident_hash_new() という st_table のタイプを ID をキーに使うものに差し替える関数を追加してこれで生成するようにしています。

nobu:r44035 2013-12-06 17:10:47 +0900

キーワード引数の受け取り処理の C 関数 rb_get_kwargs() を追加して値を取り出せるようにして、r44027 で追加した GC.start のキーワード引数や Dir.new の引数の処理のあたりでこれを使うように変更しています。取得したいキーワードの ID (Symbol の内部的な表現で整数)の配列として渡して、必須キーワード引数と省略可能キーワード引数を渡すと結果を VALUE の配列に格納して返してくれるという優れものです。拡張ライブラリからキーワード引数を使うのが簡単になりそうですね。きれいに入れられるなら 2.0 にも欲しい……

ko1:r44036 2013-12-06 17:53:47 +0900

gc.c に atomic_sub_nounderflow() という ATOMIC_SIZE_CAS() を使って atomic に減算処理を行う関数を追加して、メモリ管理で malloc した領域の計算に同様の処理を書いていたところをこれを利用するように置き換えています。またこの関数は減算の結果アンダーフローしてしまう場合は減算しないようにしています。これ sub を 0 にしているということは ATOMIC_SIZE_CAS() も実行する必要がないので val < sub の時はすぐ return すればいいんじゃないでしょうか。または sub = val (アンダーフロー時は 0 に丸める)の間違い?

ko1:r44037 2013-12-06 18:34:26 +0900

GC 実行時に GC 実施トリガなどのフラグで major GC の時のフラグを初期化するタイミングが早くて objspace->profile.latest_gc_info に設定するフラグに値が入っていなかった不具合を修正しています。

ko1:r44038 2013-12-06 18:38:22 +0900

旧世代のオブジェクトの使用メモリのしきい値の初期化を rb_objspace_alloc() で行なっていたのを Init_heap() に移動しています。 rb_objspace_alloc() はプラットフォームによっては呼ばれないそうです。

ko1:r44039 2013-12-06 19:09:38 +0900

r44036 の atomic_sub_nounderflow() はやっぱり負になる時は 0 に丸めるのが正解だったようで修正しています。

ko1:r44040 2013-12-06 19:27:02 +0900

GC のトリガとして使う oldmalloc_increase の増加を obj_memsize_of() を使って自己申告の値を利用するのではなくて malloc_increase と同じく objspace_xmalloc() などで malloc/realloc/free のところで管理しているサイズの変動で増加させるようにしてより正確な値を取れるようにしています。

nobu:r44041 2013-12-06 19:33:42 +0900

r44035 で追加したキーワード引数取得用の C API rb_get_kwargs() などを vm_insnhelper.c から class.c に移動しています。