Reading Gauche/vm/insn/CALL の変更点



 #setlinebreak(on)
 #topicpath
 *CALL [#bb51d042]
 ''CALL''('''argc''')
 ** 説明 [#pc8bb43e]
 手続きを呼び出すための命令。
 スタックに引数が、[[VAL0>Reading Gauche/vm.c/VAL0]]に手続きオブジェクトが設定されており、手続きの種類にあわせた処理を行う。詳細は 処理の手順 を参照。
 
 
 インストラクションが完了するとCで定義された手続きの場合は終了時に結果が[[VAL>Reading Gauche/vm.c/VAL0]]に設定され、Schemeで定義された手続きは[[PC>Reading Gauche/vm.c/PC]]に次の手続きの先頭のインストラクションが来るように設定される。
 
 ** 使用例 [#n06e1037]
 > (disasm (lambda (x) (x) 0))
 >;; 0 [[PRE-CALL>Reading Gauche/vm/insn/PRE_CALL]](0) 4
 >;; 2 [[LREF0>Reading Gauche/vm/insn/LREF0]]                    ; x
 >;; 3 ''[[CALL>Reading Gauche/vm/insn/CALL]]''(0)                  ; (x)
 >;; 4 [[CONSTI>Reading Gauche/vm/insn/CONSTI]](0) 
 >;; 5 [[RET>Reading Gauche/vm/insn/RET]]
 
 **処理の手順 [#r86a453d]
 +初期化
 ++引数の数を計算
 ++戻り値の数を1(デフォルト値)にする
 +[[VAL0>Reading Gauche/vm.c/VAL0]]が手続きオブジェクトでなければ
 ++引数をずらし、object-applyを手続きとするようにする ("abc" 2) -> (object-apply "abc" 2)
 ++genericラベルへジャンプ(goto)
 +手続きの種類がSCM_PROC_SUBR(Cで定義された手続き)であれば
 ++戻れるようにSP, PCを設定
 ++[[VAL0>Reading Gauche/vm.c/VAL0]]を[[ScmSubr>Reading Gauche/gauche.h/ScmSubr]]にキャスト
 ++プロファイルが有効になっていればSCM_PROF_COUNT_CALLを用いてCALLされた手続きを計測する
 ++[[ScmSubr>Reading Gauche/gauche.h/ScmSubr]]の持つ関数を実行し[[VAL0>Reading Gauche/vm.c/VAL0]]に格納
 ++PCがRETを指しているならばRETを実行する
 ++PCがRETを指しているならばRETを実行する(※SCM_PROC_SUBRは一部のものを除いてPCを更新しないため、戻る先をフレームに記憶しておく必要がない。そのため call に伴うRETが不要になることが多い。そのためこのようすることで命令のディスパッチがRETの分1回減るので効率的。)
 ++NEXTでインストラクション完了
 +手続きの種類がSCM_PROC_CLOSURE(クロージャ)であれば
 ++環境とPCを設定
 ++スタックの容量が不足することが分った場合は拡張する(CHECK_STACK)
 ++プロファイルが有効になっていればSCM_PROF_COUNT_CALLを用いてCALLされた手続きを計測する
 ++NEXTでインストラクション完了(次はクロージャの先頭のインストラクションの実行になる)
 +手続きの種類がSCM_PROC_GENERIC(ジェネリック関数)であれば
 ++[[VAL0>Reading Gauche/vm.c/VAL0]]がジェネリック関数オブジェクトでなければ(処理の途中でジェネリック関数オブジェクトであったオブジェクトが別のオブジェクトに変更された場合)
 +++引数をリストにまとめ (apply-generic gf args) の形にする
 ++ここがgenericラベル
 ++適用するメソッドのリストを得る
 ++メソッドのリストが空でなければ
 +++[[VAL0>Reading Gauche/vm.c/VAL0]]に適用するメソッドオブジェクトを設定する
 +手続きの種類がSCM_PROC_NEXT_METHODであれば
 ++引数の設定
 +++スタックの容量が不足することが分った場合は拡張する(CHECK_STACK)
 ++次の手続きを選ぶ
 +この段階で手続きがこれまでに挙げたどれでもなかったらエラー
 +現段階で手続きの種類がSCM_PROC_GENERIC(ジェネリック関数)であれば
 ++戻れるようにSP, PCを設定
 ++プロファイルが有効になっていればSCM_PROF_COUNT_CALLを用いてCALLされた手続きを計測する
 ++ジェネリック関数のfallback関数を実行し[[VAL0>Reading Gauche/vm.c/VAL0]]に格納
 ++PCがRETを指しているならばRETを実行する
 ++NEXTでインストラクション完了
 +この段階で完了していない場合は手続きの種類はSCM_PROC_METHOD
 ++メソッドがCで定義されていた場合SCM_PROC_SUBR(Cで定義された手続き)と同様に処理
 ++メソッドがSchemeで定義されていた場合SCM_PROC_CLOSURE(クロージャ)と同様に処理
 +NEXTでインストラクション完了
 
 ** 関連項目 [#f627a043]
 -[[ScmObj>Reading Gauche/gauche.h/ScmObj]]
 -[[SP>Reading Gauche/vm.c/SP]]
 -[[ARGP>Reading Gauche/vm.c/ARGP]]
 -[[MOSTLY_FALSE>Reading Gauche/vm.c/MOSTLY_FALSE]]
 -[[SCM_PROCEDUREP>Reading Gauche/gauche.h/SCM_PROCEDUREP]]
 -[[VAL0>Reading Gauche/vm.c/VAL0]]
 -[[CHECK_STACK_PARANOIA>Reading Gauche/vm.c/CHECK_STACK_PARANOIA]]
 -[[SCM_OBJ>Reading Gauche/gauche.h/SCM_OBJ]]
 -[[Scm_GenericObjectApply>Reading Gauche/class.c/Scm_GenericObjectApply]]
 -[[SCM_PROC_GENERIC>Reading Gauche/gauche.h/SCM_PROC_GENERIC]]
 -[[SCM_FALSE>Reading Gauche/gauche.h/SCM_FALSE]]
 -[[SCM_PROCEDURE_TYPE>Reading Gauche/gauche.h/SCM_PROCEDURE_TYPE]]
 -[[SCM_PROC_SUBR>Reading Gauche/gauche.h/SCM_PROC_SUBR]]
 -[[ADJUST_ARGUMENT_FRAME>Reading Gauche/vm.c/ADJUST_ARGUMENT_FRAME]]
 -[[PC>Reading Gauche/vm.c/PC]]
 -[[PC_TO_RETURN>Reading Gauche/vm.c/PC_TO_RETURN]]
 -[[SCM_PROF_COUNT_CALL>Reading Gauche/gauche/prof.h/SCM_PROF_COUNT_CALL]]
 -[[SCM_SUBR>Reading Gauche/gauche.h/SCM_SUBR]]
 -[[TAIL_POS>Reading Gauche/vm.c/TAIL_POS]]
 -[[RETURN_OP>Reading Gauche/vm.c/RETURN_OP]]
 -[[NEXT>Reading Gauche/vm.c/NEXT]]
 -[[SCM_PROC_CLOSURE>Reading Gauche/gauche.h/SCM_PROC_CLOSURE]]
 -[[FINISH_ENV>Reading Gauche/vm.c/FINISH_ENV]]
 -[[SCM_PROCEDURE_INFO>Reading Gauche/gauche.h/SCM_PROCEDURE_INFO]]
 -[[SCM_CLOSURE>Reading Gauche/gauche.h/SCM_CLOSURE]]
 -[[ENV>Reading Gauche/vm.c/ENV]]
 -[[SCM_COMPILED_CODE>Reading Gauche/gauche/code.h/SCM_COMPILED_CODE]]
 -[[CHECK_STACK>Reading Gauche/vm.c/CHECK_STACK]]
 -[[SCM_PROF_COUNT_CALL>Reading Gauche/gauche/prof.h/SCM_PROF_COUNT_CALL]]
 -[[SCM_GENERICP>Reading Gauche/gauche.h/SCM_GENERICP]]
 -[[SCM_NIL>Reading Gauche/gauche.h/SCM_NIL]]
 -[[POP_ARG>Reading Gauche/vm.c/POP_ARG]]
 -[[Scm_Cons>Reading Gauche/list.c/Scm_Cons]]
 -[[PUSH_ARG>Reading Gauche/vm.c/PUSH_ARG]]
 -[[Scm_GenericApplyGeneric>Reading Gauche/class.c/Scm_GenericApplyGeneric]]
 -[[Scm_ComputeApplicableMethods>Reading Gauche/class.c/Scm_ComputeApplicableMethods]]
 -[[SCM_GENERIC>Reading Gauche/gauche.h/SCM_GENERIC]]
 -[[SCM_NULLP>Reading Gauche/gauche.h/SCM_NULLP]]
 -[[Scm_SortMethods>Reading Gauche/class.c/Scm_SortMethods]]
 -[[Scm_MakeNextMethod>Reading Gauche/class.c/Scm_MakeNextMethod]]
 -[[SCM_CDR>Reading Gauche/gauche.h/SCM_CDR]]
 -[[TRUE>Reading Gauche/gauche.h/TRUE]]
 -[[SCM_CAR>Reading Gauche/gauche.h/SCM_CAR]]
 -[[SCM_PROC_METHOD>Reading Gauche/gauche.h/SCM_PROC_METHOD]]
 -[[SCM_PROC_NEXT_METHOD>Reading Gauche/gauche.h/SCM_PROC_NEXT_METHOD]]
 -[[ScmNextMethod>Reading Gauche/gauche.h/ScmNextMethod]]
 -[[SCM_NEXT_METHOD>Reading Gauche/gauche.h/SCM_NEXT_METHOD]]
 -[[VM_ASSERT>Reading Gauche/vm.c/VM_ASSERT]]
 -[[SCM_METHOD>Reading Gauche/gauche.h/SCM_METHOD]]
 -[[SCM_COMPILED_CODE_P>Reading Gauche/gauche/code.h/SCM_COMPILED_CODE_P]]
 -[[VM_ERR>Reading Gauche/vm.c/VM_ERR]]
 -[[SCM_PROCEDURE_REQUIRED>Reading Gauche/gauche.h/SCM_PROCEDURE_REQUIRED]]
 
 ** 関連インストラクション [#f5e02563]
 -[[TAIL_CALL>Reading Gauche/vm/insn/TAIL_CALL]]
 -[[GREF_CALL>Reading Gauche/vm/insn/GREF_CALL]]
 -[[APPLY>Reading Gauche/vm/insn/APPLY]]
 -[[CONST_APPLY>Reading Gauche/vm/insn/CONST_APPLY]]
 
 *参照元 [#i0a410ac]
 #related
 
 // &pageのお尻に ; をつけるとページ名に展開されます。
 // ↓適宜コメントアウトして使いましょう
 //**経緯
 //**目的
 //**概要
 //**アクション
 //**未解決な問題
 //**関連ページ
 //#ls2
 
 *コメント [#e17bc172]
 #pcomment(,1000,below,reply)

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

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.106 sec.