changeset 104:46494d9aafb9

update
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Sat, 06 Feb 2021 12:11:33 +0900
parents 63801f42ade3
children 20bb97e54d33
files paper/chapter/04-interface.tex paper/master_paper.pdf paper/src/NotDefine.pl paper/src/NotFoundDefine.cbc paper/src/NotFoundDefine.sh
diffstat 5 files changed, 55 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/paper/chapter/04-interface.tex	Sat Feb 06 11:19:45 2021 +0900
+++ b/paper/chapter/04-interface.tex	Sat Feb 06 12:11:33 2021 +0900
@@ -426,21 +426,41 @@
 このローカル変数の型と、CodeGearの定義の引数の型が、完全に一致しているかどうかのチェックを行うと、さらに強固な引数チェックが可能となる。
 ただし引数で渡す際に、例えばint型の値の加算処理などを行っていると、その処理の結果がint型になっているかどうかをPerlレベルでチェックする必要が出てしまう。
 
-
-\section{InterfaceのAPIの未実装の検知}
-InterfaceAPI呼び出し時に引数の数以外に、そもそも実装していないAPIを呼び出してしまうことがある。
-この場合はCbCがPerlスクリプトによって変換された後でエラーが出る。
-内容はCbCコンパイラのコンパイル時にInterfaceの構造体に、APIに対応するフィールドがないエラーである。
-コンパイル時に発覚できるので問題ないが、 これも変換する前に発見したほうがデバッグが容易である。
+\section{InterfaceのAPIにないものを呼び出した場合の検知}
+InterfaceAPI呼び出し時に、そもそも実装していないAPIを呼び出してしまうことがある。
+これもCbCファイルの返還前に処理を行いたい。
 
 API呼び出し時の処理は、ソースコード\ref{src:parsedArgs}の処理そのものであるため、この処理の中に未実装のAPIを検知する様にした。
 呼び出し元のInterfaceの情報パースした結果、ヘッダファイルにAPIの定義がなかった場合は11行目の\texttt{unless}に処理が落ち、 エラー終了する。
-これによってInterface呼び出しの問題が、 Perlスクリプトによって変換する前に検知可能になった。
+
+
+ソースコード\ref{src:NotFoundDefine.cbc}の例では、 Phils Interfaceに存在しないsleepingを呼び出している。
+この状態でビルドを実行すると、ソースコード\ref{src:NotFoundDefine.sh}のエラーがMake時に発生し、ビルドが停止する。
+\lstinputlisting[label=src:NotFoundDefine.cbc, caption=存在しないsleepingの呼び出し]{src/NotFoundDefine.cbc}
+\lstinputlisting[label=src:NotFoundDefine.sh, caption=存在しないAPIの呼び出し時のエラー]{src/NotFoundDefine.sh}
+
+
+
+\section{InterfaceのAPIを完全に実装していない場合の検知}
+InterfaceのAPIで定義したCodeGearは、Impl側はすべて実装している必要がある。
+しかし、 CodeGearの実装を忘れてしまうケースがある。
+これをPerlレベルで検知したい。
+
+generate\_stub.plは2度CbCファイルを読み込む。
+書き出しに移る前に、変換しようとしているCbCファイルのCodeGearの情報はすべて取得できている為に、ここで検知可能である。
+初回のCbCファイルの読み込み終了時に、 検出できたCodeGearの名前と、CbCファイルが実装しようとしているInterfaceの定義を見比べる。
+CodeGearをすべて満たしていなかった場合はエラーを出したい。
+
+ソースコード\ref{src:notDefInterfaceAPI}は、Interfaceが要求しているAPIを実装したかを確認する部分である。
+変換しようとしているCbCファイルが何かのInterfaceを実装しようとしている場合、 Interfaecの定義ファイルのパース結果から、満たすべきCodeGearの一覧を取得する。(ソースコード1、2行目)
+実装していた場合は6行目でマークをつけ、 マークがなかったCodeGearが検知された時点でエラーを発生させる。(12行目)
+\lstinputlisting[label=src:notDefInterfaceAPI, caption=InterfaceのAPI呼び出し時の引数エラー]{src/NotDefine.pl}
 
 ソースコード\ref{src:errNotDef}の例では、Phils Interfaceの実装時にeating CodeGearの実装を忘れた際のエラーである。
 CMakeがエラーを検知し、ビルドが停止するために、 GearsOSの拡張構文レベルでのエラー検知が実現できている。
 \lstinputlisting[label=src:errNotDef, caption=未実装のInterfaceのAPIがあることを知らせるエラー]{src/errorNotDef.sh}
 
+
 \section{par goto のInterface経由の呼び出しの対応}
 従来のpar gotoではInterface経由の呼び出しは想定していなかった。
 par gotoで継続したいCodeGearはInterfaceのAPIとしてではなく、 Interfaceを入力として受け取るCodeGearとして実装する必要があった。
Binary file paper/master_paper.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/src/NotDefine.pl	Sat Feb 06 12:11:33 2021 +0900
@@ -0,0 +1,16 @@
+if ($implInterfaceInfo->{isImpl} && $filename =~ /\.cbc\z/) {
+  for my $shouldImplCode (map { $_->{name} } grep { $_->{args} =~ /Impl/ } @{$implInterfaceInfo->{parsedInterfaceInfo}->{codes}}) {
+    my $isDefine = $shouldImplCode;
+    for my $implCode (keys %{$codeGearInfo}) {
+      if ($implCode =~  /$shouldImplCode/) {
+        $isDefine = 1;
+        next;
+      }
+    }
+
+    if ($isDefine ne 1) {
+      die "[ERROR] Not define $isDefine at $filename\n";
+    }
+  }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/src/NotFoundDefine.cbc	Sat Feb 06 12:11:33 2021 +0900
@@ -0,0 +1,3 @@
+par goto phils0->sleeping(exit_code); // Not define
+par goto phils1->thinking(exit_code);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/src/NotFoundDefine.sh	Sat Feb 06 12:11:33 2021 +0900
@@ -0,0 +1,9 @@
+[ 11%] Generating c/examples/DPP2/main.c
+[ERROR] not found phils0 definition at     par goto phils0->sleeping(exit_code);
+ in examples/DPP2/main.cbc
+ make[3]: *** [CMakeFiles/DPP2.dir/build.make:105: c/examples/DPP2/main.c] Error 25
+ make[3]: *** Deleting file 'c/examples/DPP2/main.c'
+ make[2]: *** [CMakeFiles/Makefile2:442: CMakeFiles/DPP2.dir/all] Error 2
+ make[1]: *** [CMakeFiles/Makefile2:450: CMakeFiles/DPP2.dir/rule] Error 2
+ make: *** [Makefile:293: DPP2] Error 2
+