ruby-trunk-changes r60480 - r60505

今日は主に AST に使う NODE のオブジェクトの構造体の変更と、th -> ec の変更の続きなどがありました。

watson1978: r60480 2017-10-27 23:55:03 +0900

String#prepend で引数が1つだけの時に rb_str_update() を利用して一時オブジェクト生成を抑制する最適化を行なっています。 https://github.com/ruby/ruby/pull/1670 [ruby-core:82195] [Bug #13773]

mame: r60481 2017-10-28 00:06:38 +0900

%i{} や %{} などのリテラルで生成された文字列オブジェクトを add_mark_object() に渡すようにしています。 GC の mark の対象にするっぽくみえるけど実際は何もしないマクロとして定義されています。

svn: r60482 2017-10-28 00:06:39 +0900

version.h の日付更新。

kazu: r60483 2017-10-28 00:13:59 +0900

error.c に冗長な #include があったので削除しています。

kazu: r60484 2017-10-28 00:14:02 +0900

r60477 で vm_caller_setup_arg_block() の引数の型を変更したのに仮引数名が th のままだったので ec に変更しています。

mame: r60485 2017-10-28 00:59:02 +0900

AST の NODE を T_NODE 型のオブジェクトから、T_IMEMO 型オブジェクトのサブタイプの imemo_ast で wrap した構造体 ast_t として定義しなおしています。うおお、これは大きな変更。これにより ast_t そのものは GC の対象ではなくなる(もちろん T_IMEMO 型のオブジェクトで wrap した時には結果的に GC 経由で解放され得る)。これにより NODE の構造体サイズの制限がなくなったり(struct RNODE の slot に入れなくてよくなるので)して、coverage でこの追加の領域を使いたくて外したようです。ただ ripper がまだ T_NODE 型のオブジェクトを利用していて T_NODE 型そのものはまだ削除されていません。

mame: r60486 2017-10-28 01:02:34 +0900

…という r60485 の ast_t 導入なのですが revert されています。なにかテストがこけたりしたのかな。この早さをみるとどこかの環境でビルドできなかったとかかな。

mame: r60487 2017-10-28 01:34:57 +0900

iseq_compile_each0() で r60479 で導入した freeze_literal() を使うようにリファクタリングしています。

mame: r60488 2017-10-28 01:44:57 +0900

r60485 を revert してた r60486 を revert しています。 内容には変更はないみたいですね。たぶん次の r60489 の修正が必要だったのでしょう。

mame: r60489 2017-10-28 02:06:06 +0900

parse.y でヒアドキュメントの parse 時に add_mark_object() で ast_t の parse 中に mark すべきオブジェクトの配列へ追加するようにしています。この mark もれで不具合があったのだと思われます。

normal: r60490 2017-10-28 03:37:23 +0900

r60284 の copy_file_range(2) という Linuxシステムコールを使った IO.copy_stream の実装で copy_file_range(2) が EBADF を返した時に fd に O_APPEND が設定されてたら例外を発生させずに他の実装を利用するようにしています。 [ruby-core:82646] [Feature #13867]

ko1: r60491 2017-10-28 03:55:28 +0900

WeekMap のテストで r60440 の変更で失敗する部分を skip するようにしているそうです。

ko1: r60492 2017-10-28 04:08:31 +0900

rb_vm_opt_struct_aref(), rb_vm_opt_struct_aset(), rb_insn_func_t 型の関数ポインタなどの引数の型を rb_thread_t から rb_execution_context_t に変更しています。このシリーズまだ続いてたのか。

ko1: r60493 2017-10-28 04:16:51 +0900

OPT_CALL_THREADED_CODE が有効な時の VM の関数で引数の型変更に追随もれや typo していたところなどを修正。

nobu: r60494 2017-10-28 06:08:35 +0900

compile.c の関数の NODE を受け付ける関数の引数に const 修飾子を追加しています。

nobu: r60495 2017-10-28 06:08:37 +0900

struct node_buffer_struct の node_buffer_t への typedef は node.h でしているので node.c の定義部での typedef は削っています。

normal: r60496 2017-10-28 08:26:48 +0900

r58400 で拡張ライブラリ socket で MSG_DONTWAIT が使える環境では fd に O_NONBLOCK を付けないようにした時にバッファが考慮されていなかったのを修正しているようです。 [ruby-core:80302] [Feature #13362]

ko1: r60497 2017-10-28 09:45:43 +0900

iseq_compile_each() の引数につけた const 修飾子が VC でコンパイルエラーになるそうで削除しています。

a_matsuda: r60498 2017-10-28 10:05:17 +0900

TracePoint#disable の rdoc 用コメントのサンプルコードの戻り値が間違ってたのを修正しています。 https://github.com/ruby/ruby/pull/1727

ko1: r60499 2017-10-28 14:36:48 +0900

rb_execution_context_mark() で machine stack の mark 処理を行う条件に ec が現在の execution context ではないというのを追加しています。GC 中の context だったら別途 mark されるはずだから、ということかなと。

a_matsuda: r60500 2017-10-28 15:49:50 +0900

TracePoint.trace の rdoc 用コメントのサンプルコードで、ブロックパラメータに渡されるオブジェクトに line メソッドを呼んでいる例があったので lineno に修正しています。 https://github.com/ruby/ruby/pull/1731

ktsj: r60501 2017-10-28 18:22:44 +0900

命令列の disassemble (コマンドラインオプション --dump=insns が指定された時などに表示するもの)のための関数 rb_insn_operand_intern() で最近追加された rb_call_info_t::flag の種類の対応を追加しています。

ktsj: r60502 2017-10-28 18:22:45 +0900a

同じく rb_insn_operand_intern() でダンプ文字列の typo を修正しています。

ko1: r60503 2017-10-28 19:01:54 +0900

vm_passed_block_handler_set() や pass_passed_block_handler()、vm_passed_block_handler() なども引数の rb_thread_t を rb_execution_context_t に変更。

ko1: r60504 2017-10-28 19:23:58 +0900

vm_cref_new_toplevel(), vm_set_top_stack(), vm_set_eval_stack() なども引数の rb_thread_t を rb_context_t に変更しています。

eregon: r60505 2017-10-28 19:32:45 +0900

spec/ruby に Rational と Complex が常に freeze された状態になるという r60214 の変更に追随したテストを追加しています。 [ruby-core:83167] [Feature #13983]