;; RET ;; Pop the continuation stack. ;; (define-insn RET 0 none)
関数からのリターンに相当する。
BEFORE AFTER +=========+<-------------+ cont ---->+=========+ | | | | | | C#0 | | | C#0 | | | | | | env ---->+=========+<--------+ | env ---->+=========+ | | | | | | | E#0 | | | | E#0 | | | | | | | +=========+<---+ | | argp ---->+=========+ | arg#1 | | | | | arg#1 | +---------+ | | | +---------+ | : | | | | | : | +---------+ | | | +---------+ | arg#N | | | | | arg#N | cont ---->+=========+ | | | sp ---->+---------+ prev | --+----+----+----+ | | env | --+----+----+ | | argp | --+----+ size | N | pc | PC | pc ----> PC base | BASE | base ----> BASE sp, argp ---->+=========+ | | | |
Scm_VMPushCCによって積まれるC-continuationは、pcの部分にC関数へのポインタ、末尾に関数へ渡す引数が埋め込まれており、 ポップ時にこの関数が呼ばれる。
BEFORE AFTER +=========+<-------------+ sp, argp, cont ---->+=========+ | | | | | | C#0 | | | C#0 | | | | | | env ---->+=========+<--------+ | env ---->+=========+ | | | | | | | E#0 | | | | E#0 | | | | | | | cont ---->+=========+ | | +=========+ prev | --+---------+----+ | | env | --+---------+ | | argp | NULL | size | N | pc | cfunc | PC_TO_RETURN base | [base] | pc ---->+-----------+ | arg#1 | | RET | | arg#N | +-----------+ sp, argp ---->+=========+ | | val0 ----> cfunc(val0, {arg#1, arg#N}) | |
(compile-p3 'cons) 0 GREF #<identifier user#cons>; cons 2 RET