2024/3/15
Ruby/C stack のマージができた気配
Algorithm
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 が見えていない(インライン化された関数は見えていなさそう?)
最終報告
per-category な集計もできそう
GC, str, st, ...
YJIT されたフレームの見え方