# HG changeset patch # User Takahiro SHIMIZU # Date 1543579331 -32400 # Node ID 0c012cbdf3854f6f87103fb5c714d55b3bf204b0 # Parent beac24e25a1ff6e028bcaa49218d3f000e0cc2a2 update diff -r beac24e25a1f -r 0c012cbdf385 Paper/anatofuz.pdf Binary file Paper/anatofuz.pdf has changed diff -r beac24e25a1f -r 0c012cbdf385 Paper/anatofuz.tex --- a/Paper/anatofuz.tex Fri Nov 30 20:26:57 2018 +0900 +++ b/Paper/anatofuz.tex Fri Nov 30 21:02:11 2018 +0900 @@ -408,19 +408,19 @@ \lstinputlisting[label=cbcoplabelsh, caption=CodeGear配列の一部分]{./src/oplables-cbc-codes.h} -Code\ref{cbc_codesegs_c}に示す, 命令の実行処理でMoarVMのレジスタであるreg\_baseや命令列cur\_opなどの情報を利用しているが, これらはMVM\_interp\_run内のローカル変数として利用している. +Code\ref{cbc_codesegs_c}に示す命令の実行処理でMoarVMのレジスタであるreg\_baseや, 命令列cur\_opなどの情報を利用しているが, これらはMVM\_interp\_run内のローカル変数として利用している. ラベルを利用しているオリジナル版では同一関数内であるためアクセス可能であるが, CodeGear間の移動で命令を表現するCbCではアクセスできない. その為Code\ref{interp}に示す様に, インタプリタの情報を集約した構造体interを定義する. この構造体へのポインタであるINTERP型の変数iをCodeGearの入出力として与える. CodeGear内ではINTERPを経由することでインタプリタの各種情報にアクセスする. CodeGear間の遷移ではレジスタの値の調整は行われない為, 入力引数を使ってレジスタマッピングを管理できる. -その為INTERPのメンバであるMoarVMのレジスタそのものをアーキテクチャのレジスタ上に乗せる事が可能である. +INTERPのメンバであるMoarVMのレジスタそのものをアーキテクチャのレジスタ上に乗せる事が可能となる. 命令実行中のCodeGearの遷移を図\ref{fig:perl6cbcinter}に示す. この中で実線で書かれている部分はCbCのgoto文で遷移し, 波線の箇所は通常のCの関数呼び出しとなっている. 現在のCbCMoarVMは次の命令セットのディスパッチをcbc\_nextが行っている. -その為cbc\_nextから命令コードに対応するCodeGearに継続し, CodeGearからcbc\_nextに継続するサイクルが基本の流れである. +cbc\_nextから命令コードに対応するCodeGearに継続し, CodeGearからcbc\_nextに継続するサイクルが基本の流れである. CodeGear内からCの関数は問題なく呼ぶ事が可能であるため, Cの関数を利用する処理は変更せず記述する事ができる. また変換対象はswitch文であるため, breakせず次のcaseに移行した場合に対応するように別のCodeGearに継続し,その後cbc\_nextに継続するパターンも存在する. diff -r beac24e25a1f -r 0c012cbdf385 Paper/fig/tgraph.pdf Binary file Paper/fig/tgraph.pdf has changed