ruby-trunk-changes r42010 - r42027

今日は cgi と erb の などの正規表現の使いかたの修正や、gc.c のメモリ管理用の構造体の構造変更、Hash#replace の高速化などがありました。

akr:r42010 2013-07-17 00:17:21 +0900

bignum.c にて Toom3 アルゴリズムによる乗算で 3 で割る除算のために初期化時に Bignum の 3 を用意して bigdivrem() で処理していたのを、分母を BDIGIT ひとつだけで渡せる bigdivrem_single() という関数を利用するように変更することで不要にして削除しています。

svn:r42011 2013-07-17 00:17:26 +0900

version.h の日付更新。

akr:r42012 2013-07-17 08:15:41 +0900

r42008 で st_strcasecmp() を strcasecmp(3) で置き換えようとしたからか st_strcasecmp() と st_strncasecmp() をそれぞれ st_locale_insensitive_strcasecmp() と st_locale_insensitive_strncasecmp() に改名しています。

xibbar:r42013 2013-07-17 08:52:43 +0900

標準添付ライブラリ erb.rb の ERB::Util#url_encode で String#gsub のブロック内で特殊変数 $& を参照しているところが、2.0 から特殊変数のスコープの変更に gsub が再定義されている場合に動かなくなっていたので、String#gsub のブロックパラメータを利用するように変更しています。 [ruby-core:55855] [Bug #8612] [ruby-core:56054] [Feature #8648]
元の Bug チケットが何故 Rejected になったのがよくわからなかったのですが、結局不具合(じゃないと書いてあるけど)は修正されたんですよね…?

xibbar:r42014 2013-07-17 08:52:47 +0900

r42013 と同様に標準添付ライブラリ cgi でも CGI::Util#escape, unescape で String#gsub のブロック内で特殊変数 $1 を参照していたのを、ブロックパラメータを利用するように変更しています。 [ruby-core:55855] [Bug #8612] [ruby-core:56054] [Feature #8648]

xibbar:r42018 2013-07-17 12:02:40 +0900

r42013 と r42014 の ChangeLog エントリを追加しています。

akr:r42019 2013-07-17 12:31:44 +0900

r42012 で st_strcasecmp() と st_strncasecmp() を改名してしまったので互換性のために include/ruby/st.h にマクロとして定義を残すようにしています。

ko1:r42020 2013-07-17 13:34:57 +0900

メモリ管理用のヒープやスロットなどの構造を変更しています。gc.c のメモリ管理構造体の詳細になりますが、heaps_slot のヘッダ部分を別の構造体にしている heaps_header から slots 内の実際に struct RVALUE の配列を確保する領域の先頭を指す start とスロット内の要素数の limit を struct heaps_slop に直接持つように変更し、スロットの末尾を指す end というフィールドは limit から計算できるため不要なので削除しています。

ko1:r42021 2013-07-17 14:55:39 +0900

メモリ管理用のヒープやスロットなどの構造を変更しています。heaps_slot を heap_slot に改名したり struct heap_slot_body という構造体(ヘッダ部分しか宣言されていませんが、その後ろに RVALUE を格納する領域を追加して確保される)を導入したり、また スロットの RVALUE 確保領域のアドレス順にソート済みの配列 struct heap::sorted は heaps_header ではなくて管理情報を持つ heap_slot を指すように変更しています。
https://bugs.ruby-lang.org/attachments/3795/Ruby2.1_Heap.png にイメージ図があるので参照。

ko1:r42022 2013-07-17 15:24:22 +0900

gc.c で回収して完全に空になったスロットを解放する時に管理情報を持つヘッダ部分(struct heap_slot)が解放されていなくてメモリリースしていた不具合を修正しています。
なおコミットログと ChangeLog の変更した関数名が間違っていますね(ツールで差分から自動で取得したもの差分が関数の前からあったため1つ前の関数名を拾ってしまったものと思われます)。

ko1:r42023 2013-07-17 15:52:13 +0900

rb_objspace_free() でも heap_slot 自身は解放されていなかったので r42022 で追加した free_heap_slot() を使って解放するようにしています。また ObjectSpace.each_object でスロット内のオブジェクト(struct RVALUE)を舐めるのに objspace->heap.sorted のソートの基準が変化したのに対応していなかったのを追随させています。

ko1:r42024 2013-07-17 16:01:19 +0900

メモリ管理の構造の変更にデバッグ用のコードも追随させています。

nobu:r42025 2013-07-17 17:12:25 +0900

ENV.fetch が指定された環境変数が未設定の時に発生させる KeyError のメッセージに指定された変数名を含めるようにしています。 [ruby-core:56062] [Feature #8649]

ko1:r42026 2013-07-17 17:25:11 +0900

gc.c の heap 管理用の関数群に heap_ という prefix を付けたり、heap_ で始まるように単語を入れ替えたりしています。また関数の宣言位置の移動や rb_gc_set_params() に initial_expand_heap() の内容を展開したりといったリファクタリングを行っています。

glass:r42027 2013-07-17 22:17:01 +0900

Hash#replace を rb_hash_clear() してから rb_hash_foreach() で1要素ずつコピーしていく方法から、その Hash が既にイテレーション中でなければ Hash の実体である st_table を st_copy() を使って直接コピーする方法で実装することで高速化を図っています。