ruby-trunk-changes 2019-09-27

今日は C API からのメソッド/ブロック呼び出しでも keyword splat の変換と警告を有効にする変更、nil/true/false の to_s でも freeze された文字列を返すようにする変更、ISeq の GC.compact 対応の強化などがありました。

[41e3c204fd] Takashi Kokubun 2019-09-26 13:13:24 UTC

4a4c5028258e53f3395af29655a66bcef796fd73 で追加した MJIT の benchmark のループ回数などをちょっと減らしています。

[c4ec817a7a] Nobuyoshi Nakada 2019-09-26 13:56:32 UTC

rubygems の Gem::Specification#to_ruby のメソッド内に明示的な require "openssl" を追加しています。

[b29c68e687] Nobuyoshi Nakada 2019-09-26 13:57:25 UTC

508afe2c26737e0be60a72faa9d6740a06b0914c で rubygems がパッケージ作成時に常に環境変数をセットするようになったので rdoc のテストでこの影響を緩和するため ENV の保存と復旧を行うようにしています。

[5b9d646944] Jean Boussier 2019-09-26 11:41:41 UTC

9d0866c7d7b9cbe36a851744a37806e747e0e7a8 の Module#name の返す String が freeze されたものにしたことについてのテスト追加と NEWS エントリの行頭に "[" がこないようにする整形。

[0aa267f985] Jeremy Evans 2019-09-25 18:02:40 UTC

Kernel#open が第1引数に対して to_open というメソッドで変換するという機能(こんなのあったのか)で keyword splat が委譲された時の警告についてのテストを追加しています。

[760893d2f8] Jeremy Evans 2019-09-25 18:22:14 UTC

Proc#<< および Proc#>> による Proc 合成時の引数の委譲でも keyword splat の変換と警告が機能するようにしています。

[3959469f24] Jeremy Evans 2019-09-25 22:03:09 UTC

OpenSSL が IO オブジェクトに対して sysread/read_nonblock/syswrite/write_nonblock メソッドを呼ぶ時に rb_funcall() にかわり rb_funcallv_kw() を使ってここでも keyword splat の変換と警告が機能するようにしています。水も漏らさぬ対応……とはいえ openssl は default gem になっているので、これを upstream に当てるには古い ruby のバージョンへの対応が必要ですね。

[47d44510a3] Jeremy Evans 2019-09-25 22:32:35 UTC

拡張ライブラリ pathname から File.binwrite, File.write, File.readlines, File.open などのメソッドを呼ぶのに rb_funcallv() などを利用していたのも rb_funcallv_kw() を使うようにしています。

[6b52959ef7] Jeremy Evans 2019-09-26 00:14:17 UTC

Thread.new の引数をブロックパラメーターに委譲する時にも keyword splat の変換と警告が機能するようにしています。

[b193041b99] Jeremy Evans 2019-09-26 00:57:00 UTC

同様に Fiber#resume の引数を Fiber のブロックに渡す時の keyword splat の変換と警告が機能するようにしています。

[9556342838] Jeremy Evans 2019-09-26 00:59:41 UTC

6b52959ef76f6f19e50c6f80f00c08bb0daf5c7c の変更でのコンパイラ警告の抑制のため明示的な int へのキャストを追加しています。

[3b9cdc59ce] git 2019-09-26 15:02:18 UTC

version.h の日付更新

[876c5fe1b2] Nobuyoshi Nakada 2019-09-26 15:37:54 UTC

955634283862d9d1966de43c73ece15714afdae2 の追加修正だと思いますが thread_create_core() でキャストする args がそもそも int に収まっているかというのと RARRAY_LENINT() を使ってチェックするようにしています。

[81191afe8a] Nobuyoshi Nakada 2019-09-26 16:13:10 UTC

0aa267f985084e69c3e45cc3e94698eaacab5c36 で追加したテストで Kernel#open が再定義されていて別の実装が動いているケースというのを考慮するようにしています。警告メッセージの判定に使う Regexp の === メソッドを再定義することで内部から呼ばれたメソッドを判定するというすごいワザ。

[dd1e047fcb] Nobuyoshi Nakada 2019-09-26 17:31:39 UTC

