ruby-trunk-changes r57184 - r57194

今日は String#lines などの paragraph mode の修正、String#unpack にブロックを渡した時の不具合修正、instance_exec に Symbol から作ったブロック引数を渡した時の不具合修正などがありました。

nobu: r57184 2016-12-26 08:50:09 +0900

String#lines や String#each_line で引数に "" を渡して複数の連続した改行で分割する paragraph mode にした時に結果に余計な改行がつかないようにしています。

nobu: r57185 2016-12-26 08:56:55 +0900

String#lines や String#each_line の paragraph mode の処理を一箇所にまとめて、CR+LF の改行コードによる paragraph 分割にも対応するようにしています。

nobu: r57186 2016-12-26 14:07:54 +0900

win32/Makefile.sub の $(RUBYDEF) の依存関係の $(PREP) を $(RBCONFIG) に修正しています。 win32/mkexports.rb の実行に rbconfig.rb が必要だったため。

rhe: r57187 2016-12-26 15:32:00 +0900

r11175 (10年以上昔ですね)で String#unpack の指示子 b, B, h, H などで文字列を返す時に未初期化の String オブジェクトを返す可能性があった不具合を修正しています。 知らなかったのですが String#unpack ってブロックを受け取って、値を unpack する毎に yield するんですね。そのための UNPACK_PUSH() というマクロの実行が文字列オブジェクトを作った時点で呼ばれていて、結果を書き込む前だったのを修正しています。ってことは、この追加されているテストって ret << v のところは ret << v.dup とかしないと後から書き変わるので修正前も通ってしまうんじゃないでしょうか? [ruby-core:78841] [Bug #13075]

nobu: r57188 2016-12-26 17:01:37 +0900

win32/Makefile.sub で config.status を読んで RUBY_SO_NAME の設定? などをして config.h の依存を消しているようですが、コマンドラインの文法がよくわからない…。

nobu: r57189 2016-12-26 18:28:46 +0900

addr2line.c dln.c gc.c で strcpy(3) を使っているところを memcpy(3) におきかえたり malloc(3)+strcpy(3) を strdup(3) におきかえたりといったリファクタリング

nobu: r57190 2016-12-26 18:28:47 +0900

regerror.c で固定長の文字列の追加に xstrcat() のかわりに memcpy(3) を利用するようにリファクタリングしています。

nobu: r57191 2016-12-26 18:28:48 +0900

missing/strerror.c でバッファサイズ制限のない sprintf(3) を利用していたところがあったので snprintf(3) を利用するように修正しています。

nobu: r57192 2016-12-26 18:32:07 +0900

KNOWNBUGS.rb に lambda で生成した Proc オブジェクトを & をつけてブロック引数として渡した時の yield に配列を渡した時に splat されずに引数の数が異なったら ArgumentError になるというテストを追加しています。 KNOWNBUGS.rb なので既知の不具合で失敗する状態で追加されているということだと思います。ちなみに yield の時だけこれは起きるみたいで、ブロックの呼び出しの splat のルールは複雑で、2.0 のあたりで一度整理されたと思ったのですがまだ微妙なケースが残っていたみたいですね。 [ruby-core:77065] [Bug #12705]

nobu: r57193 2016-12-26 19:00:34 +0900

test/ruby/test_symbol.rb で子プロセスに渡すスクリプトのヒアドキュメントに begin と end の2つのトークンによるヒアドキュメントを利用して syntax highlight をだますテクニックを使うようにしています。

nobu: r57194 2016-12-26 19:00:36 +0900

instance_exec に Symbol#to_proc で Symbol から作られた Proc オブジェクトがブロック引数として渡された場合、receiver のオブジェクトではなく引数に渡されたオブジェクトに対して Symbol のメソッドが呼ばれるようにしています。 えー、これってそういう挙動が正しいのかな。しかし 2.3 まではそうだったみたいです。まあ確かに receiver に対して呼ばれたら instance_exec する意味がない(__send__ でいい)ので、このほうが使い勝手はいいのかもしれないですね。 [ruby-core:78839] [Bug #13074]