Reading Gauche/vm/insn/LOCAL_ENV_CALL


Top / Reading Gauche / vm / insn / LOCAL_ENV_CALL

LOCAL_ENV_CALL

LOCAL_ENV_CALL(argv)

説明

この命令が果たす役割

クロージャーの最適化の際、主に3つのオプションに分類される。
それは、LOCAL, EMBED, JUMPである。ここでは、このインストラクションに関係するLOCALを説明する。
LOCAL: クロージャーの生成を避けられない場合、クロージャーの呼び出しは、"local"としてマークされる。ローカルなクロージャーの呼び出しは、LOCAL-ENV-CALLインストラクションとなる。そして、それは、CALL/TAIL-CALLよりも高速である。

このインストラクションは、ローカル関数の呼び出しの最適化の際に現れる。VAL0には呼び出すクロージャがセットされており、スタックには引数が既に PUSH されている。

このインストラクションは、LOCAL-ENVのように存在する値をもつENVフレームを生成する、そしてVAL0のなかのクロージャーのエントリーポイントにジャンプする。要はCALL命令をバイパスできるものである。というのは、引数はすでに調整され、我々は呼びだれたクロージャーが総称関数でないことを知っているからである。

命令中に行われる主な処理

以下にこのインストラクションでの動作を記述する。

引数を算出、VAL0がクロージャーかの確認を行い、引数がある場合、スタックサイズをチェックし、環境フレームを作成する。引数がない場合、VAL0の指す値を環境フレーム(ENV)のポインタ値に変更し、ARGPにSPの値を代入する。

プロファイラが動作しているときは、上記のクロージャーを記録して行く。

使用例

(disasm (lambda () ( letrec ( (even? (lambda (x) (or (= x 0) (odd? (- x 1) ) ) ) ) (odd? (lambda (x) (and (not (= x 0)) (even? (- x 1) ) ) ) ) ) (list (even? 20) (odd? 20) ) ) ) )

main_code (name=#f, code=0x3fbf00, size=23, const=1, stack=18):

args: #f

0 LOCAL-ENV-CLOSURES(1) (#<lambda 0>); (letrec ((even? (lambda (x) (or (= x 0) ...

2 PRE-CALL(1) 16

4 CONSTI-PUSH(20)

5 LOCAL-ENV(1) ; (lambda (x) (or (= x 0) (odd? (- x 1))))

6 LREF0 ; x

7 BNUMNEI(0) 10 ; (= x 0)

9 RET

10 LREF0 ; x

11 NUMADDI(-1) ; (- x 1)

12 PUSH

13 LREF10 ; odd?

14 LOCAL-ENV-TAIL-CALL(1) ; (odd? (- x 1))

15 RET

16 PUSH-PRE-CALL(1) 21

18 CONSTI-PUSH(20)

19 LREF0 ; odd?

20 LOCAL-ENV-CALL(1) ; (odd? 20)

21 LIST(2) ; (list (even? 20) (odd? 20))

22 RET

internal_closure_0 (name=odd?, code=0x3f4f00, size=18, const=0 stack=8):

args: #f

0 LREF0-PUSH ; x

1 CONSTI(0)

2 NUMEQ2 ; (= x 0)

3 NOT ; (not (= x 0))

4 RF

5 LREF0 ; x

6 NUMADDI(-1) ; (- x 1)

7 PUSH-LOCAL-ENV(1) ; (lambda (x) (or (= x 0) (odd? (- x 1))))

8 LREF0 ; x

9 BNUMNEI(0) 12 ; (= x 0)

11 RET

12 LREF0 ; x

13 NUMADDI(-1) ; (- x 1)

14 PUSH

15 LREF20 ; odd?

16 TAIL-CALL(1) ; (odd? (- x 1))

17 RET

#<undef>

関連項目

コメント

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

お名前:

MENU

now: 2

リンク


最新の20件
2018-10-07 2018-09-20 2018-09-03 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: 1944, today: 2, yesterday: 0

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

Last-modified: 2009-09-17 (木) 00:15:11 (3317d);  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.042 sec.