NEWS ファイルのインデント修正とマークアップ記法の修正。

[451776f13d] Aaron Patterson 2019-09-12 22:02:23 UTC

compile_data_alloc() の struct iseq_compile_data_storage を取り出す部分とそれ以降を分けて compile_data_alloc_with_arena() という関数に切り出すリファクタリング。この storage を arena と呼んで後で分離しようとしているみたいです。

[bd017c633d] Aaron Patterson 2019-09-12 22:15:43 UTC

同様に compile.c の struct iseq_compile_data_storage の初期化処理と解放処理を new_arena() と free_arena() という関数に切り出しています。

[3cd8f76f7f] Aaron Patterson 2019-09-12 22:21:18 UTC

451776f13d24b0121b2bdfbe4eaafe7c74069c72 と bd017c633da4fe27c85b5dfc059b85d44a3b7afe の下準備を経て compile.c の struct iseq_compile_data_storage を ISeq 全体のもののほかに Node 毎の? arena というのを準備して使い分けることができるようにしています。というか実質 node のほうを使うように全部切り替えてるっぽいですね。この node のほうの arena には mark 処理できるオブジェクトのみ入れるということだそうです。つまりこれも GC.compact 対応の一環なわけですね。

[a618d64086] Aaron Patterson 2019-09-16 23:09:46 UTC

続いて compile_data_alloc_insn() では insn のほうの arena を使ってメモリ確保するようにしています。

[50fadefb7e] Aaron Patterson 2019-09-17 00:19:44 UTC

ここまでで insn arena と node arena にわけた ISeq コンパイル時のデータのうち node arena のほうを ISeq の mark 時に内容によって mark 処理するようにしています。これで mark 用配列にオブジェクトを入れる必要がなくなるというのがねらい。

[f639e04699] Aaron Patterson 2019-09-23 19:10:33 UTC

compile.c の iseq_add_mark_object_compile_time() を呼び出す位置を変更。 Write Barrier 追加できる位置(GC の mark 処理がそのオブジェクトに到達できるようになっている状態)に移動したとのこと。

[98d7583bfc] Aaron Patterson 2019-09-25 20:59:54 UTC

同じく compile.c の freeze_literal() で mark 用配列へ追加していたのを、呼び元で NODE に繋げた後で iseq_add_mark_object_compile_time() を呼ぶように修正しています。

[e197d9ca71] Aaron Patterson 2019-09-25 21:08:11 UTC

compile.c の iseq_add_mark_object_compile_time() で実際には mark 用配列にオブジェクトを追加せずに、Write Barrier のみ入れるようにしています。

[9b6460cacc] Aaron Patterson 2019-09-25 21:57:25 UTC

e197d9ca71570c980274ddd2cb6a32af6c00d95e で mark 用配列への追加は実際には行なわれなくなったので struct iseq_compile_data のメンバー mark_ary を削除しています。

[0846d48853] Aaron Patterson 2019-09-26 20:16:33 UTC

直近の変更で compile.c の iseq_add_mark_object_compile_time() は単に RB_OBJ_WRITTEN() を呼ぶだけになったので関数定義自体を消して呼び元で直接 RB_OBJ_WRITTEN() を呼ぶようにしています。

[4808afb360] Aaron Patterson 2019-09-26 20:19:11 UTC

同じく 98d7583bfcf1442c01ebe0288726cacef138d349 で compile.c の freeze_string() も単に rb_fstring() を呼ぶだけになってたので削除して、直接 rb_fstring() を呼ぶようにしています。

[f5e8d33761] Aaron Patterson 2019-09-26 21:57:45 UTC

cont.c が clang で文字列フォーマットの型で警告が出てたので明示的キャストを追加しています。

[31339ef4f2] George Claghorn 2019-09-11 19:47:20 UTC

拡張ライブラリ syslog の Syslog::Logger でインスタンス変数 @level を直接参照しているところで attr_reader の level メソッドを使うようにしています。 level メソッドを再定義された時にそれが効くようにするためみたいです。

[dd2068ac8d] Jeremy Evans 2019-09-26 16:09:30 UTC

