以前作ったmruby-at_exitに勘違いがあったので改良した。
mruby-at_exit gem リリース - スペクトラム
以前はmrb_state_atexit
APIを直接呼んでいたけど、実はこれを呼ばなくてもat_exit
は実現できる。
mrb_state_atexit
はat_exit的なもの専用APIだと思っていたけど、*_gem_final関数を呼ぶのにも使われていた。
そもそもmrb_state_atexit
が産まれた経緯は、 https://github.com/mruby/mruby/pull/1844 のような遅延読み込みがやりたかったかったがreject、その後、似たようなことを実現させようとしたのが、今のmrb_state_atexit
の原型であるmrb_atexit
だった。 https://github.com/mruby/mruby/pull/2211
どうやらこの時点で*_gem_final関数がatexitの仕組みと統合されていたようだ。
mrb_state_atexit
を呼び出す前の設計だと余計にmalloc/reallocを呼んでしまうので、できれば呼ばないように改良した。
at_exit
では隠し変数にブロックをためておき、*_gem_final関数でためていたブロックを全て呼び出すシンプルな形になった。