ruby-trunk-changes 2019-11-08

今日はなんといっても組込みクラスのメソッドを ruby で実装してそこから C 実装の関数(builtin function)を呼び出すという機構を導入して、いくつかのクラスが ruby で定義される(具体的な実装は C の関数を呼ぶだけというものがほとんどですが)ようになっています。また object_id がこれまでの slot のアドレス(struct RVALUE 構造体のポインタ)を利用していたのを、単調増加する整数になるようにしたという変更もありました。

[d62abc47c8] Nobuyoshi Nakada 2019-11-07 14:33:45 UTC

ext/ripper/tools/dsl.rb で警告抑制のため二重代入するようにしています。

[b99833baec] John Hawthorn 2019-11-01 00:21:01 UTC

bd2b314a05ae9192b3143e1e678a37c370d8a9ce の object_id に単調増加する数値を使う変更のリトライ。これ入るのか。前回のは単に master の変更に追随できていなかったみたいですね。というわけで内容も読んだところ構造体 rb_objspace_t に next_object_id を追加して cached_object_id() で新たに採番するつど増やしていくようにしています。といっても単に +1 していくのではなくて struct RVALUE のサイズの半分ずつ(なんで半分?)増やすようにしています。 https://github.com/ruby/ruby/pull/2638

[597ec43543] git 2019-11-07 17:31:29 UTC

version.h の日付更新

[dddf5afb79] Aaron Patterson 2019-11-07 20:46:14 UTC

GC 関連カウンターに GC.compact が実行された回数を数える :compact_count を追加しています。

[46acd0075d] Koichi Sasada 2019-11-07 07:58:00 UTC

