Mercurial > hg > Papers > 2019 > anatofuz-thesis
changeset 52:2e43fd532f89
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 15 Feb 2019 21:16:25 +0900 |
parents | fafc7d66ceb0 |
children | 1499d4fbbb31 |
files | paper/chapter4.tex paper/main.pdf |
diffstat | 2 files changed, 19 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/chapter4.tex Fri Feb 15 19:27:32 2019 +0900 +++ b/paper/chapter4.tex Fri Feb 15 21:16:25 2019 +0900 @@ -217,7 +217,25 @@ \begin{itemize} \item OP(.*)の.*部分をCodeGearの名前として、 先頭にcbc\_をつけた上で設定する。 \item cur\_opなど、 構造体INTERのメンバ変数は、 ポインタiから参照するように修正する。 - \item GC対策のためマクロMVMROOTを使い局所変数のポインタをスタックに積む箇所は、 局所変数をstatic化する。 + \item GC対策のためマクロMVMROOTを利用している箇所は、 一度ダミーの関数を経由する。 \item 末尾のgoto NEXTをgoto cbc\_next(i)に修正する。 \item case文で下のcase文に移行する箇所は、 case文に対応するCodeGearに遷移する様にgoto文を付け加える。 \end{itemize} + +この中の MVMROOT をソースコード\ref{MVMROOT}に示す。 + +\begin{lstlisting}[frame=lrbt,label=MVMROOT,caption={MVMROOTの定義}] +/* Macros related to rooting objects into the temporaries list, and + * unrooting them afterwards. */ +#define MVMROOT(tc, obj_ref, block) do {\ + MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref)); \ + block \ + MVM_gc_root_temp_pop(tc); \ + } while (0) +\end{lstlisting} + +MVMROOTは、 行いたい処理の前後で、MVM\_gc\_root\_temp系統のpushとpopのスタック操作の関数を実行する。 +これは、 MoarVMが所持しているガベージコレクションに、 行いたい処理の間にオブジェクトが回収されるのを防ぐための処理である。 +ガベージコレクションの回収を防ぐために、 MVM\_gc\_root\_temp\_pushでは、 大域変数の配列に一時的にオブジェクトのアドレスを入れる。 +このオブジェクトは、 CodeGear中のローカル変数であるが、 CodeGear中のローカル変数は通常別のCodeGearに移動する際に破棄する為、 この様な動きを想定していない。 +その為、 MVMROOT を呼び出す処理の場合は、 MVMROOT を使う命令を別の関数でラップし、 CodeGearから関数呼び出しの形で命令を呼び出す。