ruby-trunk-changes r67477 - r67501

今日はなんとオブジェクトの slot を compaction する GC.compact メソッドの追加、があったのですが CI のエラーで revert されたので最終的に NEWS ファイルの更新のみが残ったという感じです。

nobu: r67477 2019-04-09 22:08:29 +0900

NEWS ファイルに行頭にチケット参照の開き bracket がくると rdoc のメタキャラクタになってしまうので改行の位置を調整しています。

nobu: r67478 2019-04-09 22:08:30 +0900

同じく NEWS ファイルでコマンドラインオプションの "--" がメタキャラクタとして解釈されるのを防ぐため ++ で囲んでいます。

tenderlove: r67479 2019-04-10 05:32:04 +0900

GC.compact というメソッドを追加して、compaction GC を実行できるようにしています。アルゴリズムの詳細はチケットのほうに ASCII Art による図解と疑似コード付きで説明されているのでそちらを参照。全ての struct RVALUE が動かせるわけではなくて、新しく追加した mark_entry_no_pin() で(のみ) mark したものだけ移動できるようにしているようです。これで heap 減らせるのかなぁ。 [ruby-core:91634] [Feature #15626]

svn: r67480 2019-04-10 05:32:22 +0900

r67479 の新規追加ファイルの svn property 設定。

svn: r67481 2019-04-10 05:32:22 +0900

version.h の日付更新。

tenderlove: r67482 2019-04-10 05:47:36 +0900

r67479 で追加した GC.compact のテストで compaction がおきやすいように生成する一時的な Object インスタンスを2倍生成するようにしています。

tenderlove: r67483 2019-04-10 06:13:32 +0900

r67479 の修正。 Compaction のために拡張ライブラリから参照するクラスは rb_gc_register_mark_object() で明示的に登録しておかないといけなくなったので、拡張ライブラリ json で 追加が漏れていた例外クラスを登録するようにしています。拡張ライブラリは普通の rb_gc_mark() が pin するようになるから大丈夫ってことだったけど、これ拡張ライブラリの互換性が問題になるということなのでは。

tenderlove: r67484 2019-04-10 06:40:07 +0900

GC.compact の導入で weakref のテストがこけたそうなのでデバッグのために assert_nothing_raised をコメントアウトして例外を発生させるようにしています。

tenderlove: r67485 2019-04-10 08:03:40 +0900

ObjectSpace::WeakMap からの参照を pin するようにしています。そして r67484 の weakref のテストのデバッグのための変更を revert しています。なるほど WeakMap からの参照は mark はしないけど pin する必要はあるわけか。

tenderlove: r67486 2019-04-10 08:23:33 +0900

r67479 で追加した GC.compact のテストで1つもオブジェクトを移動できなくてもエラーにせず skip するようにしています。まあ、保守的GCなのでありえるから、ということかな。

tenderlove: r67487 2019-04-10 08:23:39 +0900

構造体 struct RMoved の宣言を include/ruby/ruby.h から internal.h に移動して外部に見せないようにしています。

shugo: r67488 2019-04-10 08:35:02 +0900

標準添付ライブラリ net/imapTLS の SNI が有効になるようにしています。GMailimap を使うのに必要だったとのこと。 https://github.com/ruby/ruby/pull/2077 [ruby-core:91466] [Feature #15594]

tenderlove: r67489 2019-04-10 08:48:17 +0900

compile.c の iseq_add_mark_object_compile_time() と freeze_literal() で ISeq の mark_ary に要素を追加する時に RGenGC の write barrier を追加しています。

nobu: r67490 2019-04-10 10:18:01 +0900

r67489 の変更で rb_gc_writebarrier() の引数の型の違いで警告が出てたので明示的なキャストを追加。

nobu: r67491 2019-04-10 10:34:44 +0900

ヘッダファイル timev.h の struct tvm の宣言の前にコメントアウトした状態で struct tvm の空の宣言を追加しています。"for TAGS" とコミットログにあるので構造体宣言がマクロ PACKED_STRUCT_UNALIGNED() の中で行なわれてるので ctags でインデックスが作られないのでその対策ということかな?

nobu: r67492 2019-04-10 14:12:33 +0900

parse.y で CompileError の例外メッセージで "p->xxx" みたいにソースコード上の変数名を使って書いてたところをメンバー名だけにしています。コミットログによるとリファクタリング時にうっかりメッセージ内も置換してしまってたようです。

nobu: r67493 2019-04-10 15:44:41 +0900

r67479 の GC.compact 追加時の変更部分のスタイルの修正。

nobu: r67494 2019-04-10 15:44:42 +0900

同じく r67479 の変更で rb_add_method_iseq で構造体 rb_method_iseq_t と同じレイアウトの構造体を関数内で定義して rb_add_method() に引数として渡してたのを普通に rb_method_iseq_t の変数を定義して使うように修正しています。なんでこんなことしてたんだろ。

nobu: r67495 2019-04-10 15:44:43 +0900

id_table.c の rb_id_table_foreach_with_replace() で replace ポインタで渡された関数への第1引数に Qundef を渡してたところを NULL に修正しています。型は VALUE ではなくて ID* で Qundef != NULL なので。

nobu: r67496 2019-04-10 16:18:25 +0900

rescue 節で例外を暗黙のうちに保持する特殊変数 $! の ID を defs/id.def に追加して組込みで定義しておくようにしています。

mame: r67497 2019-04-10 17:03:47 +0900

拡張ライブラリ openssl の OpenSSL::BN.new の第1引数に nil を渡すと SEGV してたので StringValuePtr() の呼び出しを if 文の条件部からその前に出すようにしています。 StringValuePtr() はマクロで内部で str 自身を上書きすることがあるから…でも Qnil の時には例外になりますよねぇ。関数の評価の順序のためかな(コンパイラによって違いそう)。 [ruby-core:92231] [Bug #15760]

svn: r67498 2019-04-10 17:03:48 +0900

r67497 のインデントのタブを空白に展開。

kazu: r67499 2019-04-10 18:15:21 +0900

r67479 の GC.compact で CI が失敗しているため r67479 から r67496 までのコミットを全部 revert しています。 けど実際には openssl の変更も revert されちゃってるので r67497 も revert されてそう。

svn: r67500 2019-04-10 18:16:00 +0900

であらためてインデントのタブを空白に展開。

svn: r67501 2019-04-10 18:16:01 +0900

svn さんによる version.h の日付更新も revert されたので再度更新されています。