組み込みメソッドなどを Ruby で実装するための仕組みの導入。 tool/mk_builtin_binary.rb というツールを追加して ruby で書かれたスクリプトを ISeq にコンパイルしてから to_binary でバイナリ表現にしたものを C コード片として ruby インタプリタに含めインタプリタ起動時にロードすることで ruby で書かれた定義を起動時に直接(parse/compile はスキップして)ロードするようにしています(miniruby の時点では起動時に動的に読み込んでる模様)。
また tool/mk_builtin_loader.rb というツールでこの ruby スクリプト内で "__builtin_" という prefix を持つメソッド呼び出しを含むものを抽出してテーブル化した C ソース片も生成して、__builtin_xxx というメソッド呼び出しはある C ソース内(生成された .inc ファイルを include したファイル内)の xxx という関数の呼び出しとして処理されるようにしています。このため rb_vm_t に rb_builtin_function というメンバーを追加して、現コンパイル中の ISeq から呼ばれる builtin function のテーブルを一時的にセットできるようにしています。このため VM 命令にも builtin func 呼び出しのための invokebuiltin と opt_invokebuiltin_delegate、opt_invokebuiltin_delegate_leave といった命令が追加されています。なので __builtin_xxx による C 関数の呼び出しは ruby 本体に埋め込むものでのみ有効で普通の ruby スクリプトから使えるものではありません。 [ruby-core:95344] [Feature #16254]

[e2a45cb984] Koichi Sasada 2019-11-07 09:22:08 UTC

46acd0075d80c2f886498f089fde1e9d795d50c4 で導入された builtin 関数呼び出しと ruby スクリプトの埋め込み機能を利用して TracePoint の実装を trace_point.rb にしてそこから vm_trace.c の関数を呼び出すメソッドを定義するようにしています。なるほどー、こういうふうに使うのか。 Init_vm_trace() からは rb_define_method() は消してかわりに tool/mk_builtin_loader.rb が生成する load_trace_point() を呼び出すようにしています。

[a47d058ebf] Koichi Sasada 2019-11-07 09:29:20 UTC

同じく builtin 関数を利用して RubyVM::AbstractSyntaxTree の実装を ast.rb に移動してそこから各メソッド内で C の関数を __builtin_xxx で呼ぶようにしています。

[4c00b9e8eb] git 2019-11-08 00:09:47 UTC

compile.c の行末の空白除去。

[46b9ca6c54] Koichi Sasada 2019-11-08 00:26:16 UTC

46acd0075d80c2f886498f089fde1e9d795d50c4 で追加した iseq_builtin_function_name() の __builtin_ の prefix のサイズを格納する変数を size_t に修正しています。

[08ff9edb53] Koichi Sasada 2019-11-08 00:30:11 UTC

a47d058ebf6890f4ad81c9c3419e767b4f093815 で追加した ast.rb の改行コードが CR+LF だったみたいなので LF に修正しています。

[dad2abc69f] Koichi Sasada 2019-11-08 01:02:21 UTC

46acd0075d80c2f886498f089fde1e9d795d50c4 の __builtin_func 対応で rb_bug() での異常終了時に利用していた __func__ というマクロは VS 12.0 では利用できないとのことでちゃんとしたメッセージを書くようにしています。

[365557f111] Koichi Sasada 2019-11-08 00:39:28 UTC

IO#read_nonblock と IO#write_nonblock の実装を io.rb に移動して __builtin_ 関数を使って C 実装を呼ぶようにしています。 まずは元々 prelude.rb を使って wrapper が書かれてたメソッドをこの方式に移植していく流れですかね。

[eaa011ffdb] Koichi Sasada 2019-11-08 01:10:37 UTC

.travis.yml の BASERUBY に古い ruby を使うテストで BASERUBy のバージョンを 1.9.3 から 2.2 に変更しています。 tool/mk_builtin_loader.rb などが BASERUBY で実行されるので要求バージョンが上がったようです。

[a1a08ac9aa] 卜部昌平 2019-11-08 01:24:57 UTC

d45a013a1a3bcc860e6f7f303220b3297e2abdbc で追加された vm_cache_check_for_class_serial() に複数の class_serial をどのように更新するかなどの説明をコメントに図解つきで追記しています。

[7661150109] 卜部昌平 2019-11-08 02:11:21 UTC

dad2abc69fdd1af52df353b8604017bd6a5c6a99 で書き直した rb_bug() のメッセージのソースコードのファイル名部分を RUBY_FUNCTION_NAME_STRING というマクロを利用して埋め込むようにしています。

[d4da74ea78] Kazuki Tsujimoto 2019-11-08 02:37:07 UTC

Struct#deconstruct_keys というメソッドを新規追加して Struct のインスタンス(クラス)のインスタンスをパターンマッチに渡して Hash pattern でマッチさせられるようにしています。 [Feature #14912]

[90fc555258] 卜部昌平 2019-11-08 03:07:03 UTC

d45a013a1a3bcc860e6f7f303220b3297e2abdbc の call cache の class_serial の履歴保持化の変更で cache miss した時に最終的に method entry の再探索を含む関数を呼ぶかどうか決める calccall() の戻り値をローカル変数に保持しておくようにリファクタリングしています。

[cfccd59cb1] Kazuki Tsujimoto 2019-11-08 03:44:31 UTC

da2e0721b1ba94e8e786224469fe4bf7550c996a (r54612)で追加されたテストメソッドの typo 修正。

[61cff5c51c] Nobuyoshi Nakada 2019-11-08 04:21:29 UTC

mini_builtin.c に BOM がついていたので削除しています。

[0ad0a8ff58] Nobuyoshi Nakada 2019-11-08 05:26:21 UTC

46acd0075d80c2f886498f089fde1e9d795d50c4 で iseq.h の #include "builtin.h" の位置を vm_core.h の後に移動しています。

[2eb02dfd3b] Koichi Sasada 2019-11-08 06:13:24 UTC

46acd0075d80c2f886498f089fde1e9d795d50c4 で追加された tool/mk_builtin_loader.rb で生成する C コード片で、コンパイラがサポートしていたら #pragma で(たぶん) -Wincompatible-pointer-types を一時的に有効にして builtin 関数の呼び出しで引数の数が一致してなかったらビルドエラーになるようにしています。

[8fa41971c2] Koichi Sasada 2019-11-08 06:27:32 UTC

GC のクラスメソッド定義も gc.rb に移動して builtin 関数呼び出しを利用するようにしています。 prelude.rb にないものも移動しはじめた。

[054cb6d389] Koichi Sasada 2019-11-08 06:29:59 UTC

8fa41971c204555b889c9722586b8baee55a0ca8 で追加し忘れてた gc.rb を追加。

[0b29662606] Koichi Sasada 2019-11-08 06:32:01 UTC

そして gc.rb の改行コードも LF に修正しています。

[83c563cfa4] Koichi Sasada 2019-11-08 07:16:25 UTC

ISeq のバイナリからのロードする ibf_load_setup_cstr() は _cstr という suffix にもかかわらず実際には NUL terminated じゃないバイト列を受け取るので、ibf_load_setup_bytes() に改名して引数も cstr -> bytes と改名しています。iseq.h の prototype 宣言のほうの引数名が cstr のままですね(仮引数名は一致しなくてもエラーにならないと思うけど)。

[6e72b72881] aycabta 2019-11-08 07:17:53 UTC

標準添付ライブラリ reline でブロックのパラメーターが外の変数と同名だと shadowing outer local variable の警告になるので改名して警告抑制しています。

[20971799f2] Nobuyoshi Nakada 2019-11-08 07:24:24 UTC

46acd0075d80c2f886498f089fde1e9d795d50c4 の builtin 関数呼び出しのしくみでは生成される C コードは load_xxx.inc というファイルに出力するようにしていましたが、make のルールの書きかた的に suffix で処理が決まるように命名規則を決めておかないと書きにくいということで xxx.rbinc という拡張子のファイルを作るように変更しています。

[99b1c19be4] Nobuyoshi Nakada 2019-11-08 05:26:21 UTC

io.c でも vm_core.h を builtin.h よりも前に #include するように位置を移動しています。

[2e29b65109] Nobuyoshi Nakada 2019-11-08 07:37:42 UTC

tool/mk_builtin_binary.rb および tool/mk_builtin_loader.rb で生成する .rbinc ファイルの先頭に modeline を追加。また tool/mk_builtin_binary.rb が生成するファイルのほうには自動生成ファイルなので編集しないようにというコメントも追加しています。

[e02b819482] 卜部昌平 2019-11-08 04:56:10 UTC

struct rb_call_cache の共用体 aux のメンバーのひとつ inc_sp は cfunc のメソッドの時に使ってたらしいコメントが書いてましたが、実際には今はもう使われてなかったので削除しています。

[7acf7a4f90] Nobuyoshi Nakada 2019-11-08 09:18:05 UTC

20971799f26c6466f63ab179ce2d3384155b9760 の load_xxx.inc を xxx.rbinc に命名規則を変える変更で win32/Makefile.sub にもルールを追加しています。