Gauche:YAGHG:VM:Insn:RET

Gauche:YAGHG:VM:Insn:RET

概要

;; 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 ---->+=========+
              |         |
              |         |

C-continuation

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

Last modified : 2006/01/09 03:58:03 UTC