ruby-trunk-changes r41898 - r41923

今日は String オブジェクトの操作で NUL 文字の扱いをエンコーディングを意識するようにする変更がありました。

glass:r41898 2013-07-10 22:35:36 +0900

String#index で1バイト文字のみからなる文字列の時に文字列サイズの取得を RSTRING_LEN() で取得するようにする最適化と、スタイルなどの体裁の修正を行なっています。

akr:r41899 2013-07-10 22:46:38 +0900

bignum.c に RBIGNUM_EMBED_LEN_MAX の値をチェックする STATIC_ASSERT() を追加しています。

nobu:r41900 2013-07-10 23:12:04 +0900

string.c の rb_str_subpos() という関数を公開関数にして include/ruby/intern.h に宣言を追加しています。
[Feature #6626] のパッチのための変更だそうです。

zzak:r41901 2013-07-10 23:25:06 +0900

標準添付ライブラリ logger.rb の Logger#add の rdoc の間違った戻り値の説明を削除しています。 [ruby-core:55633] [Bug #8567]

zzak:r41902 2013-07-10 23:30:12 +0900

logger.rb の rdoc 用コメントで Synopsis と書かれてたところを rdoc の :call-seq: タグに書き換えています。

naruse:r41903 2013-07-11 00:36:06 +0900

r41886 で Process.daemon 時に Thread を停止するなどの処理を追加した時のテストで FreeBSD では daemon(3) を呼び出しても Thread が死なないらしくて別のテストメソッドを定義するように分岐しています。ただこれは後で revert されています。

svn:r41904 2013-07-11 00:36:12 +0900

version.h の日付更新。

zzak:r41905 2013-07-11 00:50:23 +0900

標準添付ライブラリ delegate.rb の rdoc 用コメントにサンプルコードを追加しています。 [ruby-core:55883] [Bug #8615]

zzak:r41906 2013-07-11 00:55:12 +0900

ri の man ページ man/ri.1 で groff のエラーになっていたのを修正しています。 [ruby-core:55919] [Bug #8620]

tenderlove:r41907 2013-07-11 03:22:52 +0900

probes.d に記述されている DTrace 用 probe の定義を Wiki に変換するためのスクリプト tool/probes_to_wiki.rb を追加しています。なんか usage が間違ってる気がする。

nobu:r41908 2013-07-11 03:23:40 +0900

r41907 で新規追加された tool/probes_to_wiki.rb の svn property 設定。

naruse:r41910 2013-07-11 10:13:10 +0900

r41886 と r41903 の続き。 rb_daemon() でも daemon(3) 呼び出し時に rb_thread_atfork() を呼んで Thread の停止などを行なうようにしています。そのため r41903 で追加した freebsd の時のテストは revert しています。

naruse:r41911 2013-07-11 10:31:23 +0900

fork を実行するテストの前で GC.start しておいて子プロセスでの GC 負荷を低減するように試みています。

nobu:r41912 2013-07-11 10:46:40 +0900

r41907 で追加した tool/probes_to_wiki.rb の usage のコメント修正と不要な中間データを作らないように Enumerable や Enumerator のメソッドの使いかたを工夫しています。

akr:r41913 2013-07-11 12:06:02 +0900

Bignum の乗算処理の変更。元々の乗算処理の流れを理解していないので要点が掴めてませんが、bary_mul_balance() を bary_mul_balance_with_mulfunc() と改名して引数に bary_mul() のバリエーションの関数への関数ポインタを受け取ってそれを用いるようにしています。また rbb_big_mul_balance() や bary_mul_karatsuba() で bary_mul() でなく bary_mul_XXX() を呼ぶようにするなど、各アルゴリズム用の関数を直接呼ぶようにしているみたいです。 Toom3 と Karatsuba というアルゴリズムが混ざらないようにしているそうです。

zzak:r41914 2013-07-11 13:01:47 +0900

標準添付ライブラリ securerandom.rb で if !... のような条件分岐しているところを unless を使うように変更しています。 https://github.com/ruby/ruby/pull/326

zzak:r41915 2013-07-11 13:49:33 +0900

sprintf.c の rdoc コメントの typo を修正しています。 https://github.com/ruby/ruby/pull/357

zzak:r41916 2013-07-11 14:24:32 +0900

dRuby のテストが hostname で取得されるホスト名を解決したアドレスが接続できない場合にエラーになるのに対処するためテストで使う URIlocalhost を使うようにしています。 [ruby-core:49101] [Bug #7311]
うーん、これ言い出すと localhost が名前解決できない場合も考慮するの、とかなってくるような気もするんですよねぇ。 hostname に設定した名前がネットワークインタフェースに対応したホスト名になってないことは、以前使ってたサーバ群でまれによくあったので、どっちかといえば localhost のほうがいいのでしょうけど。

zzak:r41917 2013-07-11 14:51:19 +0900

array.c の Array クラスの rdoc コメントで Array#reverse_each を使ったサンプルコードをわかりやすいものに変更。 https://github.com/documenting-ruby/ruby/pull/12

nobu:r41918 2013-07-11 20:17:54 +0900

string.c に NUL 文字を '\0' として 1byte でチェックするのではなくて、ちゃんと文字として(マルチバイト文字の場合は複数バイトになる可能性もあるので)確認する関数 str_null_char() を追加して rb_string_value_cstr() でマルチバイト文字のありえるエンコーディングの時はこれを使って NUL 文字チェックを行なうようにしています。
んー、ということはエンコーディングを考慮した NUL 文字は含まれていないけど、char * 型の C の文字列としては途中に '\0' が含まれているような文字列が取れる可能性があるってことになって、StringValueCStr() に期待されている前提が崩れるような気がするのですが……。そこはちゃんとエンコーディングを意識してあげないといけないということでしょうね。

nobu:r41919 2013-07-11 20:17:59 +0900

string.c の文字列末尾に NUL 文字を付加する処理を str_fill_term() という関数として追加して、マルチバイトなエンコーディングの時に 1byte だけじゃなくて必要なサイズの拡張をするようにしています。

nobu:r41920 2013-07-11 20:18:05 +0900

string.c の NUL 文字のマルチバイト対応の続き。 String オブジェクト確保時のバッファの確保にも最後に '\0' を追加することを考慮したサイズの調整が行なわれていたのですが、このサイズもエンコーディングを意識して必要なぶん伸ばすようにしています。

nobu:r41921 2013-07-11 20:18:10 +0900

NUL 文字のマルチバイト文字対応続き。 String#encode などによるエンコーディング変換時にも NUL 文字を必要なサイズぶん付加するように rb_str_fill_terminator() という関数を追加して trancsode.c から呼べるようにしています。

nobu:r41922 2013-07-11 20:18:15 +0900

r41918 からの一連の修正で UTF-16 などのエンコーディングでの NUL 文字のサイズがエンコーディングを意識するようになったので r41856 で WCHAR_NUL を追加するようにした workaround を削除しています。

nobu:r41923 2013-07-11 21:30:24 +0900

win32/win32.c の rb_w32_pow() で無限再帰を防ぐため pow を #undef するようにしています。これ後で戻さなくていいんでしょうか? [Bug #8495] [ruby-core:55923] [Bug #8621]