空想犬猫記

※当日記では、犬も猫も空想も扱っておりません。(旧・エト記)

etolisp 進捗 (24) 〜 ガーベージコレクタの実装 (3)

id:xoinu:20080515 の続き。本日は gc_ptr の配列版の実装。動的配列やハッシュなど,cons 以外のデータ構造についてもちゃんとガーベージコレクタが働くようにするには,node_t::contains() によって参照関係をトレースできるような gc_ptr の配列を作る必要がある。本日はその実装。gc_array_ptr と名付けた。

みそは,関数 operator::new[](size_t,gc_t&) の返り値と,演算子 new(gc)[]の返り値が,*11ワードぶんずれるということ。ずれるおかげで gc_array_ptr に対応するノードの値と,配列の先頭の gc_ptr に対応するノードの値が被らずに済む。さらに,node_t に配列の個数を格納するフィールドを設け,正しく destroy でデストラクタが呼ばれるように変更した。

これによって,array および hash も,正しくガベコレで掃除出来るようになった。ようやく一里塚に到達といったところか。

*1:配列の長さの情報を格納するため