Mercurial > hg > Papers > 2021 > anatofuz-master
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として実装する必要があった。
--- /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 +