Mercurial > hg > Papers > 2017 > mitsuki-thesis
changeset 13:ddfca5037e41
update
author | mir3636 |
---|---|
date | Wed, 15 Feb 2017 20:32:30 +0900 |
parents | cc8ff782067c |
children | 4c3b39b281eb |
files | final_main/chapter5.tex final_main/main.pdf |
diffstat | 2 files changed, 61 insertions(+), 43 deletions(-) [+] |
line wrap: on
line diff
--- a/final_main/chapter5.tex Wed Feb 15 19:23:54 2017 +0900 +++ b/final_main/chapter5.tex Wed Feb 15 20:32:30 2017 +0900 @@ -10,11 +10,53 @@ stub Code Gear を 自動生成することによって Code Gear の記述量を約半分にすることができる。 stub を生成するために generate\_stub は指定された cbc ファイルの \_\_code型である Code Gear を取得し、引数から必要な Data Gear を選択する。 -generate\_stub は引数と interface を照らし合わせ、Gearef または GearImpl を決定する。 +generate\_stub は引数と interface を照らし合わせ、Gearef または GearImpl を決定する(リスト\ref{generate_stub})。 この時既に stub Code Gear が記述されている Code Gear は無視される。 cbc ファイル(リスト\ref{stack_cbc}) から、生成した stub Code Gear を加えて c ファイル(\ref{stack_c})に変換を行う。 +\begin{lstlisting}[frame=lrbt,label=generate_stub,caption={\footnotesize generate stub}] +sub generateStubArgs { + my($codeGearName, $varName, $typeName, $typeField, $interface,$output) = @_; + my $varname1 = $output?"O_$varName":$varName; + for my $n ( @{$dataGearVar{$codeGearName}} ) { + # we already have it + return 0 if ( $n eq $varname1); + } + push @{$dataGearVar{$codeGearName}}, $varname1; + if ($typeName eq $implementation) { + # get implementation + $dataGearName{$codeGearName} .= "\t$typeName* $varName = ($typeName*)GearImpl(context, $interface, $varName);\n"; + } else { + for my $ivar (keys %{$var{$interface}}) { + # input data gear field + if ($varName eq $ivar) { + if ($typeName eq $var{$interface}->{$ivar}) { + if ($output) { + $dataGearName{$codeGearName} .= "\t$typeName** O_$varName = &Gearef(context, $interface)->$varName;\n"; + $outputVar{$codeGearName} .= "\t$typeName* $varName;\n"; + return 1; + } + + $dataGearName{$codeGearName} .= "\t$typeName* $varName = Gearef(context, $interface)->$varName;\n"; + return 1; + } + } + } + for my $cName (keys %{$code{$interface}}) { + if ($varName eq $cName) { + # continuation field + $dataGearName{$codeGearName} .= "\tenum Code $varName = Gearef(context, $interface)->$varName;\n"; + return 1; + } + } + # global variable case + $dataGearName{$codeGearName} .= "\t$typeName* $varName = Gearef(context, $typeName);\n"; + return 1; + } +} +\end{lstlisting} + \begin{lstlisting}[frame=lrbt,label=stack_cbc,caption={\footnotesize cbcファイルの例}] #include "../context.h" @@ -83,53 +125,13 @@ } \end{lstlisting} + + \section{Context の生成} Context は Meta Data Gear に相当し、Code Gear や Data Gear を管理している。 Data Gear を取得するために generate\_context は context の定義 (リスト\ref{context}) を読み宣言されている Data Gear を取得する。 -Code Gear は指定された cbc ファイルから stub を見て取得を行う。 -取得した Code/Data Gear の enum の定義は enumCode.h、enumData.h に生成される。 - -Context では Code Gear の名前とポインタの対応は generate\_context によって生成される enum Code と関数ポインタによって表現される。 -実際に Code Gear に接続する際は enum Code を指定することで接続を行う。 - -また、generate\_context は取得した Code/Data Gear から Context の生成を行うコード (リスト\ref{init_context}) も生成する。 - -Context には Allocation 等で生成した Data Gear へのポインタが格納されている。 -Code Gear は Context を通して Data Gear へアクセスする。 -Data Gear の Allocation を行うコードは dataGearInit.c に生成される。 - -Data Gear は union Data とその中の struct によって表現される。 -Context には Data Gear の Data Type の情報が格納されている。 -この情報から確保される Data Gear のサイズなどを決定する。 \begin{lstlisting}[frame=lrbt,label=context,caption={\footnotesize context の定義}] -#define ALLOCATE_SIZE 20000000 -#define NEW(type) (type*)(calloc(1, sizeof(type))) -#define NEWN(n, type) (type*)(calloc(n, sizeof(type))) - -#define ALLOC_DATA(context, dseg) ({\ - struct Meta* meta = (struct Meta*)context->heap;\ - meta->type = D_##dseg;\ - meta->size = 1;\ - context->heap += sizeof(struct Meta);\ - context->data[D_##dseg] = context->heap; context->heap += sizeof(struct dseg); (struct dseg *)context->data[D_##dseg]; }) - -#define ALLOCATE(context, t) ({ \ - struct Meta* meta = (struct Meta*)context->heap;\ - context->heap += sizeof(struct Meta);\ - union Data* data = context->heap; \ - context->heap += sizeof(struct t); \ - meta->type = D_##t; \ - meta->size = 1; \ - data; }) - -#define Gearef(context, t) (&(context)->data[D_##t]->t) -#define GearImpl(context, intf, name) (Gearef(context, intf)->name->intf.name) - -#include "c/enumCode.h" - -#include "c/enumData.h" - struct Context { enum Code next; struct Worker* worker; @@ -194,6 +196,22 @@ \end{lstlisting} +Code Gear の取得は指定された cbc ファイルから \_\_code 型を見て行う。 +取得した Code/Data Gear の enum の定義は enumCode.h、enumData.h に生成される。 + +Context では Code Gear の名前とポインタの対応は generate\_context によって生成される enum Code と関数ポインタによって表現される。 +実際に Code Gear に接続する際は enum Code を指定することで接続を行う。 + +また、generate\_context は取得した Code/Data Gear から Context の生成を行うコード (リスト\ref{init_context}) も生成する。 + +Context には Allocation 等で生成した Data Gear へのポインタが格納されている。 +Code Gear は Context を通して Data Gear へアクセスする。 +Data Gear の Allocation を行うコードは dataGearInit.c に生成される。 + +Data Gear は union Data とその中の struct によって表現される。 +Context には Data Gear の Data Type の情報が格納されている。 +この情報から確保される Data Gear のサイズなどを決定する。 + \begin{lstlisting}[frame=lrbt,label=init_context,caption={\footnotesize 生成された context}] #include <stdlib.h>