ruby-trunk-changes r46826 - r46840

今日は拡張ライブラリ digest の不具合修正、正規表現エンジン Onigmo の更新による Unicode 7.0 サポート、拡張ライブラリ win32ole の機能追加、昨日の rb_iseq_t のサイズ節約による Big Endian 環境での不具合の対処などがありました。

nobu: r46826 2014-07-15 23:58:53 +0900

FIPS モードの OpenSSL とリンクしている時に拡張ライブラリ digest で初期化関数の呼び出しでエラーになることがあるのにそれを無視していて abort することがあったので、初期化エラー時に例外を発生させるようにしています。 [ruby-core:61614] [Bug #9659]

nobu: r46827 2014-07-15 23:59:20 +0900

r46827 と同様に拡張ライブラリ digest の他の各種アルゴリズムの初期化関数で結果(成功/失敗)を返すように Init_XXX() 関数と XXX_Final() 関数の戻り値を int にしています。 [ruby-core:61614] [Bug #9659]

nobu: r46828 2014-07-15 23:59:32 +0900

拡張ライブラリ digest の ext/digest/md5/md5ossl.[ch] で拡張ライブラリの実装の MD5 じゃなくて OpenSSL の EVP_Digest(Init|Final)ex() を利用するようにしています。うーんたぶんこれは OpenSSL 版の MD5 のラッパなんでしょうね。しかし次で revert されています。 [ruby-core:61614] [Bug #9659]

nobu: r46829 2014-07-16 00:43:03 +0900

r46828 で SEGV が発生するようになったとのことで revert しています。

svn: r46830 2014-07-16 00:43:07 +0900

version.h の日付更新。

naruse: r46831 2014-07-16 12:27:25 +0900

Onigmo (鬼雲) 5.14.1 をマージしています。 Unicode 7.0 のサポートが追加されたそうです。新しい絵文字の追加などがあるそうですね。 [ruby-core:58212] [Bug #9092]

ko1: r46832 2014-07-16 18:06:52 +0900

rb_vm_t のマークのために VALUE で wrap したオブジェクトについて rb_gc_mark() 関数を呼んでいたのを、直接 rb_vm_mark() を呼ぶようにして、T_TYPEDDATA の mark 関数には関数ポインタを登録しないようにしています。そのかわり bitmap を更新するため VALUE 型の値のほうも gc_mark_ptr() を直接呼び出しています。 これは…なにが違うんでしょう。

ko1: r46833 2014-07-16 18:09:40 +0900

rb_vm_mark() で rb_vm_t::defined_strings のマーク処理を呼び出していたのを、確保しているところで rb_gc_mark_object() でマーク対象として登録しておくように変更しています。 どうやら構文 defined? で返す文字列を作っているところのようなのでプロセス全体で共有されるものなので恒久的に登録してしまっていいみたいです。

ko1: r46834 2014-07-16 18:39:09 +0900

シグナルハンドラの登録を保持する C の配列 rb_vm_t::trap_list を削除して、Array オブジェクト trap_list_cmds と int の配列 trap_list_safes の2つのメンバに分解して、マーク処理を Array オブジェクトを rb_gc_register_mark_object() で登録しておくことで済ませるようにしています。 しかし次で revert されています。

ko1: r46835 2014-07-16 19:16:34 +0900

r46834 でテストが失敗するようになっていたそうで revert しています。

suke: r46836 2014-07-16 19:34:57 +0900

拡張ライブラリ win32ole で Win32OLE::Version を 1.5.7 から 1.5.8 に更新しています。また WIN32OLE_RECORD#method_missing で rb_hash_aref() を使って結果が Qnil だったら undefined method にしていたのを rb_hash_fetch() を使うことで、対応する名前がなかったら KeyError を発生させるようにしています。

svn: r46837 2014-07-16 19:35:00 +0900

r46836 の rdoc 用コメント部分の行末の空白除去。

ngoto: r46838 2014-07-16 20:04:01 +0900

r46798 による rb_iseq_t の構造体サイズ最適化の影響で Big Endian 環境で rb_bug() でエラー終了するそうで、Big EndianVALUE 型のサイズが int よりも大きい時に padding を追加しています。ちょっとよくわかっていないのですが、rb_iseq_t 構造体は VALUE 型としてキャストして利用される可能性があるみたいで、その時に T_NODE 型として誤って解釈される可能性ができてしまったみたいです。そんな罠が…。 [ruby-core:63721] [Bug #10037]

ngoto: r46839 2014-07-16 20:46:06 +0900

vm_push_frame() で stack_max を int 型で受けとるようにしています。 ここ以外は int で処理していたので不要な型変換をしていたみたいです。

suke: r46840 2014-07-16 23:05:52 +0900

拡張ライブラリ win32ole のバージョンをさらに 1.5.9 に更新して、ole_variant2val() で VARIANT 型を VALUE に変換する時に VT_RECORD 型の VARIANT の変換をサポートするようにしています。 VT_RECORD は Array になるみたいですね。