# HG changeset patch # User Nobuyasu Oshiro # Date 1325586111 -32400 # Node ID 275073032132d0ce37abeeaa3fb56797d27e400a # Parent 9250ac87c2c7b5f70ed8801d274b51cbc74b5909 modify diff -r 9250ac87c2c7 -r 275073032132 presen/index.html --- a/presen/index.html Tue Jan 03 14:03:13 2012 +0900 +++ b/presen/index.html Tue Jan 03 19:21:51 2012 +0900 @@ -9,7 +9,7 @@ font-size:28px; } td.srctd { -height:18em; +height:17em; } pre.srcbox { height: 100%; @@ -869,7 +869,7 @@

CbCの実装:TCE(末尾除去)の実装について

@@ -877,11 +877,11 @@

CbCの実装

+
  • CbCの基本機能を実現する為の実装は以上の2つになる。
    • シンタックスの追加
    • 末尾除去によるコードセグメントへjmp命令での処理の移り
    -
  • この2つがGCCにおけるCbC実装の基本の部分となる。
  • ここからはCbCの機能の拡張になる。
  • @@ -941,7 +941,6 @@
  • fastcall属性の付与によりMicro-C版に速度で勝るようになった。
  • - @@ -991,7 +990,9 @@

    CbCの実装:環境付き継続

    +
    引数渡しに使われるレジスタの数(gcc)
    @@ -1000,8 +1001,8 @@ + +
    生成しているコード
    -goto c1(__return, __environment);
     
    +//goto c1(__return, __environment);
     goto c1(({
     	  __label__ _cbc_exit0;
     	  static int retval;
    @@ -1018,7 +1019,30 @@
     	  
    + +
    +
  • retval変数の型は継続を行った関数と同じ戻値の型となる。
  • + +
    + +
    +

    CbCの実装:環境付き継続

    + + + + + + + + -
    生成されるTree生成する為のコード
    + +
    +
         case RID_CbC_RET:
     {
       tree value, stmt, label, tlab, decl;
    @@ -1064,17 +1088,10 @@
       expr.value = c_finish_stmt_expr (location, stmt);
       expr.original_code = ERROR_MARK;
     }
    +			 
    -

    retval変数はint型になっているが、実際には継続を行った関数と同じ戻値の型となる。

    -
  • 上記のコードをGCC内で生成すると次のようなTreeができる。
  • -
    - -
    -

    CbCの実装:環境付き継続

    -

    作成されるTree

    - +