読者です 読者をやめる 読者になる 読者になる

mruby-at_eixtでmrb_state_atexitを直接呼ぶのをやめた

以前作った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関数でためていたブロックを全て呼び出すシンプルな形になった。