ruby-trunk-changes r55603 - r55605

今日は IO.readlines/IO.foreach の最適化と、Floar#round の丸め方向の調整、末尾呼び出し最適化の VM オプションを使った時に Symbol をブロック引数として渡した時の不具合修正がありました。

nobu: r55603 2016-07-07 16:31:09 +0900

IO.readlines や IO.foreach で separator や limit などの引数の解釈を1行の処理毎に行なっていたので、最初に1回だけ行なって結果を渡すようにコールバック関数の切り出しかたを変更しています。

nobu: r55604 2016-07-07 16:37:55 +0900

Float#round で引数で丸める桁を指定した時に丸め方向が直感的な四捨五入になるように調整しています。これでいいのか読んでてしばらく悩んだので、ぜひコードを読んでみてください。2進数で考えると納得できます。
が、本当にこのほうがいいのかというのはなかなか難しい問題のような気も。

shugo: r55605 2016-07-07 20:08:52 +0900

RubyVM::InstructionSequence.compile_option で末尾呼び出しの最適化 :tailcall_optimization を true にして Symbol をブロック引数として渡した時に SEGV する不具合を修正しています。 vm_caller_setup_arg_block() で Symbol をそのまま rb_block_t::iseq にセットしてしまう最適化が末尾呼び出し最適化が行なわれている時にも行なわれてしまって不正メモリアクセスになるようです。呼ぶところで対応することも可能なのかな。とりあえず末尾呼び出し最適化が有効な場合には呼び出し時点で Symbol の Proc オブジェクト化を行なってから呼び出すようにしています。 [ruby-core:76288] [Bug #12565]