changeset 43:a5e840dede1b

add src
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Mon, 01 Feb 2021 11:39:12 +0900
parents 8d779a8c8029
children 786aea1c7cde
files paper/chapter/04-interface.tex paper/master_paper.pdf paper/src/pop2.cbc paper/src/pop2meta.cbc
diffstat 4 files changed, 53 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/paper/chapter/04-interface.tex	Mon Feb 01 11:25:27 2021 +0900
+++ b/paper/chapter/04-interface.tex	Mon Feb 01 11:39:12 2021 +0900
@@ -78,10 +78,17 @@
 
 従来のMetaCodeGearの生成では、 別のInterfaceからの入力を受け取るCodeGearのStubの生成に問題があった。
 具体的なこの問題が発生する例題をソースコード\ref{src:insertTest1}に示す。
+\lstinputlisting[label=src:insertTest1, caption=別Interfaceからの書き出しを取得するCodeGearの例]{src/pop2test.cbc}
 この例では\texttt{pop2Test}Code Gearから \texttt{stack->pop2}を呼び出し、 継続として\texttt{pop2Test1}を渡している。
 \texttt{pop2Test}自体はStackTest Interfaceであり、 \texttt{stack->pop2}の\texttt{stack}はStack Interfaceである。
+例題ではStack Interfaceの実装はSingleLinkedStackである。
+SingleLinkedStackの\texttt{pop2}の実装をソースコード\ref{src:pop2}に示す。
+\lstinputlisting[label=src:pop2, caption=SingleLinkedStackのpop2]{src/pop2.cbc}
 
-\lstinputlisting[label=src:insertTest1, caption=別Interfaceからの書き出しを取得するCodeGearの例]{src/pop2test.cbc}
+このコードをgenerate\_stub.pl経由でメタ計算を含むコードに変換する。
+変換した先のコードを\ref{src:pop2meta}に示す。
+\lstinputlisting[label=src:pop2meta, caption=SingleLinkedStackのpop2のメタ計算]{src/pop2meta.cbc}
+
 
 当初Perlスクリプトが生成した\texttt{pop2Test1}のstub CodeGearはソースコード\ref{src:pop2stub-origin}のものである。
 CodeGear間で処理されるデータの流れの概要図を図\ref{fig:stackTest1}に示す。
Binary file paper/master_paper.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/src/pop2.cbc	Mon Feb 01 11:39:12 2021 +0900
@@ -0,0 +1,16 @@
+__code pop2SingleLinkedStack(struct SingleLinkedStack* stack, __code next(union Data* data, union Data* data1, ...)) {
+    if (stack->top) {
+        data = stack->top->data;
+        stack->top = stack->top->next;
+    } else {
+        data = NULL;
+    }
+    if (stack->top) {
+        data1 = stack->top->data;
+        stack->top = stack->top->next;
+    } else {
+        data1 = NULL;
+    }
+    goto next(data, data1, ...);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/src/pop2meta.cbc	Mon Feb 01 11:39:12 2021 +0900
@@ -0,0 +1,29 @@
+__code pop2SingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack, enum Code next,union Data **O_data,union Data **O_data1) {
+  Data* data  __attribute__((unused))  = *O_data;
+  Data* data1  __attribute__((unused))  = *O_data1;
+    if (stack->top) {
+        data = stack->top->data;
+        stack->top = stack->top->next;
+    } else {
+        data = NULL;
+    }
+    if (stack->top) {
+        data1 = stack->top->data;
+        stack->top = stack->top->next;
+    } else {
+        data1 = NULL;
+    }
+  *O_data = data;
+  *O_data1 =  data1;
+    goto meta(context, next);
+}
+
+
+__code pop2SingleLinkedStack_stub(struct Context* context) {
+  SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack);
+  enum Code next = Gearef(context, Stack)->next;
+  Data** O_data = &Gearef(context, Stack)->data;
+  Data** O_data1 = &Gearef(context, Stack)->data1;
+  goto pop2SingleLinkedStack(context, stack, next, O_data, O_data1);
+}
+