rb_adjust_argv_kw_splat() の extern 宣言が各所で行なわれてるので internal.h に prototype 宣言するようにしています。

[37f9213f89] Jeremy Evans 2019-09-26 16:10:42 UTC

Enumerator::Generator#each の引数をブロックに渡すところも keyword splat の変換と警告が有効になるように rb_proc_call_kw() を利用するようにしています。

[293c6c8cc3] Aaron Patterson 2019-09-09 22:46:07 UTC

GC.compact で T_IMEMO 型オブジェクトの中身が rb_ast_t の場合の参照更新に対応して移動できるようにしています。

[660c7e050f] Jeremy Evans 2019-09-27 00:25:54 UTC

Enumerator::Yielder の keyword splat 変換と警告の対応や C からブロックを呼び出す API rb_yield_block()、vm_yield()、vm_yield_with_block() などの関数にも keyword splat の情報を伝播させる引数を追加する対応。このシリーズまだあるのか。

[366dd9d803] zverok 2019-03-10 11:09:59 UTC

標準添付ライブラリ fileutils の rdoc 用コメントでオプション引数をキーワード引数として渡す用例を書くように変更しています。

[1d99163aa5] Jeremy Evans 2019-07-10 03:41:51 UTC

標準添付ライブラリ fileutils の FileUtils.cp の実装で対象のファイルが socket (つまり UNIX socket?) だった時に require "socket" するようにして、作成するのに mknod ではなく UNIXServer を利用するようにしています。また fifo を作成する時に mode を保存するようにしています。

[02cd420505] Jeremy Evans 2019-07-14 17:17:57 UTC

1d99163aa59b637f1c14287135f26480df447e49 で追加したテストは JRuby では skip するようにしています。

[9494ef8b2d] Jeremy Evans 2019-07-31 19:57:21 UTC

FileUtils モジュールを include して使っている場合に verbose モードで実行されたメソッドはインスタンス変数を使おうとするため、メソッドの receiver が freeze されたオブジェクトだった場合に例外が発生してしまうので、特異メソッドとして使われてる時だけ利用してそうでない時は(正確には対象のインスタンス変数が存在しない時は)触らないようにしています。

[9792c9d183] Jeremy Evans 2019-08-23 21:50:34 UTC

1d99163aa59b637f1c14287135f26480df447e49 で追加したテストで dev ファイルのコピーのテストを File.chardev?/File.blockdev? のそれぞれに対応するファイルがみつかった時だけ実行するようにしています。

[06c35cfa65] Jeremy Evans 2019-08-23 21:52:12 UTC

標準添付ライブラリ fileutils の FileUtils.copy_entry で Windows における symbolic link の対応の修正。 [Bug #12123]

[d5355123cc] Kazuhiro NISHIYAMA 2019-08-24 12:19:31 UTC

標準添付ライブラリ fileutils でグローバル変数 $fileutils_rb_have_lchmod というのを使ってたのをクラス変数に変更しています。

[49b7805e9a] Hiroshi SHIBATA 2019-08-12 12:05:53 UTC

fileutils の gemspec ファイルで development_dependency に rake を追加してたのを消しています。かわりに Gemfile を使うとのこと。 upstream からの cherry pick ですね。

[2082a26dc7] Hiroshi SHIBATA 2019-09-26 09:32:26 UTC

標準添付ライブラリ fileutils のバージョンを 1.3.0 に更新しています。

[eff15a269f] Jean Boussier 2019-09-26 15:27:47 UTC

NilClass#to_s, TrueClass#to_s and FalseClass#to_s なども毎回オブジェクトを生成せず freeze された文字列を返すようにしています。 [ruby-core:94815] [Feature #16150]

[4d3502d57f] Nobuyoshi Nakada 2019-09-27 05:01:37 UTC

eff15a269fdc37d2b09cf1dfe8c1b1bf6e377a32 の変更についてのテストを追加しています。 [ruby-core:94815] [Feature #16150]

[8d0ff88727] Nobuyoshi Nakada 2019-09-27 05:06:07 UTC

主に aaron の一連の変更のインデントとスタイルの修正。