マーク&スイープを実装した
Rubyのgc.cを参考にしながら(とうか途中からほぼ写経状態orz)マーク&スイープによるガベージコレクタを実装しました。
でも写経状態でもめちゃくちゃ勉強になるもんです。
setjmpしてレジスタ値などを保存するとか、ヒープを確保した後オブジェクトのポインタ値がsizeof(RVALUE)の整数倍になるように調整して、ポインタがオブジェクトを指しているかどうかのチェックを高速化していたりとか。
あとstruct RVALUEのunionの使い方もすごく勉強になりました。
昨日一日は世代別GCというものの存在を知り、いろいろと勉強していましたがCの代入構文を崩さずに(マクロなどを使わずに)ライトバリアを実現するのは不可能だということにようやく気づいて、結局マーク&スイープに落ち着きました。
詳細なテストは全然していませんが、下の簡単なテストは上手く動いてくれました。
#include "cros.h" #include "gc.h" #include <stdio.h> int main(int argc, char *argv[]) { int i; Obj a; gc_initialize(); for (i = 0; i < 1024; ++i) { a = StringNew(); } gc_end(); return 0; }
何もせずとも勝手にデストラクタが呼ばれてくれるのは非常に快感。
後はどんどんクラスを作っていこう。