ruby-trunk-changes r61597 - r61616

今日は NODE の種類の整理や rb_ast_t の構造体のリファクタリングや、Struct の :keyword_init オプションを使ったインスタンスの Marshal.load の不具合修正などがありました。

mame: r61597 2018-01-04 21:47:22 +0900

正規表現リテラルの式展開を最初の1回しかしない once オプション(/.../o) の時に NODE_SCOPE の NODE を利用していたのを、専用の NODE_ONCE というノード種類を追加しています。

mame: r61598 2018-01-04 21:56:49 +0900

IO のテストで子プロセス起動時に :rlimit_nproc オプションで起動できるプロセス数の制限を緩めています。時々 make test-all で timer thread の起動に失敗する警告が出ていたとのこと。

mame: r61599 2018-01-05 09:49:40 +0900

defined? 文のコンパイル時にダミーの NODE を使って例外を rescue するための命令を生成していたのを、new_child_iseq_ifunc() を使って ifunc によるコンパイルを利用するようにしています。ifunc は C の関数を登録してコールバック形式でコンパイルの内容を実装できるようにする仕組みのようですね。

svn: r61600 2018-01-05 09:49:41 +0900

version.h の日付更新。

mame: r61601 2018-01-05 09:49:41 +0900

ISeq の type の ISEQ_TYPE_DEFINED_GUARD は不要になったので削除して、かわりに ISEQ_TYPE_PLAIN を追加しています。 ISEQ_TYPE_PLAIN は NODE_ONCE (正規表現リテラルの once オプションの時に使われる NODE)をコンパイルする時に利用しています。 r61599 の変更で iseq_set_exception_local_table(iseq) での例外の無視を ISEQ_TYPE_DEFINED_GUARD でする必要がなくなったので、実体に合わせて名前も変えたという感じみたいです。

normal: r61602 2018-01-05 11:22:23 +0900

標準添付ライブラリ net/* の通信処理をまとめている net/protocol で Net::Protocol#rbuf_consume でバッファつきの読み込み処理で読むサイズが今の @rbuf のサイズと同じであれば、slice! で変更せずにバッファの文字列オブジェクトをそのまま返し、バッファを空文字列で再初期化するようにしています。slice! が遅いので、とのことですが slice! でバッファの capacity は変わらない(確保されているメモリサイズが減らない)可能性もあるので、メモリの節約にもなるようです。 rbuf_consume(@rbuf.size) のようにあるだけ読むという呼びかたをされているところがけっこうあるそうなので、Net::HTTP を使っている時も結構効くみたいですね。 [ruby-core:84586] [Feature #14268]

ko1: r61603 2018-01-05 11:25:26 +0900

メソッドの引数を *args のように配列で受けてから、その変数を上書きして引数なしの super で継承元のメソッドに委譲した場合、上書きした変数が引数として渡されて、配列を期待しているところで配列でないものが渡されて SEGV する可能性があったそうで、NODE_ZSUPER で rest 引数は splatarray 命令で明示的に配列化して渡すように対応しています。つまり引数を上書きしてから super するのは OK なんですね(上書きした値が引数として親のメソッドに渡される……。 [ruby-core:84622] [Bug #14279]

mame: r61604 2018-01-05 14:27:25 +0900

parser_compile_string() と rb_parser_compile_file_path() でそれぞれ rb_ast_t を確保して yycompile() の結果を ast->node に格納するという処理をしていたのを、yycompile() の中に移動して共通化して、yycompile() が NODE* でなく rb_ast_t* を返すようにリファクタリングしています。

hsbt: r61605 2018-01-05 15:18:57 +0900

.travis.yml の Slack 通知の設定のトークンの指定方法を変更しています。

ko1: r61606 2018-01-05 16:25:55 +0900

insns.def の invokeblock 命令の実装で vm_invoke_block() に渡す struct rb_calling_info のメンバー recv は未使用のはずということで、self を入れてたのを Qundef で初期化するように変更しています。

mame: r61607 2018-01-05 16:47:51 +0900

node.c および node.h のいくつかの関数の引数や構造体メンバの NODE * に const 修飾子を追加しています。

mame: r61608 2018-01-05 17:59:20 +0900

構造体 rb_ast_t のメンバー root および reserved1 を rb_ast_body_t という別の構造体に分離して、rb_ast_t の中に body メンバとして埋め込みするようにリファクタリングしています。

mame: r61609 2018-01-05 17:59:22 +0900

rb_iseq_new で始まる関数群で NODE のポインタを受け取っていたものを rb_ast_body_t を受け取るように変更しています。NODE を極力追い出そうとして関数のインターフェースには現れないようにしているのかなぁ。

mame: r61610 2018-01-05 17:59:23 +0900

NODE の NODE_PRELUDE という種類を削除しています。 NODE_PRELUDE っていうのはどうも BEGIN{} ブロックで定義された処理と本体の NODE をぶらさげたり、全体に影響するコンパイルオプションを保持するためのものみたいですが、AST の root NODE の直下にないといけないという制約があったので、その前提に依存するのはやめて普通の NODE_BLOCK にして、コンパイルオプションは r61608 で分離した rb_ast_body_t の reserved メンバーを compile_option と改名してそこに保持するように変更しています。rb_node_body_t 分離はこれのためだったか。

normal: r61611 2018-01-05 18:41:21 +0900

tool/rbinstall.rb で File.umask で umask を 0222 にセットしていたのを 022 に変更しています。なんかこれ前も変更して、何か問題があって再修正してたような…。 "Denying write permissions to the owner seems wrong." とのことで、チケットみると 2.4 でのみ rubygems で bundled gems のインストールする時に問題があるとか。うーむ、rubygems 側の問題なのかなぁ。 [ruby-core:84420] [Bug #14227]

normal: r61612 2018-01-05 19:30:40 +0900

struct RBacis::klass を 0 にして内部的なオブジェクトにされてたものを、klass をセットして Ruby レベルで見えるようにする rb_obj_reveal() という関数がありますが、拡張ライブラリ zlib の zstream_detach_input() で rb_obj_reveal() が重複していたところがあったので余分な呼び出しを削っています。

mame: r61613 2018-01-05 19:46:24 +0900

NODE_OP_CDECL の --dump=parsetree 時のダンプで || や && でない時の演算子の表示に使うメンバーが間違っていたのを修正しています。

mame: r61614 2018-01-05 20:39:25 +0900

node.c の r61610 の NODE_PRELUDE の削除で不要になったマクロ F_OPTION() の定義を削除しています。

mame: r61615 2018-01-05 20:39:27 +0900

r61613 の続き。 NODE_OP_CDECL だけでなく NODE_OP_ASGN1, NODE_OP_ASGN2 でも同様に演算子を判定してダンプ文字列を作っているところがあったので add_operator() という関数に切り出すリファクタリング

k0kubun: r61616 2018-01-05 20:44:31 +0900

r61166 の Struct.new の :keyword_init オプション引数追加を使って作ったクラスのインスタンスを Marshal.dump したものが正常に load できない状態だったので、load 時にインスタンス変数からオプションを取得して、:keyword_init が利用されていたら Hash を作って初期化するように修正しています。 [ruby-core:84629] [Bug #14314]