マンガ書いてみる
ココのマンガを参考にしつつ。
最初の状態が以下?
sp>| | +........+ | size | | info | | up | argp>| arg[0] | +--------+ . . . . +--------+ | | env>| ENV | +--------+ . . . . +--------+ | | cont>| CONT | +--------+ . . . .
あら、違うな。こう?
argp,sp>| | +........+ | size | | info | | up | | arg[0] | +--------+ . . . . +--------+ | | env>| ENV | +--------+ . . . . +--------+ | | cont>| CONT | +--------+ . . . .
FINISH_ENV なマクロで ARGP に SP 代入しております。あら。ENV も微妙ですね。
どこを始点すれば良いのか微妙だな。最初何もナシ、という前提にて最初から見てみる。
PRE-CALL
以下。
#define PUSH_CONT(next_pc) \ do { \ ScmContFrame *newcont = (ScmContFrame*)SP; \ newcont->prev = CONT; \ newcont->env = ENV; \ newcont->argp = ARGP; \ newcont->size = SP - ARGP; \ newcont->pc = next_pc; \ newcont->base = BASE; \ CONT = newcont; \ SP += CONT_FRAME_SIZE; \ ARGP = SP; \ } while (0)
終了時点のスタックの状態が以下?
argp,sp>| | +--------+ | base | | pc | | size | | argp | | env | cont>| prev | +--------+
CONSTI-PUSH(1) されて時点が以下?
sp>| | argp>| 1 | ;; scheme object +--------+ | base | | pc | | size | | argp | | env | cont>| prev | +--------+
CALL でどうなるか、というと以下?
argp,sp>| | +--------+ | size | | info | env>| up | | 1 | ;; scheme object +--------+ | base | | pc | | size | | argp | | env | cont>| prev | +--------+
引数数が無い時、とか CLOSURE ではない時、とか末尾呼び出し、とかその他諸々で状態は違うはず。とりあえずこれが元、でマンガ書いてみた方が良さげ。
とりあえず今日はもう寝ます。