ruby-trunk-changes r41544 - r41572

今日も RGenGC の主にプロファイル情報収集やデバッグ用のチェックなどの修正と bignum.c のリファクタリングなどがありました。また Minitest 4.7.5 がマージされました。

akr:r41544 2013-06-22 02:22:14 +0900

bignum.c の bary_pack() で word 数が 1の時に BDIGIT のサイズと wordsize に応じて最適化した実装をずらりと並べるようにしています。 word 数が 2以上の時もシンプルなコピーで処理できるケースは特別扱いした実装を用意しています。

svn:r41545 2013-06-22 02:22:18 +0900

version.h の日付更新。

ko1:r41546 2013-06-22 04:36:48 +0900

RGenGC で旧世代オブジェクトは各オブジェクトの flags のビットフラグと bitmap との両方で管理しているのですが、この両方で食い違いがないかをチェックする check_bitmap_consistency() という関数を作成して、オブジェクトを世代移動する時などに呼ぶようにしています。

ko1:r41547 2013-06-22 04:42:04 +0900

gc.c の USE_RGENGC の on/off で関数を分けていたのを関数定義を1つにしてその中で分岐するようにリファクタリング

ko1:r41548 2013-06-22 04:52:40 +0900

RGenGC のための Write Barrier を挿入するためのマクロ OBJ_WRITE() の第2引数は常に (VALUE *) へキャストして呼ばれていたのでマクロ定義内にキャストを含めるようにして、使う場所でキャストしなくて良いようにしています。

ko1:r41549 2013-06-22 05:10:03 +0900

gc.c の rgengc_rememberset_mark() で remember set に入っているオブジェクトを mark stack に push して後でマークさせずに gc_mark_children() を呼んでその場で参照オブジェクトのマークを実行するようにしています。

ko1:r41550 2013-06-22 06:08:38 +0900

r41128 の変更で gc.c の rb_gc_giveup_promoted_writebarrier() で rest_sweep() を呼んで sweep を終了させる必要がなくなったので削除しています。

ko1:r41551 2013-06-22 06:51:41 +0900

GC::Profiler 用の struct_objspace::profile のメンバーの改名。また現在の record を取得する gc_prof_record() をインライン関数として実装していたのを、現在のレコードを指すポインタを構造体メンバに追加して管理することでそれを参照するだけに変更しています。

ko1:r41552 2013-06-22 07:29:09 +0900

GC::Profiler で収集する GC プロファイル情報の計算方法の修正。

ryan:r41553 2013-06-22 09:20:05 +0900

