ruby-trunk-changes 2021-06-18

今日は RubyVM::AST.parse や RUbyVM::AST.of の機能強化で Thread::Backtrace::Location からも AST を取れるようにしたり、対応する行のソースコードを取得できるようにする機能の実装などがありました。

[c639b58823] Peter Zhu 2021-06-17 14:19:33 UTC

gc.c の heap_set_increment() という関数はそこから呼んでる heap_allocatable_pages_set() と融合させて heap_allocatable_pages_set() だけにしています。追加の処理は実際には機能していなかったということです。 gc_report() の呼び出しを消してるのはいいのかな。デバッグ用だと思うので挙動には影響ないと思いますが。

[acae5f363d] Yusuke Endoh 2021-06-17 14:43:08 UTC

RubyVM::AST.parse と RubyVM::AST.of などスクリプトや Method から AST を得るクラスメソッドにキーワード引数 save_script_lines を追加して、これを true に指定すると parse 時に元のスクリプトの行の文字列そのものを RubyVM::AbstractSyntaxTree::Node に保持させることができるようにしているようです。 RubyVM::AST.of でもできるんだ。デバッガなどのツールで使うためかと思われます。

[fb01411ae8] Yusuke Endoh 2021-06-17 16:31:50 UTC

acae5f363dfaedd9c2873cee68c9498da3c072f5 の変更で rb_ast_body_t にメンバーを追加したので構造体サイズが struct RVALUE のサイズ(オブジェクトの slot)に収まらなくなってしまってたのでかわりに line_count メンバーを削除して、追加した script_lines というメンバーを利用しない場合にここに Integer として数字を入れておくようにして、ast_line_count() という関数で Integer の値かまたは save_script_lines 利用時には配列のサイズから取得するようにしています。

[ed3e30fc09] git 2021-06-17 17:34:45 UTC

version.h の日付更新

[ea6062898a] Yusuke Endoh 2021-06-08 04:22:27 UTC

Thread::Backtrace::Location で行番号を一度計算したら結果をキャッシュするようにするため内部的な状態を rb_backtrace_location_t::type の違いとして保持するようにしていましたが、これをやめて必要な時に毎回計算するようにしています。あまり頻繁に処理されるものではないからキャッシュしなくても影響は大きくないというのと、Thread::Backtrace::Location にカラム番号も保持したいのでその前準備としてとのことでした。まだ削ってないけど将来 type メンバーを削ってかわりにそのためのメンバーを増やすためかな。

[dfba87cd62] Yusuke Endoh 2021-06-08 08:34:08 UTC

RubyVM::AST.of が受け付ける引数として Proc や Method に加えて Thread::Backtrace::Location からも AST が得られるようにしています。つまり例外捕捉するとそこから発生箇所の AST が取れるってことになりますね。どうやって取るかというと全 NODE に id を採番しておいて、その node id から RubyVM::AST::Node を引ける Hash をメンテナンスしておいて、Thread::Backtrace::Location 作成時に行番号などを取得する時に一緒に取れるようにしているようです。

[0a36cab1b5] Yusuke Endoh 2021-06-08 08:57:44 UTC

dfba87cd622f9699f54d1d0b8c057deb428874b6 の Thread::Backtrace::Location から AST を取れるようにした変更は EXPERIMENTAL_ISEQ_NODE_ID というマクロ(ff69ef27b06eed1ba750e7d9cab8322f351ed245 で RubyVM::AbstractSyntaxTree::Node#node_id メソッドを実験的に追加した時に追加した条件マクロ)が定義されてる時しか有効になってませんでしたが、これを DEBUG_ISEQ_NODE_ID に改名してデフォルトで定義しておくようにしています。

[1de063a10b] Jeremy Evans 2021-06-17 17:34:36 UTC

README.md にソースツリーからのビルドに必要なツールチェインなどの条件を追記しています。 [ruby-dev:50440] [Bug #14409]

[bdeaa60e7b] Nobuyoshi Nakada 2021-06-18 02:58:15 UTC

Time クラスのオブジェクトが利用している T_TYPEDDATA 型オブジェクトのデフォルトの flags に RUBY_TYPED_FROZEN_SHAREABLE を追加して、Time オブジェクトが Ractor 間で共有可能になるようにしています。 このフラグは freeze すれば sharable になるという意味かな(freeze してるわけではない?)。

[9d96837dbd] Hiroshi SHIBATA 2021-06-18 10:13:36 UTC

gems/bundled_gems の matrix のバージョンを 0.4.2 に更新しています。