ruby-trunk-changes r51032 - r51040

今日は複数 Thread で同時に Encoding をロードしようとした時にエラーになることがある不具合の修正などがありました。

kazu: r51032 2015-06-26 00:17:05 +0900

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

svn: r51033 2015-06-26 00:19:13 +0900

version.h の日付更新。

normal: r51034 2015-06-26 04:01:25 +0900

Hash の実装は順序を保存するため linked list としても構築されているのですが、その list を ccan からもってきている list の実装を利用するようにして巨大な Hash への要素の追加を高速化しています。 [ruby-core:69726] [misc #10278]

normal: r51035 2015-06-26 04:56:20 +0900

r51034 の ccan の list を使った st_table の実装を revert しています。 CI でビルド時に SEGV が発生したそうです。

normal: r51036 2015-06-26 08:06:48 +0900

Enumerable#minmax で戻り値をあらかじめ配列を作っておいて rb_ary_store() でセットして返していたのを rb_assoc_new() で作って return するようにしています。主にコードサイズの削減が目的のようです。また hash.c で変数に volatile をつけていたのをやめて RB_GC_GUARD() で保護するようにしています。

nobu: r51037 2015-06-26 12:48:41 +0900

複数の Thread から同時に同じエンコーディングをロードしようとすると競合してエラーになることがある不具合を修正。 rb_require_safe() が Qfalse を返してもエラー扱いにしないようにしています。他の Thread が読んでロード済みになったら Qfalse が返ってくるからですね。 [ruby-dev:49106] [Bug #11277]
ところで rb_require_safe() に渡しているのは $SAFE の safe level みたいですね、 2, 3 も廃止されたのでここで 3 より大きいかチェックしているところも 1 より大きいかにしたほうが良さそうですね。

normal: r51038 2015-06-26 15:22:22 +0900

r51036 の ChangeLog に volatile -> RB_GC_GUARD() への変更についての記述がなかったのを追記しています。

nobu: r51039 2015-06-26 17:57:45 +0900

object.c の convert_type() で method の先頭の "to_" との一致を先に調べるようにして、conv_method_names の静的テーブル内に持つ名前のサイズを削減しています。

nobu: r51040 2015-06-26 17:58:00 +0900

sprintf.c の rb_str_format() で "%p" のために rb_inspect() を呼び出した時に余分な rb_obj_as_string() の呼び出しを行なわないように分岐をまとめています。