2024/3/15
前回 → 2023/2/27
Ruby/C stack のマージができた気配
https://github.com/osyoyu/pf2/pull/12/commits/033e3d9c073fc6cc081eabd4c16c441819f75e80
Algorithm
https://github.com/osyoyu/pf2/pull/12/commits/033e3d9c073fc6cc081eabd4c16c441819f75e80#diff-6ddc3289c3b00fe599a9da0a2104ed2d521ab8315c4a75b44bba34a3f3b508cbR218-R254
Ruby stack, C stack を分離した状態で開始
C stack の底のフレーム (libc main) にポインタがある状態でスタート
C stack にポインタがある時
vm_exec_core() に当たるまで merged stack にフレームを積み続ける
vm_exec_core() に当たったら Ruby に切り替え
Ruby stack にポインタがあるとき
cme->def->cfunc->func とアドレスが一致する C フレームが C stack 側に残存していたら、次は C stack 側に移動
cfunc が vm_sendish.constprop などを呼ぶわけではないので、↓の例だと main → constprop → call_cfunc_with_frame → Array#map → rb_ary_collect となるべき
constant propagation
https://scrapbox.io/files/65f39135ecb0a50023533a87.png
YARV の opt によってフレームが積まれないメソッド (Hash#[] や Array#<< など) も rb_hash_aref, rb_array_push として見えるようになって満足度が高い
rb_hash_aref() があったら下に Hash#[] を挿入してあげても良いと思えるぐらい
(余談) フレームが積まれないメソッドも rb_profile_frames() で見えるようにするにはどうするのが良いだろうか?
backtrace にも出現していない
insns.dev → build/vm.inc
L3822 (INSN_ENTRY(opt_aref)) のあたりに出現する vm_opt_aref が見えていない(インライン化された関数は見えていなさそう?)
最終報告
こういう雰囲気? https://www.ruby.or.jp/ja/news/20220606
per-category な集計もできそう
GC, str, st, ...
YJIT されたフレームの見え方