ruby-trunk-changes r41110 - r41150

今日は RGenGC の高速化や API 名の変更のほか、整数をビットパターンにエンコード/デコードする API の追加/修正や Numeric#quo が require "mathn" の影響を受けるようにする修正などたくさん変更がありました。

nobu:r41110 2013-06-06 23:40:35 +0900

set_visibility() に引数の可視性を指定するフラグの型を rb_method_flag_t に変更してついでに引数名も変更しています。

akr:r41111 2013-06-07 06:20:04 +0900

rb_int_import() というバイト列の表現から整数(Fixnum, Bignum) を生成する C API を新設しています。 またこの API を使って String#unpack の "W" (BER compressed integer) のデコードの実装を書きかえています。

svn:r41112 2013-06-07 06:20:09 +0900

version.h の日付更新。

nobu:r41113 2013-06-07 06:21:05 +0900

r41112 で新規追加したファイルの svn property 設定。

eregon:r41114 2013-06-07 06:49:45 +0900

r41109 で numeric.c に追加された id_to_r という Symbol の to_r を格納する変数は未使用のため削除されています。

mrkn:r41115 2013-06-07 07:16:43 +0900

NEWS ファイルの Module#ancestors についての記述の体裁を整えています。

mrkn:r41116 2013-06-07 07:18:24 +0900

NEWS ファイルに r41109 での Numeric#quo の挙動の変化について追記しています。

akr:r41117 2013-06-07 07:31:23 +0900

r41106 で追加した rb_int_export() の引数に wordcount_allocated を追加して確保したワード数はこちらで返すようにしています。

akr:r41118 2013-06-07 08:05:27 +0900

r41111 で追加したテストクラスのクラス名が間違っていたのを修正しています。

akr:r41119 2013-06-07 08:05:59 +0900

rb_int_export() と rb_int_import() の仮引数名を変更しています。

mrkn:r41120 2013-06-07 09:29:43 +0900

rb_int_import() に (BDIGIT) への明示的なキャストを追加しています。

ko1:r41121 2013-06-07 10:17:19 +0900

RGenGC の Shady (Write Barrier で保護されていないオブジェクト)に対する反対の言葉として "Sunny" を使っていましたが、それを "Normal" に変更しています。 RubyKaigi の発表でも Shady に対して Sunny というのは意味と一致していなくてあまりよくないという意見があったとおっしゃっていたので、予定通りの変更ということでしょうか。

zzak:r41122 2013-06-07 10:23:30 +0900

r41121 の ChangeLogtypo 修正。

tarui:r41123 2013-06-07 11:18:05 +0900

RDoc 実行のベンチマーク用のスクリプト tool/rdocbench.rb の表示する情報に GC::Profiler.total_time を追加しています。

tarui:r41124 2013-06-07 11:20:05 +0900

ary_new() でオブジェクトそのもの(struct RVALUE)の確保とバッファのメモリ領域の確保の順番をいれかえて先にバッファのメモリ空間を得るようにしています。これはバッファ用のメモリ空間を取得する瞬間に GC が発生して今確保したばかりのオブジェクトが既に旧世代に昇格してしまっている可能性があるため FL_OLDGEN が立っているかもしれないので、それを落とす作業が必要だったのを消すためです。
しかしこの順番にしてしまうとバッファのメモリ領域確保後に struct RVALUE を確保しようとしてそこで確保に失敗した場合 MemoryError 例外で抜けるのでバッファ部分がリークしてしまわないでしょうか? rb_protect() とか rb_ensure() の利用が必要かと。

nobu:r41125 2013-06-07 11:21:05 +0900

r41124 の ChangeLog の行末の空白除去。

tarui:r41126 2013-06-07 11:25:19 +0900

GC 用に世代管理などに使うビットマップから特定のビットを取り出すマクロを BITMAP_BIT() として切り出して MARKED_IN_BITMAP()、MARK_IN_BITMAP()、CLEAR_IN_BITMAP() で利用するようにするリファクタリング

tarui:r41127 2013-06-07 11:28:03 +0900

RGenGC の旧世代のオブジェクトの管理用にビットマップをひとつ追加しています。構造を追加して RVALUE_PROMOTE() と RVALUE_DEMOTE() でビット操作をしているだけでまだ内容は使っていないようです。あと gc_mark_children() で旧世代に既に入っているオブジェクトを RVALUE_PROMOTE() と rgengc_report() の呼び出しを抑制しています。

tarui:r41128 2013-06-07 11:32:57 +0900

r41127 で導入した旧世代オブジェクト用のビットマップを使って Minor GC ではこれをマーク用のビットマップの初期値として利用することで旧世代オブジェクトのスキップをマーク済みのオブジェクトのスキップと同時に処理できるようにしてマークを高速化しようとしているようです。すごい、賢い!!
また slot_sweep_body() でもオブジェクトの生存チェックを r41095 でやったように1ビットずつチェックをするのではなくて uintptr_t 毎に切り出しチェックするようにして高速化を図っているのだと思います。
Minor GC のマーク結果をそのまま旧世代ビットマップにできそうなのでそのぶん RVALUE_PROMOTED() によるチェックが不要になるからメモリアクセスが局所化できるようにするという狙いもありそうです。

nobu:r41129 2013-06-07 11:36:07 +0900

