ruby-trunk-changes r55034 - r55064

今日は新しいコミッタの rhe さんの openssl の修正や、MatchData#values_at の named capture 対応、MathedData#match? メソッドの追加などがありました。

mrkn: r55034 2016-05-18 00:08:33 +0900

r55032 で追加された Enumerable#sum に範囲が整数の Range オブジェクト向けの最適化を入れています。 自然数の和のガウス少年の解法のやつですね。

svn: r55035 2016-05-18 00:08:34 +0900

version.h の日付更新。

naruse: r55036 2016-05-18 02:10:01 +0900

MatchData#values_at で部分マッチした文字列を参照するのにインデックスだけでなく named capture の名前(Symbol でも String でも)による参照も受け付けるようにしています。MatchData#[ ] の実装の match_aref() から名前をインデックスにする処理を namev_to_backref_number() という関数に切り出して再利用しています。 [ruby-core:58701] [Feature #9179]

naruse: r55037 2016-05-18 02:10:01 +0900

MatchData#[ ] の実装の match_aref() で不要な分岐を削除しています。

nobu: r55038 2016-05-18 02:24:34 +0900

rb_vm_t の running, thread_abort_on_exception, trace_running などのフラグや rb_thread_t の method_missing_reason というビットフラグや abort_on_exception を bit field を使うようにしています。

nobu: r55039 2016-05-18 03:16:08 +0900

r55039 の MatchData#values_at の named capture 対応の再修正。 values_at の引数には Range オブジェクトを受け付けてたのに対応しているそうです。 Range オブジェクトなんて渡せたのか…。

mrkn: r55040 2016-05-18 09:16:06 +0900

Enumerable#sum の enum_sum() から r55034 で追加した整数の Range 向けの最適化部分を int_range_sum() という関数に切り出すリファクタリング

mrkn: r55041 2016-05-18 09:54:52 +0900

Enumerable#sum で Hash の時に each メソッドが再定義されてなければ rb_hash_foreach() を直接呼んで不要なブロック呼び出しをスキップする最適化をしています。

nobu: r55042 2016-05-18 10:05:36 +0900

doc/extension.rdoc と doc/extension.ja.rdoc に RB_TYPE_P() マクロについて追記しています。

nobu: r55043 2016-05-18 10:16:50 +0900

r55041 で sum_iter() に追加されてる assert() の呼び出しが変数宣言の前にあって -Werror=declaration-after-statement によってエラーになっていたので無理矢理使わない変数 unused の初期化子として assert() の呼び出しを埋め込んでいます。すごい。

nobu: r55044 2016-05-18 10:17:43 +0900

FIXNUM_P() と RB_TYPE_P() で T_FIXNUM か T_BIGNUM 型であることをチェックしていたところを RB_INTEGER_TYPE_P() マクロを使ったチェックに置換しています。 Integer への統合の関係ですね。

nobu: r55045 2016-05-18 10:21:57 +0900

doc/extension.rdoc と doc/extension.ja.rdoc に型チェック用の RB_INTEGER_TYPE_P() と RB_FLOAT_TYPE_P() マクロの解説を追記しています。

nobu: r55046 2016-05-18 11:05:30 +0900

WIN32OLE のテストでも Fixnum/Bignum の Integer 統合の影響で、エラーメッセージに埋め込まれてるクラス名のせいで失敗していたのをさけるため整数ではなく文字列をテストデータに使うように修正しています。

rhe: r55047 2016-05-18 11:55:45 +0900

新しいコミッタ rhe さんの初コミットです。主に openssl のメンテナをされるみたいですね。 拡張ライブラリ openssl の BN に #hash, #==, #eql? メソッドを追加して Hash のキーとして使えるようにしているみたいです。またこのために GetBNPtr() から型が間違ってる時に例外を発生させず NULL を返す try_convert_to_bnptr() を切り出して再利用するようにしています。

rhe: r55048 2016-05-18 11:55:46 +0900

拡張ライブラリ openssl の OpenSSL::PKey::EC::Point#mul の rdoc 用コメントに説明を追記しています。また引数のチェックを強化しているようです。 [ruby-core:65152] [Bug #10268]

mrkn: r55049 2016-05-18 12:21:53 +0900

NEWS ファイルに Enumerable#sum について追記しています。

rhe: r55050 2016-05-18 13:07:45 +0900

