ruby-trunk-changes r60580 - r60591

今日は struct RNode の構造体の位置情報の格納のしかたの変更や webrick の機能追加どがありました。

yui-knk: r60580 2017-10-30 22:36:20 +0900

NODE に行番号を struct RNode::nd_reserved を前後 16bit に分けて lineno と column を詰めるようにしています。ついでに parse.y で各 NODE の確保の引数に column を渡してたのを YYLTYPE という位置情報を持つ型を渡すようにしています。今までは行番号はどうしてたんだっけなぁ、と思ったら struct RBasic::flags の一部に格納してて、このコミットではそこはいじらず両方存在するような状態です。

yui-knk: r60581 2017-10-31 08:44:42 +0900

r60580 の続きで branch coverage で位置情報を取得するのに flags ではなくて nd_reserved に格納した行番号のほうを取るようにしています。同じものかと思ったら、両者には行が異なるケースがあるようで、コミットログにあるようにちょっと変な書きかたをして if の条件部が if と別の行になるとどっちを NODE_IF の行番号にするかが変わるようです。

svn: r60582 2017-10-31 08:44:43 +0900

version.h の日付更新。

normal: r60583 2017-10-31 08:47:27 +0900

Dir.chdir で chdir(2) の実行中に GVL を解放するようにしています。これもシングルスレッドでの性能は落ちるけど遅い filesystem でブロックするのを避けるための変更の一環ですね。

normal: r60584 2017-10-31 08:56:44 +0900

標準添付ライブラリ webrickWEBrick::HTTPResponse#send_body_proc でレスポンスを Proc オブジェクトとして渡して、それを socket をパラメータに呼び出してレスポンスを返すことができるようにしています。チケット番号が3桁だ! [ruby-core:20474] [Feature #855]

yui-knk: r60585 2017-10-31 09:46:30 +0900

引数なしの case 文の時のために NODE_CASE2 という新しい NODE の種類を追加しています。で、NODE_CASE2 のコンパイル時には branch coverage に使う行番号を先程導入した nd_line から元の nd_lineno を使うようにしています。というか compile_when() は compile_case2() に改名してしまっていますね。

normal: r60586 2017-10-31 10:37:37 +0900

標準添付ライブラリ webrickWEBrick::HTTPResponse で IO でレスポンスを返す時に String#<< で文字列を組み立ててたのを文字列リテラル内の式展開を利用するようにしています。こちらのほうが最適化がききやすいからとのこと。

mame: r60587 2017-10-31 14:24:21 +0900

parse.y で intern_cstr() の定義を RIPPER の有無で分岐してましたが、同じ定義をしてたので分岐を消しています。

hsbt: r60588 2017-10-31 16:24:29 +0900

拡張ライブラリ psych で文字列オブジェクトのバッファにNUL終端がない時のことを考慮していない部分があったので、StringValuePtr() のかわりに StringValueCStr() を利用するように修正しています。 [ruby-dev:50285] [Bug #13993]

nobu: r60589 2017-10-31 18:33:21 +0900

iseq_compile_each() から return 文のところを compile_return() という関数に切り出しています。

nobu: r60590 2017-10-31 18:33:22 +0900

r60589 で切り出した compile_return で、top-level return の時に ensure 節の実行が行なわれない不具合の修正をしています。 [ruby-core:83589] [Bug #14061]

yui-knk: r60591 2017-10-31 22:29:54 +0900

構造体 struct RNode::nd_reserved のメンバ名を nd_location と改名しています。