Reading Gauche/vm/insn/CALL


Top / Reading Gauche / vm / insn / CALL

CALL

CALL(argc)

説明

手続きを呼び出すための命令。
スタックに引数が、VAL0に手続きオブジェクトが設定されており、手続きの種類にあわせた処理を行う。詳細は 処理の手順 を参照。

インストラクションが完了するとCで定義された手続きの場合は終了時に結果がVALに設定され、Schemeで定義された手続きはPCに次の手続きの先頭のインストラクションが来るように設定される。

使用例

(disasm (lambda (x) (x) 0))

;; 0 PRE-CALL(0) 4

;; 2 LREF0 ; x

;; 3 CALL(0) ; (x)

;; 4 CONSTI(0)

;; 5 RET

処理の手順

  1. 初期化
    1. 引数の数を計算
    2. 戻り値の数を1(デフォルト値)にする
  2. VAL0が手続きオブジェクトでなければ
    1. 引数をずらし、object-applyを手続きとするようにする ("abc" 2) -> (object-apply "abc" 2)
    2. genericラベルへジャンプ(goto)
  3. 手続きの種類がSCM_PROC_SUBR(Cで定義された手続き)であれば
    1. 戻れるようにSP, PCを設定
    2. VAL0ScmSubrにキャスト
    3. プロファイルが有効になっていればSCM_PROF_COUNT_CALLを用いてCALLされた手続きを計測する
    4. ScmSubrの持つ関数を実行しVAL0に格納
    5. PCがRETを指しているならばRETを実行する(※SCM_PROC_SUBRは一部のものを除いてPCを更新しないため、戻る先をフレームに記憶しておく必要がない。そのため call に伴うRETが不要になることが多い。そのためこのようすることで命令のディスパッチがRETの分1回減るので効率的。)
    6. NEXTでインストラクション完了
  4. 手続きの種類がSCM_PROC_CLOSURE(クロージャ)であれば
    1. 環境とPCを設定
    2. スタックの容量が不足することが分った場合は拡張する(CHECK_STACK)
    3. プロファイルが有効になっていればSCM_PROF_COUNT_CALLを用いてCALLされた手続きを計測する
    4. NEXTでインストラクション完了(次はクロージャの先頭のインストラクションの実行になる)
  5. 手続きの種類がSCM_PROC_GENERIC(ジェネリック関数)であれば
    1. VAL0がジェネリック関数オブジェクトでなければ(処理の途中でジェネリック関数オブジェクトであったオブジェクトが別のオブジェクトに変更された場合)
      1. 引数をリストにまとめ (apply-generic gf args) の形にする
    2. ここがgenericラベル
    3. 適用するメソッドのリストを得る
    4. メソッドのリストが空でなければ
      1. VAL0に適用するメソッドオブジェクトを設定する
  6. 手続きの種類がSCM_PROC_NEXT_METHODであれば
    1. 引数の設定
      1. スタックの容量が不足することが分った場合は拡張する(CHECK_STACK)
    2. 次の手続きを選ぶ
  7. この段階で手続きがこれまでに挙げたどれでもなかったらエラー
  8. 現段階で手続きの種類がSCM_PROC_GENERIC(ジェネリック関数)であれば
    1. 戻れるようにSP, PCを設定
    2. プロファイルが有効になっていればSCM_PROF_COUNT_CALLを用いてCALLされた手続きを計測する
    3. ジェネリック関数のfallback関数を実行しVAL0に格納
    4. PCがRETを指しているならばRETを実行する
    5. NEXTでインストラクション完了
  9. この段階で完了していない場合は手続きの種類はSCM_PROC_METHOD
    1. メソッドがCで定義されていた場合SCM_PROC_SUBR(Cで定義された手続き)と同様に処理
    2. メソッドがSchemeで定義されていた場合SCM_PROC_CLOSURE(クロージャ)と同様に処理
  10. NEXTでインストラクション完了

関連項目

関連インストラクション

参照元

コメント

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

お名前:

MENU

now: 5

リンク


最新の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: 2945, today: 1, yesterday: 1

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

Last-modified: 2008-12-08 (月) 22:59:40 (3634d);  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.103 sec.