# HG changeset patch # User Kaito Tokumori # Date 1399903086 -32400 # Node ID d2398deb3e489e725e9eeb6a0939c0bed68b9c11 # Parent 9c718fe8b81d4b660b3b71008a2ca7f222558dd4 rewrite implementation diff -r 9c718fe8b81d -r d2398deb3e48 presen/slide/s6/presen.html --- 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 @@
    -
  • code segment から関数に戻るための機能. -
  • GCC 上に実装した CbC コンパイラは nested function を使用していたが clang はこの構文を受け付けない. -
  • setjmp/longjmp を用いて実装.
  • __return, __environment という二つのキーワードを利用して実現. -
  • 以下のコードのように使用し, この場合 0 でなく 1 が返る. +
  • C の関数から code segment に継続した後, C 元の関数を呼び出した関数に戻るための機能. +
  • 以下のコードの場合, A から継続した B は環境付き継続を用いて A の呼び出し元である main に戻る.
-__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.
 }	      
+

環境付き継続

-

__return, __environment の存在を確認すると以下のコードを自動生成する.

- - - +

自動生成されたコード

+
元のコード - clang/LLVM 内部でのコード -
-__code cs(int retval,__code(*ret)(int,void *),void *env){
-  goto ret(n, env);
-}
-
-int func (){
-  goto cs(1, __return, __environment);
-  return 0;
-}
-	      
-
-
 #include <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,
+	      
+
+
+int A(){
+   goto B(1,
        ({
          __code (*__CbC_return)();
 __CbC_return = return1;