# HG changeset patch # User mir3636 # Date 1516460737 -32400 # Node ID 33222880db7922afb17006a4846c792199b10d44 # Parent 6df75cb95ddd84dda0fd9e56be1b6cd1f8161e45 update diff -r 6df75cb95ddd -r 33222880db79 Slide/fig/generate_context3.pdf Binary file Slide/fig/generate_context3.pdf has changed diff -r 6df75cb95ddd -r 33222880db79 Slide/prosym.html --- a/Slide/prosym.html Sat Jan 20 23:52:11 2018 +0900 +++ b/Slide/prosym.html Sun Jan 21 00:05:37 2018 +0900 @@ -86,7 +86,7 @@ @@ -216,10 +216,26 @@ @@ -346,8 +362,16 @@ stack->clear = C_clearSingleLinkedStack; return stack; } + -__code pushSingleLinkedStack(struct SingleLinkedStack* stack, union Data* data, __code next(...)) { + + +
+ +

Interface の実装例

+ +
__code pushSingleLinkedStack(struct SingleLinkedStack* stack, 
+                                union Data* data, __code next(...)) {
     Element* element = new Element();
     element->next = stack->top;
     element->data = data;
@@ -376,13 +400,20 @@
   
  • そこで Context から必要なデータを取り出して Code Gear に接続する、メタレベルの stub Code Gear を定義し、これを介して間接的に必要な Data Gear にアクセスする。
  • -
    __code clearSingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack,enum Code next) {
    +
    +
    +
    + +

    stub Code Gear の例

    +
    __code clearSingleLinkedStack(struct Context *context,
    +                    struct SingleLinkedStack* stack,enum Code next) {
         stack->top = NULL;
         goto meta(context, next);
     }
     
     __code clearSingleLinkedStack_stub(struct Context* context) {
    -        SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack);
    +        SingleLinkedStack* stack = 
    +                (SingleLinkedStack*)GearImpl(context, Stack, stack);
             enum Code next = Gearef(context, Stack)->next;
             goto clearSingleLinkedStack(context, stack, next);
     }
    @@ -406,7 +437,7 @@
     
    -

    stub Code Gear の生成

    +

    stub Code Gear の生成

    • stub Code Gear は Code Gear 間の継続に挟まれ、Code Gear が必要な Data Gear を Context から取り出す処理を行うものである。
    • stub Code Gear は Code Gear 毎に記述する必要があり、そのCode Gear の引数を見て取り出す Data Gear を選択する。
    • @@ -415,13 +446,21 @@
    • cbc ファイルの Code Gear から、生成した stub Code Gear を加えたファイルを生成する。
    -
    __code clearSingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack,enum Code next) {
    +
    +
    +
    + +

    生成された stub Code Gear

    + +
    __code clearSingleLinkedStack(struct Context *context,
    +                    struct SingleLinkedStack* stack,enum Code next) {
         stack->top = NULL;
         goto meta(context, next);
     }
     
     __code clearSingleLinkedStack_stub(struct Context* context) {
    -        SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack);
    +        SingleLinkedStack* stack = 
    +                (SingleLinkedStack*)GearImpl(context, Stack, stack);
             enum Code next = Gearef(context, Stack)->next;
             goto clearSingleLinkedStack(context, stack, next);
     }
    @@ -434,7 +473,6 @@
     

    Context の生成

      -
    • Context は Meta Data Gear に相当し、Code Gear や Data Gear を管理している。
    • generate_context は context.h から Data Gear、generate_stub から生成されたファイルから Code Gear を取得し、以下を生成する。
      • Code/Data Gear を enum で定義した enumCode.h、enumData.h
      • @@ -445,7 +483,7 @@
      - generate_context3 + generate_context3
      diff -r 6df75cb95ddd -r 33222880db79 Slide/prosym.md --- a/Slide/prosym.md Sat Jan 20 23:52:11 2018 +0900 +++ b/Slide/prosym.md Sun Jan 21 00:05:37 2018 +0900 @@ -185,8 +185,13 @@ stack->clear = C_clearSingleLinkedStack; return stack; } +``` -__code pushSingleLinkedStack(struct SingleLinkedStack* stack, union Data* data, __code next(...)) { +# Interface の実装例 + +```impl +__code pushSingleLinkedStack(struct SingleLinkedStack* stack, + union Data* data, __code next(...)) { Element* element = new Element(); element->next = stack->top; element->data = data; @@ -209,14 +214,17 @@ - しかし、Meta Data Gear である Context をノーマルレベルの Code Gear から直接アクセスするのはよろしくない。 - そこで Context から必要なデータを取り出して Code Gear に接続する、メタレベルの stub Code Gear を定義し、これを介して間接的に必要な Data Gear にアクセスする。 +# stub Code Gear の例 ```stub -__code clearSingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack,enum Code next) { +__code clearSingleLinkedStack(struct Context *context, + struct SingleLinkedStack* stack,enum Code next) { stack->top = NULL; goto meta(context, next); } __code clearSingleLinkedStack_stub(struct Context* context) { - SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack); + SingleLinkedStack* stack = + (SingleLinkedStack*)GearImpl(context, Stack, stack); enum Code next = Gearef(context, Stack)->next; goto clearSingleLinkedStack(context, stack, next); } @@ -238,14 +246,18 @@ - Code Gear の引数と interface を照らし合わせ、Gearef または GearImpl を決定する。 - cbc ファイルの Code Gear から、生成した stub Code Gear を加えたファイルを生成する。 +# 生成された stub Code Gear + ```stub -__code clearSingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack,enum Code next) { +__code clearSingleLinkedStack(struct Context *context, + struct SingleLinkedStack* stack,enum Code next) { stack->top = NULL; goto meta(context, next); } __code clearSingleLinkedStack_stub(struct Context* context) { - SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack); + SingleLinkedStack* stack = + (SingleLinkedStack*)GearImpl(context, Stack, stack); enum Code next = Gearef(context, Stack)->next; goto clearSingleLinkedStack(context, stack, next); } @@ -253,14 +265,13 @@ # Context の生成 -- Context は Meta Data Gear に相当し、Code Gear や Data Gear を管理している。 - generate_context は context.h から Data Gear、generate_stub から生成されたファイルから Code Gear を取得し、以下を生成する。 - Code/Data Gear を enum で定義した enumCode.h、enumData.h - 取得した Code/Data Gear から Context の生成を行う target-context - Context を生成する際の Data Gear の Allocation を行う dataGearInit.c
      - generate_context3 + generate_context3
      # 今後の課題