changeset 27:df723be56106

add about INTERP section
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Fri, 09 Nov 2018 01:12:22 +0900
parents 1141ce0a6aab
children f200e3702c5a
files Paper/anatofuz.pdf Paper/anatofuz.tex Paper/src/cbc-interp-next.cbc
diffstat 3 files changed, 25 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
Binary file Paper/anatofuz.pdf has changed
--- a/Paper/anatofuz.tex	Fri Nov 09 00:32:12 2018 +0900
+++ b/Paper/anatofuz.tex	Fri Nov 09 01:12:22 2018 +0900
@@ -262,12 +262,20 @@
 そのため対象となるCodeSegmentをLABLESの並びと対応させ,配列CODESに設定すればCodeSegmentの名前は問わない.
 今回はCodeSegmentである事を示す為にsuffixとしてcbc\_をつける.
 
+命令の実行処理でMoarVMのレジスタであるreg\_baseや命令列cur\_opなどの情報を利用しているが,これらはMVM\_interp\_run内のローカル変数として利用している.
+ラベルを利用しているオリジナル版では同一関数内であるためアクセス可能であるが,CodeSegment間の移動で命令を表現するCbCではアクセスできない.
+その為インタプリタの情報を集約した構造体interを定義し,この構造体へのポインタであるINTERP型の変数iをCodeSegmentの入出力して与える.
+CodeSegment内ではINTERPを経由することでインタプリタの各種情報にアクセスする.
+
 命令実行中のCodeSegmentの遷移を図\ref{fig:perl6cbcinter}に示す.
 この中で実線で書かれている部分はCbCのgoto文で遷移し,波線の箇所は通常のCの関数呼び出しとなっている.
 
-%現在のCbCMoarVMは次の命令セットのディスパッチをcbc\_nextというCodeSegmentで処理している.
-%これは元のMoarVMの命令ディスパッチで行われる現在のオペコードを示すcur\_opと命令列opの操作及び次のラベルに遷移するマクロに該当する.
-%CbCMoarVMではラベルに対しての遷移の代わりにMoarVMの命令のCodeSegmentの集合体である配列CODESにアクセスし,その要素であるCodeSegmentに対して遷移する形を取っている.
+現在のCbCMoarVMは次の命令セットのディスパッチをcbc\_nextというCodeSegmentで処理している.
+これは元のMoarVMのマクロNEXTが行う処理に該当する.
+CbCMoarVMではラベルに対しての遷移の代わりにMoarVMの命令のCodeSegmentの集合体である配列CODESにアクセスし,その要素であるCodeSegmentに対して遷移する.
+
+\lstinputlisting[label=cbc_dispatch_c, caption=CbCMoarVMのバイトコードディスパッチ]{./src/cbc-interp-next.cbc}
+
 
 \begin{figure}[ht]
      \begin{center}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/cbc-interp-next.cbc	Fri Nov 09 01:12:22 2018 +0900
@@ -0,0 +1,14 @@
+#define NEXT_OP(i) (i->op = *(MVMuint16 *)(i->cur_op), i->cur_op += 2, i->op)
+
+#define DISPATCH(op) {goto (CODES[op])(i);}
+#define OP(name) OP_ ## name
+#define NEXT(i) CODES[NEXT_OP(i)](i)
+static int tracing_enabled = 0;
+
+__code cbc_next(INTERP i){
+    goto NEXT(i);
+}
+
+__code cbc_no_op(INTERP i){
+    goto cbc_next(i);
+}