拡張ライブラリ openssl のエラー処理の修正。 OpenSSL にはグローバルな error queue というのがあって、前の関数の呼び出しがエラーになったかどうかを ERR_get_error() で取得して…というしくみがあって、その error queue をクリアする ERR_clear_error() の wrapper 関数 ossl_clear_error() を追加して、OpenSSL.debug が設定されている場合はクリアする前に積まれているエラーの内容をダンプするようにしています。おお、すごい、ちゃんとしている。ちなみに ERR_get_error() でエラーが取れなくなったら ERR_clear_error() しなくても良かったりするんでしょうか。

rhe: r55051 2016-05-18 13:07:47 +0900

拡張ライブラリ openssl で OpenSSL のエラー発生時に error queue にエラーが残ったままにならないように適切なクリアを追加しています。 [ruby-core:48284] [Bug #7215] なんかこういうのあったよな、と外部記憶を検索したら r31242 あたりのだいぶ昔のがひっかかってきたので、openssl のメンテナンスしてくれる人がみつかって本当に良かったなという感がありますね。

nobu: r55052 2016-05-18 13:36:02 +0900

r55048 の拡張ライブラリ openssl の ossl_ec_point_mul() の引数チェック強化で配列の添字に使う変数の型を int から long に修正しています。

naruse: r55053 2016-05-18 13:56:02 +0900

MatchedData#[ ] で引数を2つ(start, length)渡された時と Range オブジェクトを渡された時に配列を返す時に中間オブジェクトの配列の作成を抑制するようにしています。

nobu: r55054 2016-05-18 14:52:40 +0900

rb_str_modify_expand() で引数 expand が大きすぎる時のオーバフローチェックを追加して ArgumentError を発生させるようにしています。[ruby-core:75592] [Bug #12390]

nobu: r55055 2016-05-18 16:04:55 +0900

tool/downloader.rb で gem パッケージをダウンロードする時に、gem パッケージの検証は rubygems が 2.4 以降の時だけ行うようにしています。古い rubygems だと検証に失敗することがあるそうです。うーんこのダウンローダ使う人はソースからビルドする人だと思うので、新しい rubygems 使えでもいいような気はしますが、古い ruby しかない環境で ruby をビルドできないとそれはそれで詰むので、しかたないか。

nobu: r55056 2016-05-18 16:24:02 +0900

test/openssl/test_random.rb で require "openssl" していたのをやめて test/openssl/utils.rb を読み込むようにしています。

rhe: r55057 2016-05-18 16:59:09 +0900

拡張ライブラリ openssl で OpenSSL::PKCS12.new で PKCS12_parse() を呼び出すと複数のエラーが error queue にたまってエラーがクリアさえてなかった不具合を修正しています。これは OpenSSL 側の不具合で 1.0.0t, 1.0.1p, 1.0.2d で起こりえるものだそうです。

nobu: r55058 2016-05-18 17:06:23 +0900

test/openssl/test_random.rb でテストクラスを定義するかどうかを OpenSSL::Random という定数の存在チェックを使っていたのを OpenSSL::TestCase のチェックに変更しています。コミットログによると古い OpenSSL とリンクしている openssl の時にテストを省略するようにしているようです。

rhe: r55059 2016-05-18 17:52:37 +0900

拡張ライブラリ openssl の OpenSSL::PKey::EC::Point#mul のテストで例外発生時に環境によってはサポートしていない可能性もあるので "unsupported field" というメッセージが含まれてたら無視するようにしています。

rhe: r55060 2016-05-18 19:07:38 +0900

r55059 の再修正。 rescue 節で例外を変数に受けてなかったので $! で参照するように修正しています。

naruse: r55061 2016-05-18 19:37:13 +0900

Regexp#match? というメソッドを新設して、MatchData ではなくマッチするか否かだけ判定して true or false を返すようにしています。真偽値を返すという他にも capture を計算する必要がないので高速になりそうです。これ欲しかったんですよね。

nobu: r55062 2016-05-18 20:32:26 +0900

r55061 の MatchData#match? の実装でマッチ位置を受け取る変数の型を OnigPosition に修正しています。

usa: r55063 2016-05-18 21:31:53 +0900

thread.c の再帰呼び出しを検出するための Hash を生成する時に rb_ident_hash_new() を利用していたところがありましたが、キーとして使う object_id が Bignum になる可能性があるので通常の Hash として rb_hash_new() で生成するようにしています。

kazu: r55064 2016-05-18 22:40:51 +0900

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