# HG changeset patch # User Takahiro SHIMIZU # Date 1542688034 -32400 # Node ID bb09f3bd682f4af7259f70de1f2d3104fbbab6d9 # Parent 5aa4743552b7e620d84bd60c8cc5a86882ff93e5 add detail interp structure diff -r 5aa4743552b7 -r bb09f3bd682f Paper/anatofuz.pdf Binary file Paper/anatofuz.pdf has changed diff -r 5aa4743552b7 -r bb09f3bd682f Paper/anatofuz.tex --- a/Paper/anatofuz.tex Mon Nov 19 17:18:40 2018 +0900 +++ b/Paper/anatofuz.tex Tue Nov 20 13:27:14 2018 +0900 @@ -349,14 +349,18 @@ \lstinputlisting[label=cbc_dispatch_c, caption=CbCMoarVMのバイトコードディスパッチ]{./src/cbc-interp-next.cbc} +Code\ref{cbc_dispatch_c}に示す変更例では, マクロNEXTなどの引数に変数iを導入している. +このiとは, バイトコードインタプリタ内で利用するMoarVMのレジスタ情報などが,格納された, 構造体へのポインタである. +iが示す構造体INTER,及びiの型であるポインタINTERPはCode\ref{interp}に示すように宣言している. +これはマクロ内部で現在の命令を示すopや命令列cur\_opなどにアクセスする必要があるが, CbCのCodeGearを適応した場合に元のマクロの記述方法ではアクセスできない為に導入したものである. +\lstinputlisting[label=interp, caption=MoarVMの情報を格納した構造体INTER]{./src/INTERP.h} \subsection{命令実行箇所のCodeGearへの変換} ラベルテーブルやcase文のswitch相当の命令実行箇所をCbCに変換し, CodeGearの遷移として利用する. -interp.cはCode\ref{dispatch_c}に示すスタイルで記述されている. +interp.cはCode\ref{dispatch_c}に示す様にマクロOPを利用して記述されている. - -OP(.*)の.*に該当する箇所はバイトコードの名前である.通常このブロックにはLABELから遷移する為, バイトコードの名前はLABELSの配列の添字に変換されている. +OP(.*)の.*に該当する箇所はバイトコードの名前である.通常このブロックにはLABELから遷移, またはswtich-caseによって分岐する為, バイトコードの名前は配列LABELSの添字に変換されている. そのため対象となるCodeGearをLABELSの並びと対応させ, Code\ref{cbcoplabelsh}に示すCodeGearの配列CODESとして設定すればCodeGearの名前は問わない. 今回はCodeGearである事を示す為に接頭辞としてcbc\_をつける. @@ -364,7 +368,8 @@ 命令の実行処理でMoarVMのレジスタであるreg\_baseや命令列cur\_opなどの情報を利用しているが, これらはMVM\_interp\_run内のローカル変数として利用している. ラベルを利用しているオリジナル版では同一関数内であるためアクセス可能であるが, CodeGear間の移動で命令を表現するCbCではアクセスできない. -その為インタプリタの情報を集約した構造体interを定義し, この構造体へのポインタであるINTERP型の変数iをCodeGearの入出力として与える. +その為Code\ref{interp}に示す様に, インタプリタの情報を集約した構造体interを定義する. +この構造体へのポインタであるINTERP型の変数iをCodeGearの入出力として与える. CodeGear内ではINTERPを経由することでインタプリタの各種情報にアクセスする. CodeGear間の遷移ではレジスタの値の調整は行われない為, 入力引数を使ってレジスタマッピングを管理できる. その為INTERPのメンバであるMoarVMのレジスタそのものをアーキテクチャのレジスタ上に乗せる事が可能である.