Next: copy_terms()
Up: GC
Previous: collect_garbage()
copy_one_queue()
goal queueを1つコピーする。
- 1.
- コピーする時には、ゴールの末尾よりコピーする。これは、
以下のような理由による。
- 一般的に1つの変数を共有する
「書き込みゴール」と「読み出しゴール」があるときに、読み出しゴール内に
純粋未定義変数が置かれることが実行効率上有利である
(手繰りの段数が少なくて良い)。
- 一方、GCによりゴールレコードをコピーする際には、先にコピーを行った
方に純粋未定義変数セルは確保される。よって、読み出しゴールを先に
コピーしておきたい。
- 一方、通常の記述では、「読み出しゴール」は「書き込みゴール」よりも
後に実行される(ゴールスタックの後方に位置する)。
よって、ゴールスタックの
順にコピーを行うよりも後からコピーを行う方が有利である。
- 2.
- ゴールを1つコピーする(マクロcopy_one_goal())。
- (a)
- アリティよりゴールレコードサイズを知り、新領域にゴールレコード
を確保する。
- (b)
- next, pred filedをコピーする。旧領域のゴールのnext部には
コピー先、pred部には0を代入する。
- (c)
- 引数の末尾よりGC スタックに積むための処理を行う(マクロreserve_copy())。
直接的に純粋未定義変数、ATOMIC、コピー済み参照でなければ
新領域に旧領域の内容をコピー、旧領域に新領域への参照を書き、
新領域へのポインタをスタックに積む。
- 3.
- GC スタックをtopから順に再帰的にコピーする(copy_terms())。
Sekita Daigo
1998-05-18