Gauche:YAGHG:VM:Insn:CALL
概要
;; CALL(NARGS) ;; Call procedure in val0. The continuation of this call is already ;; pushed by PRE-CALL, so this instruction is always the end of a graph. ;;
通常の関数呼び出しを行う。
- パラメータ
未使用?
動作
val0の種類によって動作が異なるが、基本的には
- 引数フレームの処理 (正当性の確認 / 不定個の引数をとる関数のための処理)
- 呼び出し前の環境の準備
- 呼び出し
という流れになる。
SCM_PROC_SUBR (C関数)
BEFORE AFTER +=========+ +=========+ : : : : argp ---->+=========+ +=========+ | arg#1 | | arg#1 | +---------+ +---------+ : : : : +---------+ +---------+ | arg#N | | arg#N | sp ---->+---------+ argp, sp ---->+---------+ | | | | | | | | val0 ----> func(...) pc ----> { RET }
AFTERはCの関数から戻った直後の一般的な状態だ。pcがRET(PC_TO_RETURN)を指しているのでこの直後にRETの処理が行われるが、 Cの関数内でpcを書き換える場合はその限りではない。
SCM_PROC_CLOSURE (Scheme関数)
BEFORE ScmClosure val0 ---->+---------+ env | --+------------->+=========+ +---------+ | | code | --+------+ | E#0 | +---------+ | | | | +=========+ | | ScmCompiledCode +------>+---------+ ScmWord* code | --+-------->+---------+ +---------+ | | +---------+ : : +---------+ | | +---------+ +=========+ : : argp ---->+=========+ | arg#1 | +---------+ : : +---------+ | arg#N | sp ---->+---------+ | | | |
AFTER ScmClosure val0 ---->+---------+ env | --+--------+--------------->+=========+ +---------+ | | | code | --+--------+--------+ | E#0 | +---------+ | | | | | | +=========+ | | | | ScmCompiledCode base --------------------+--------+------>+---------+ ScmWord* | code | --+----+--->+---------+ | +---------+ | | | | | +---------+ pc --------------------+-------------------------------+ : : | +---------+ | | | | +---------+ | | +=========+ | : : | +=========+====+========== | arg#1 | | +---------+ | : : | +---------+ | | arg#N | | E#1 env ---->+---------+ | up | --+----+ +---------+ size | N | argp, sp ---->+=========+=============== | | | |
AAが分かりづらいが、新しく作成した環境フレームが呼び出すクロージャの保持している環境フレームを指すようになっていることに留意したい。
SCM_PROC_GENERIC
SCM_PROC_NEXT_METHOD
SCM_PROC_METHOD
コード例
(compile-p3 '(begin (gensym) #f)) 0 PRE-CALL(0) 4 2 GREF-CALL(0) #<identifier user#gensym>; (gensym) 4 CONSTF-RET