Reading Gauche/vm/insn/TAIL_CALL


Top / Reading Gauche / vm / insn / TAIL_CALL

TAIL_CALL

TAIL_CALL(nargc)

説明

関数の末尾呼び出しのために使われ、環境フレームを完成させる前に不要なフレームの参照を止める命令。

不要な環境フレームの参照を止める処理と引数フレームの処理を行うtail_call_entryと、通常のCALL処理に分かれる。コードとしては以下のようになっている。

CASE(SCM_VM_TAIL_CALL) {

tail_call_entry:

argc = SP - ARGP;

...

ENV = NULL;

}

/* FALLTHROUGH */

CASE(SCM_VM_CALL) {

...

この項目では、tail_call_entryについての説明を行う。その後に続くCALL処理は、CALLを参照。

tail_call_entry(tail_call_entryでのVMの操作については以下のページを参照)では、コンティニュエーションフレームのポインタが、コンティニュエーションフレームがスタックにある場合は 、引数ポインタをコンティニュエーションフレームを指すように変更する。そうでない場合、引数ポインタはスタックの底を指すように変更する。
その際、引数があった場合は、余分な引数を詰める処理を行い、スタックポインタに詰め込んだ結果のスタックの一番上を指すように変更する。
この操作の際、環境フレームを壊すことになるので、中途半端な環境フレームポインタを持たないようにするために、環境フレームの ポインタをNULLに設定する。

この後でCALLが呼び出される。

背景

使用例

(disasm (lambda (expr1 expr2) (expr1) (expr2)))

;; 0 PRE-CALL(0) 4

;; 2 LREF0 ; expr1

;; 3 CALL(0) ; (expr1)

;; 4 LREF0 ; expr2

;; 5 TAIL-CALL(0) ; (expr2)

;; 6 RET

関連項目

関連インストラクション

参照元

コメント

コメントはありません。 コメント/Reading Gauche/vm/insn/TAIL_CALL?

お名前:

MENU

now: 4

リンク


最新の20件
2019-02-26 2018-10-07 2018-09-20 2018-05-09 2017-09-29 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-05-29 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 2538, today: 1, yesterday: 2

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2009-03-01 (日) 13:33:49 (3700d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.064 sec.