Gauche:YAGHG:VM:Insn:CALL

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の種類によって動作が異なるが、基本的には

  1. 引数フレームの処理 (正当性の確認 / 不定個の引数をとる関数のための処理)
  2. 呼び出し前の環境の準備
  3. 呼び出し

という流れになる。

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

Last modified : 2006/01/15 17:21:24 UTC