ruby-trunk-changes r51344 - r51358

今日は force_encoding したEncodingに対して不正の文字を持つ文字列の reverse の不具合修正や、openssl の機能追加などがありました。

nobu: r51344 2015-07-22 23:44:20 +0900

String#reverse で文字列の Encoding に対して不正な文字を持つ文字列を force_encoding してから 2回 reverse を呼ぶと SEGV する不具合を修正しています。 String#reverse で元の String オブジェクトの coderange を変更してしまっていたのを修正しているようです。 [ruby-dev:49189] [Bug #11387]

kazu: r51345 2015-07-23 00:16:15 +0900

r51327、r51335、r51341 の ChangeLog エントリの typo 修正。

svn: r51346 2015-07-23 00:16:32 +0900

version.h の日付更新。

tenderlove: r51347 2015-07-23 03:31:42 +0900

拡張ライブラリ openssl で OpenSSL の ALPN という TLS 拡張機能のサポートを追加しています。 ALPN とはサーバ/クライアント間でのプロトコルネゴシエーションのための機能で SPDY や HTTP2 で利用されるものだそうです。 OpenSSL::SSL::SSLContext#alpn_protocols= で利用できるプロトコル群を指定したり、OpenSSL::SSL::SSLcontext#alpn_select_cb で Proc オブジェクトを登録してプロトコルの選択する処理を渡せるようになったりするようです。 [Feature #9390]

tenderlove: r51348 2015-07-23 03:34:45 +0900

拡張ライブラリ openssl で ECDH (楕円曲線 Diffie-Hellman による鍵共有)のコールバックを登録する機能をサポートするようにしています。 OpenSSL::SSL::SSLContext#tmp_ecdh_callback= で Proc オブジェクトを登録できて OpenSSL のコールバックから呼ばれるようです。 [ruby-core:69986] [Feature #11356]

tenderlove: r51349 2015-07-23 04:04:58 +0900

r51347 の openssl の ALPN サポート追加で OpenSSL::SSL::SSLContext#alpn_select_cb= で設定した Proc オブジェクトが返した文字列をインスタンス変数にセットしていたのをやめています。 OpenSSL に渡した文字列のバッファが GC で回収された時のことを考慮していたようですが、OpenSSL が内部で文字列のコピーを作って利用しているので、保持しておく必要がなくなったためというのと、SSLContext が freeze されていた時にエラーになるのを避けるためみたいです。

nobu: r51350 2015-07-23 09:05:30 +0900

文法解析の不具合で -> {} のパースで r50402 の修正で、-> による lambda を引数に渡して、その後 do ... end のブロックを渡す記法で CMDARG_LEXPOP() を呼び忘れていて syntax error になっていたのを修正しています。 [ruby-core:70067] [Bug #11380]

nobu: r51351 2015-07-23 09:10:40 +0900

r51347 の 拡張ライブラリ openssl の ALPN サポート追加で引数の型の不一致で警告が出ていたのを明示的なキャストを追加して抑制しています。

nobu: r51352 2015-07-23 10:16:46 +0900

string.c の rb_str_shared_replace() から2つの引数が同一のオブジェクトじゃないかどうかのチェックだけを残して他の処理を str_shared_replace() という static 関数に切り出し、str_gsub() rb_str_reverse_bang() などからはこのチェックを省いた関数を直接呼び出すようにする、ちょっとした最適化をしています。

nobu: r51353 2015-07-23 10:25:49 +0900

VALUE が即値でないことをチェックしていない FL_TEST_RAW() を利用した FL_ANY_RAW(), FL_ALL_RAW() や FL_SET_RAW()/FL_UNSET_RAW()/FL_REVERSE_RAW() などの sturct RBasic::flags 操作用のマクロを追加して、OBJ_TAINTED_RAW()/OBJ_TAINT_RAW()/OBJ_INFECT_RAW() などの taint flag の関連マクロにも _RAW 版を追加しています。また STR_EMBED_P()/STR_SHARED_P() でこの _RAW 版のマクロを利用するようにしたり string.c での taint フラグの操作を _RAW 版を利用するようにしたりしています。

nobu: r51354 2015-07-23 14:14:35 +0900

string.c の rb_str_new_frozen() で文字列が struct RVALUE に embed されてなくて heap 版であることがチェック済みのところで RSTRING_PTR() マクロのかわりに直接 struct RString::as.heap.ptr をアクセスするようにしてマクロ内のチェックをスキップしたり、str_make_independent_expand() で RSTRING_PTR() の結果をローカル変数に格納して使いまわすなどの最適化。

nobu: r51355 2015-07-23 14:14:53 +0900

fstr_update_callback() で fstring 管理用のテーブルを更新する時に対象の文字列がなくて新規登録する場合に、STR_FAKESTR フラグが立っていて GC で管理されていない fake string だったら str_new_static() を利用して文字列の領域をそのまま流用するオブジェクトを作るようにしています。また渡された文字列オブジェクトが共有されているものだったら str_make_independent_expand() を呼んで共有解除するようにしています。

ko1: r51356 2015-07-23 18:34:31 +0900

構造体メンバ rb_control_frame_t::pc や struct rb_iseq_constant_body::iseq_encoded に const 修飾子を追加しています。

ko1: r51357 2015-07-23 18:53:16 +0900

構造体メンバ struct rb_iseq_constant_body::local_table や、その構造体内の埋め込みの構造体 struct rb_iseq_param_keyword のメンバ table, default_values などの型に const 修飾子を追加しています。

svn: r51358 2015-07-23 18:53:28 +0900

r51357 の ChangeLog エントリの行末の空白除去。