Mercurial > hg > Papers > 2021 > anatofuz-master
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}に示す。
--- /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); +} +