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>
Binary file final_main/main.pdf has changed