r41128 の行末の空白除去。

nobu:r41130 2013-06-07 11:41:45 +0900

r41106 の configure.in で RUBY_REPLACE_TYPE() によって自動的に生成された size_t の変換マクロを自動生成するのを revert しています。 size_t は unsigned ではないから? とコミットログにはありますが size_t は unsigned のような……。 いや unsigned ではない環境もあるかもしれないということかもしれないですね。またこれにより NUM2SIZE()/SIZE2NUM() がなくなったのでその部分を NUM2SIZET()/SIZET2NUM() を使うように書き直しています。

nobu:r41131 2013-06-07 11:49:53 +0900

gc.c の gc_clear_slot_bits() という関数は RGenGC を使わない時だけ利用されるようになったので USE_RGENGC のマクロによる条件コンパイルの位置を移動しています。

mrkn:r41132 2013-06-07 11:50:32 +0900

Numeric#quo を実装する関数を numeric.c から rational.c へ移動して、関数名も num_quo() から numeric_quo() へ改名しています。これは mathn による canonicalization (require "mathn" すると組込みの数値のメソッドが返す型が変化する)の影響を受けるようにするためのようです。 require "mathn" すると Numeric#quo は r41109 の変更以前と同じように rb_rational_raw1() で変換するようになっています。mathn を使うと coerce を使うようになるということでしょうか。 [ruby-core:41575] [Bug #5736]

nobu:r41133 2013-06-07 11:52:42 +0900

array.c および gc.c の else 節や for 分のかっこの位置などのスタイルを修正しています。

naruse:r41134 2013-06-07 13:25:20 +0900

r41084 で before_gc_sweep() の部分を最適化を切ることで gcc 4.4 での最適化による SEGV を回避していましたが、ここは最適化をoffにするのでなく inline 化を禁止するだけでも回避できるらしく __attribute__ の noinline を使うようにしています。

naruse:r41135 2013-06-07 13:45:16 +0900

拡張ライブラリ ext/json/fbuffer/fbuffer.h の fbuffer_append_str() で RB_GC_GUARD() で str を保護していましたがポインタを利用した後に置かないと GC_GC_GUARD() の後で不要とみなされてしまうかもしれないので、ポインタを利用している分の後に位置を移動しています。

kazu:r41136 2013-06-07 15:57:07 +0900

r41128 の ChangeLogtypo 修正。

kazu:r41137 2013-06-07 15:57:10 +0900

r41123 の ChangeLogtypo 修正。

charliesome:r41138 2013-06-07 17:31:48 +0900

inline関数の RCLASS_SUPER() および RCLASS_SET_SUPER() の引数が適当な1文字の名前だったのを内容のわかりやすい命名に変更しています。

charliesome:r41139 2013-06-07 17:41:48 +0900

bignum.c の rb_absint_size(), rb_int_export(), int_import_push_bits() などの関数で (BDIGIT) への明示的なキャストを追加しています。

akr:r41140 2013-06-07 18:25:47 +0900

bignum.c でループカウンタとして使う変数 i の宣言を関数の先頭でしていたのを、わざわざループの前後をブロックで括って局所的に宣言するようにしています。うーんここまでしますか。

akr:r41141 2013-06-07 18:40:56 +0900

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

akr:r41142 2013-06-07 19:01:19 +0900

あちこちにソースファイルで独自に配列の要素数を返す numberof() マクロを定義していたのを internal.h にまとめてそれを #include するようにしています。

akr:r41143 2013-06-07 19:24:07 +0900

bignum.c で numberof() マクロを利用するようにリファクタリングしています。

akr:r41144 2013-06-07 19:49:12 +0900

bignum.c の rb_int_export() と rb_int_import() から引数のチェックをする処理を括り出して validate_integer_format() という関数を追加するリファクタリング

akr:r41145 2013-06-07 21:06:09 +0900

rb_int_export() から rb_int_import() から引数の word order やエンディアンによって並べなおす処理を integer_format_loop_setup() という関数に括り出すリファクタリング

akr:r41146 2013-06-07 21:16:32 +0900

bignum.c の rb_int_import() の変数の説明をしたコメントをそれぞれの変数の代入の直前に置くように分割しています。

akr:r41147 2013-06-07 21:41:02 +0900

rb_int_export()/rb_int_import() を rb_integer_pack()/rb_integer_unpack() と改名しています。確かにこのほうが pack/unpack メソッドからの類推でわかりやすいですね。それに伴ないテスト用の拡張ライブラリやテストスクリプトも全体的に命名を変更しています。

naruse:r41148 2013-06-07 22:17:33 +0900

lib/rubygems/specification.rb で Gem::NoAliasYAMLTree.new を使っていて deprecated の警告が出ていたので Gem::NoAliasYAMLTree.create を使うように修正しています。 GitHub の master でもまだ修正されていないみたいですね。 https://github.com/rubygems/rubygems/blob/master/lib/rubygems/specification.rb#L2249

nobu:r41149 2013-06-07 22:25:41 +0900

rb_const_set() で可視性のフラグを格納する変数の型を rb_const_flag_t に変更しています。

ktsj:r41150 2013-06-07 23:22:53 +0900

r41149 の変更で文末のセミコロンが抜けていたのを修正しています。コンパイルせずにコミットしたんですかね。