changeset 26:d2398deb3e48

rewrite implementation
author Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
date Mon, 12 May 2014 22:58:06 +0900
parents 9c718fe8b81d
children 20f6eff0779c
files presen/slide/s6/presen.html
diffstat 1 files changed, 19 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/presen/slide/s6/presen.html	Mon May 12 22:49:54 2014 +0900
+++ b/presen/slide/s6/presen.html	Mon May 12 22:58:06 2014 +0900
@@ -444,62 +444,49 @@
 	<table width='100%'>
 	  <tr><td>
 	<ul>
-	  <li>code segment から関数に戻るための機能.
-	  <li>GCC 上に実装した CbC コンパイラは nested function を使用していたが clang はこの構文を受け付けない.
-	  <li>setjmp/longjmp を用いて実装.
 	  <li>__return, __environment という二つのキーワードを利用して実現.
-	  <li>以下のコードのように使用し, この場合 0 でなく 1 が返る.
+	  <li>C の関数から code segment に継続した後, C 元の関数を呼び出した関数に戻るための機能.
+	  <li>以下のコードの場合, A から継続した B は環境付き継続を用いて A の呼び出し元である main に戻る.
 	</ul>
 	</tr>
 	  <tr>
 	    <td style="border: double;">
 	      <pre class='code'>
-__code cs(int retval,__code(*ret)(int,void *),void *env){
+__code B(int retval,__code(*ret)(int,void *),void *env){
   goto ret(n, env);
 }
 
-int func (){
-  goto cs(1, __return, __environment);
+int A(){
+  goto B(1, __return, __environment);
   return 0;
 }
 
-int caller (){
+int main(){
   int retval;
-  retval = func(); // retval should be 1.
+  retval = A(); // retval should be 1.
 }	      </pre>
 	  </tr>
 	</table>
+	<ul>
+	  <li>GCC 上に実装した CbC コンパイラは nested function を使用していたが clang はこの構文を受け付けない.
+	  <li>setjmp/longjmp を用いて実装.
+	</ul>
       </div>
 
       <div class='slide'>
 	<h2>環境付き継続</h2>
-	<p>__return, __environment の存在を確認すると以下のコードを自動生成する.</p>
-	<table width='100%'>
-	  <tr>
-	    <td>元のコード
-	    <td>clang/LLVM 内部でのコード
-	  </tr>
+	<p align='center'>自動生成されたコード</p>
+	<table width='80%' align='center'>
 	  <tr>
 	    <td valign='top'>
 	      <pre class='small_code'>
-__code cs(int retval,__code(*ret)(int,void *),void *env){
-  goto ret(n, env);
-}
-
-int func (){
-  goto cs(1, __return, __environment);
-  return 0;
-}
-	      </pre>
-	    <td>
-	      <pre class='smaller_code'>
 #include &lt;setjmp.h>
 
 struct CbC_env {
   void *ret_p,*env;
 };
 
-__code cs(int retval,__code(*ret)(int,void *),void *env){
+__code B(int retval,__code(*ret)(int,void *),void *env){
   goto ret(n, env);
 }
 
@@ -508,8 +495,11 @@
   longjmp((int*)(((struct CbC_env *)env)->env),1);
 }
 
-int func (){
-   goto code1(1,
+	      </pre>
+	    <td>
+	      <pre class='small_code'>
+int A(){
+   goto B(1,
        ({
          __code (*__CbC_return)();
 __CbC_return = return1;