Minitest の 4.7.5 をマージしています。 MiniTest::Spec で @@describe_stack というクラス変数を利用していたところを Thread#[] による thread local storage (正確には Fiber local ですが)を利用するように変更しているだけみたいです。
コミットログや ChangeLog には書かれていませんが、多分このチケットへの対応だと思われます。 [ruby-core:54997] [Bug #8408]

akr:r41554 2013-06-22 09:56:53 +0900

r41544 で bignum.c に追加したマクロのコンパイラ警告を抑制するために一部を別のマクロに切り出しているようです。

nobu:r41555 2013-06-22 10:27:17 +0900

load.c の rb_load_internal() で gcc 以外の時に警告除去のために定義していた volatile 変数と RB_GC_GUARD() の呼び出しが gcc 4.4 では必要になったみたいなので条件コンパイルの条件に追加しています。

akr:r41556 2013-06-22 10:39:15 +0900

pack.c で num2i32() を削除して、かわりに rb_integer_pack() を呼ぶようにしています。

akr:r41557 2013-06-22 13:12:48 +0900

r41554 で bignum.c に追加したマクロ RSHIFTX() をやっぱり削除して、CLEAR_LOWBITS() は RSHIFTX() なしで定義するように変更しています。しかし (d)*0 って常に 0 ですよねぇ。なぜ d を使っているのかというと、型を d の型にするためでしょうか……。

charliesome:r41558 2013-06-22 13:46:47 +0900

拡張ライブラリ etc で例外メッセージを作るところで String オブジェクトから C 言語の文字列を取り出して渡さずにフォーマット文字列の PRIsVALUE (%i) を使うことで String オブジェクトをそのまま渡すようにしています。コンパイラ最適化による GC のマーク漏れの危険を防いでいます。

akr:r41559 2013-06-22 13:56:37 +0900

r41544 で bignum.c の bary_pack() に入れた特別扱いの実装で nails が 0 でない時にも MEMZERO() を使った実装ができるので条件を修正しています。

charliesome:r41560 2013-06-22 14:35:23 +0900

拡張ライブラリ etc で setup_passwd() で rb_struct_new() の可変長引数に最後の番兵として 0 を渡すところで VALUE 型へのキャストを追加しています。型の指定なしだとおそらく int 型で渡すことになるので sizeof(int) より sizeof(VALUE) が大きい場合はうまく 0 を指定したことにならずに SEGV してしまう危険があるのを修正しています。

akr:r41561 2013-06-22 14:37:30 +0900

拡張ライブラリ dl の DL::CFunc#call の実装で rb_big_pack() を利用するように書き変えています。このため不要になった rb_big2ulong_pack() は deprecated としてマークされています。

charliesome:r41562 2013-06-22 14:43:08 +0900

拡張ライブラリ etc で struct passwd に pw_passwd が存在しない時に Etc::Passwd として定義する Struct のメンバーに passwd を定義しないようにしています。

charliesome:r41563 2013-06-22 15:26:32 +0900

r41560 で rb_struct_new() の最後の引数に VALUE のキャストを追加していたのを revert しています。 rb_struct_new() は番兵を使っているわけではなくて Struct オブジェクト(クラス)が要素数を持っているので、その数だけ引数を取り出すので最後の引数の 0 は意味がないみたいです。おそらくこの番兵っぽい引数のせいだと思ってたけど実は struct passwd に pw_passwd が存在していなくて数が一致していなかったのを r41562 で修正したのではないかと思います。

ko1:r41564 2013-06-22 15:43:30 +0900

RGENGC_CHECK_MODE が 2以上に定義されていた時の RGenGC のデバッグ用のチェックに新たな Write Barrier 挿入漏れを検出する方法を追加しています。 mark bitmap を保存しておいて、full marking を実行して

  • 旧世代ではない
  • 親オブジェクト(参照元?)が旧世代
  • 親オブジェクトが remember set に入っていない
  • remember set に入っていない

というオブジェクトがあったら Write Barrier 漏れだと判定しています。この条件だと親か自分のいずれかが remember set に入っているはずということですね。

akr:r41565 2013-06-22 18:55:27 +0900

r41544 で bary_pack() に条件がそろった時に最適化された特別な実装を使うように追加されていましたが、これを利用せず常に一般的な実装を利用するように指定するフラグ INTEGER_PACK_FORCE_GENERIC_IMPLEMENTATION を追加しています。また wordsize が BDIGIT のサイズの整数倍だった時の特別処理で byte order と word order の組み合わせに応じた word order の入れ替え処理を追加しています。

akr:r41566 2013-06-22 20:38:19 +0900

bignum.c の bary_unpack_internal() にも BDIGIT サイズと wordsize の組み合わせに応じた特別扱いした実装を追加しています。また INTEGER_PACK_FORCE_GENERIC_IMPLEMENTATION フラグで強制的に一般的な実装を利用するようにするのも同時にサポートするようにしています。

akr:r41567 2013-06-22 21:05:31 +0900

pack.c の String#unpack の "c" と "C" の実装を整数の unpack 処理に goto で飛ばすようにしています。 これは r41532 に対応する unpack 側の変更みたいです。そして整数の unpack() 処理にサイズに応じて実装を分岐していたのを全て rb_integer_unpack() に任せるようにしています。

kazu:r41568 2013-06-22 21:11:33 +0900

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

akr:r41569 2013-06-22 21:48:45 +0900

bignum.c の rb_integer_unpack() で自動変数に BDIGIT の2要素の配列を置いて、これを用いて可能なかぎり Bignum オブジェクトを生成せずに済ませるようにする最適化を施しています。

akr:r41570 2013-06-22 23:28:50 +0900

bignum.c のリファクタリング。 quad_buf_complement() というバッファの全bit が 1 かどうかチェックする関数を bytes_2comp() と改名して bary_pack() からオーバフローチェックのために利用するようにしています。また rb_quad_pack() と rb_quad_unpack() でそれぞれ rb_integer_pack() と rb_integer_unpack() を利用して実装するように変更しています。

akr:r41571 2013-06-22 23:51:48 +0900

bignum.c のリファクタリング。 bary_pack() と bary_unpack_internal() から BDIGIT の配列の順番を反転する処理を bary_swap() として切り出しています。

akr:r41572 2013-06-22 23:55:31 +0900

bignum.c から既に #if 0 ... #endif でコメントアウトされていた rb_big_pack() と rb_big_unpack() の実装を削除しています。