Browse Source

refactor: 调整activity结构体

func和gc的activity结构体分离
SongZihuan 3 years ago
parent
commit
6956f00880
4 changed files with 139 additions and 108 deletions
  1. 50 39
      src/core/__env.h
  2. 77 61
      src/core/env.c
  3. 5 1
      src/core/gc.c
  4. 7 7
      src/core/run.c

+ 50 - 39
src/core/__env.h

@@ -55,53 +55,64 @@ struct af_LiteralDataList {
 struct af_Activity {  // 活动记录器
     struct af_Activity *prev;  // 上一个活动记录器
 
-    enum af_ActivityStatus {
-        act_func = 0,
-        act_arg,
-        act_normal,
-    } status;
+    enum af_ActivityType {
+        act_func,
+        act_gc,
+    } type;
+
+    struct af_Object *belong;  // 属对象 (belong通常为func的belong)
 
     struct af_Message *msg_down;  // 被调用者向调用者传递信息
     struct af_Message *msg_up;  // 调用者向被调用者传递信息
     ActivityCount msg_up_count;  // msg_up 添加的个数
 
-    bool run_in_func;  // 在函数变量空间内运行 (act_arg用)
-    struct af_VarSpaceListNode *vsl;  // 变量空间
-    struct af_VarSpaceListNode *func_var_list;  // 函数内部变量空间 (运行函数体时会设置为 主变量空间)
     struct af_VarSpaceListNode *var_list;  // 主变量空间
     ActivityCount new_vs_count;  // 需要释放的空间数
 
-    struct af_Object *belong;  // 属对象 (belong通常为func的belong)
-    struct af_Object *func;  // 函数本身
-
-    struct af_Code *bt_top;  // 最顶层设置为NULL, 函数调用设置为block, (bt_start的上一个元素)
-    struct af_Code *bt_start;  // 代码的起始位置 (block的第一个元素)
-    struct af_Code *bt_next;  // 指示代码下一步要运行的位置 [总是超前当前执行的code]
-
-    bool return_first;  // 顺序执行, 获取第一个返回结果
-    struct af_Object *return_obj;  // 调用者向被调用者传递信息
-    size_t process_msg_first;  // 优先处理msg而不是code
-
-    /* 函数调用专项 */
-    enum af_BlockType call_type;  // 函数调用类型
-    struct af_Object *parentheses_call;  // 类前缀调用
-    struct af_ArgCodeList *acl_start;
-    struct af_ArgCodeList *acl_done;  // 记录当前运行的acl [总是与当前执行的acl同步] [acl代码执行完成后需要把结果写入acl, 故不超前]
-    struct af_FuncInfo *fi;
-    struct af_FuncBody *body_next;  // 下一个需要执行的body [总是超前当前执行的body]
-    void *mark;  // 标记 [完全由API管理, 不随activity释放]
-    struct af_VarSpaceListNode *macro_vsl;  // 宏函数执行的vsl
-    ActivityCount macro_vs_count;
-
-    /* 字面量专项 */
-    bool is_literal;  // 处于字面量运算 意味着函数调用结束后会调用指定API
-    struct af_LiteralDataList *ld;
-
-    /* gc 机制 */
-    bool is_gc;  // 处于gc的析构函数运行
-    struct gc_DestructList *dl;
-    struct gc_DestructList **pdl;  // 执行dl的最末端
-    struct gc_DestructList *dl_next;  // dl执行的位置
+    union {
+        struct {
+            struct gc_DestructList *dl;
+            struct gc_DestructList **pdl;  // 执行dl的最末端
+            struct gc_DestructList *dl_next;  // dl执行的位置
+        };
+
+        struct {
+            enum af_ActivityStatus {
+                act_func_get = 0,
+                act_func_arg,
+                act_func_normal,
+            } status;
+
+            struct af_Object *func;  // 函数本身
+
+            bool run_in_func;  // 在函数变量空间内运行 (act_arg用)
+            struct af_VarSpaceListNode *vsl;  // 变量空间
+            struct af_VarSpaceListNode *func_var_list;  // 函数内部变量空间 (运行函数体时会设置为 主变量空间)
+
+            struct af_Code *bt_top;  // 最顶层设置为NULL, 函数调用设置为block, (bt_start的上一个元素)
+            struct af_Code *bt_start;  // 代码的起始位置 (block的第一个元素)
+            struct af_Code *bt_next;  // 指示代码下一步要运行的位置 [总是超前当前执行的code]
+
+            bool return_first;  // 顺序执行, 获取第一个返回结果
+            struct af_Object *return_obj;  // 调用者向被调用者传递信息
+            size_t process_msg_first;  // 优先处理msg而不是code
+
+            /* 函数调用专项 */
+            enum af_BlockType call_type;  // 函数调用类型
+            struct af_Object *parentheses_call;  // 类前缀调用
+            struct af_ArgCodeList *acl_start;
+            struct af_ArgCodeList *acl_done;  // 记录当前运行的acl [总是与当前执行的acl同步] [acl代码执行完成后需要把结果写入acl, 故不超前]
+            struct af_FuncInfo *fi;
+            struct af_FuncBody *body_next;  // 下一个需要执行的body [总是超前当前执行的body]
+            void *mark;  // 标记 [完全由API管理, 不随activity释放]
+            struct af_VarSpaceListNode *macro_vsl;  // 宏函数执行的vsl
+            ActivityCount macro_vs_count;
+
+            /* 字面量专项 */
+            bool is_literal;  // 处于字面量运算 意味着函数调用结束后会调用指定API
+            struct af_LiteralDataList *ld;
+        };
+    };
 };
 
 typedef void TopMsgProcessFunc(af_Message *msg, bool is_gc, af_Environment *env);

+ 77 - 61
src/core/env.c

@@ -11,8 +11,10 @@ static bool enableCore(af_Core *core);
 static bool checkInherit(af_Inherit **ih, af_Object *obj);
 
 /* Activity 创建和释放 */
-static af_Activity *makeActivity(af_Code *bt_top, af_Code *bt_start, bool return_first, af_Message *msg_up,
-                                 af_VarSpaceListNode *vsl, af_Object *belong, af_Object *func);
+static af_Activity *makeActivity(af_Message *msg_up, af_VarSpaceListNode *vsl, af_Object *belong);
+static af_Activity *makeFuncActivity(af_Code *bt_top, af_Code *bt_start, bool return_first, af_Message *msg_up,
+                                     af_VarSpaceListNode *vsl, af_Object *belong, af_Object *func);
+static af_Activity *makeGcActivity(gc_DestructList *dl, gc_DestructList **pdl, af_Environment *env);
 static af_Activity *freeActivity(af_Activity *activity);
 static void freeAllActivity(af_Activity *activity);
 static void clearActivity(af_Activity *activity);
@@ -162,20 +164,23 @@ static bool enableCore(af_Core *core) {
     return true;
 }
 
-static af_Activity *makeActivity(af_Code *bt_top, af_Code *bt_start, bool return_first, af_Message *msg_up,
-                                 af_VarSpaceListNode *vsl, af_Object *belong, af_Object *func) {
+static af_Activity *makeActivity(af_Message *msg_up, af_VarSpaceListNode *vsl, af_Object *belong) {
     af_Activity *activity = calloc(sizeof(af_Activity), 1);
-    activity->status = act_func;
-
     activity->msg_up = msg_up;
     activity->msg_up_count = 0;
-
     activity->var_list = vsl;
     activity->new_vs_count = 0;
-
     activity->belong = belong;
-    activity->func = func;
+    return activity;
+}
+
+static af_Activity *makeFuncActivity(af_Code *bt_top, af_Code *bt_start, bool return_first, af_Message *msg_up,
+                                     af_VarSpaceListNode *vsl, af_Object *belong, af_Object *func) {
+    af_Activity *activity = makeActivity(msg_up, vsl, belong);
 
+    activity->type = act_func;
+    activity->status = act_func_get;
+    activity->func = func;
     activity->bt_top = bt_top;
     activity->bt_start = bt_start;
     activity->bt_next = bt_start;
@@ -184,23 +189,41 @@ static af_Activity *makeActivity(af_Code *bt_top, af_Code *bt_start, bool return
     return activity;
 }
 
+static af_Activity *makeGcActivity(gc_DestructList *dl, gc_DestructList **pdl, af_Environment *env) {
+    af_Activity *activity = makeActivity(NULL, NULL, env->core->global);
+    activity->type = act_gc;
+
+    activity->var_list = makeVarSpaceList(getProtectVarSpace(env));
+    activity->new_vs_count = 1;
+
+    activity->dl = dl;
+    activity->pdl = pdl;
+    activity->dl_next = dl;
+    return activity;
+}
+
 static af_Activity *freeActivity(af_Activity *activity) {
     af_Activity *prev = activity->prev;
 
     freeAllMessage(activity->msg_down);  // msg转移后需要将对应成员设置为NULL
     freeMessageCount(activity->msg_up_count, activity->msg_up);
 
-    // vsl 是引用自 var_list和func_var_list的 故不释放
-    // func_var_list 是引用自函数的 故不释放
     freeVarSpaceListCount(activity->new_vs_count, activity->var_list);
-    freeVarSpaceListCount(activity->macro_vs_count, activity->macro_vsl);
 
-    freeAllArgCodeList(activity->acl_start);
-    if (activity->fi != NULL)
-        freeFuncInfo(activity->fi);
-    freeAllLiteralData(activity->ld);
-    if (activity->dl != NULL)
-        freeAllDestructList(activity->dl);
+    if (activity->type == act_gc) {
+        if (activity->dl != NULL)
+            freeAllDestructList(activity->dl);
+    } else {
+        // vsl 是引用自 var_list和func_var_list的 故不释放
+        // func_var_list 是引用自函数的 故不释放
+        freeVarSpaceListCount(activity->macro_vs_count, activity->macro_vsl);
+
+        freeAllArgCodeList(activity->acl_start);
+        if (activity->fi != NULL)
+            freeFuncInfo(activity->fi);
+        freeAllLiteralData(activity->ld);
+    }
+
     free(activity);
     return prev;
 }
@@ -450,11 +473,11 @@ bool addTopActivity(af_Code *code, af_Environment *env) {
     if (env->activity != NULL)
         return false;
 
-    env->activity = makeActivity(NULL, code, false, NULL, NULL, env->core->global, NULL);
+    env->activity = makeFuncActivity(NULL, code, false, NULL, NULL, env->core->global, NULL);
     env->activity->new_vs_count = 2;
     env->activity->var_list = makeVarSpaceList(env->core->global->data->var_space);
     env->activity->var_list->next = makeVarSpaceList(env->core->protect);
-    env->activity->status = act_normal;
+    env->activity->status = act_func_normal;
     return true;
 }
 
@@ -523,16 +546,16 @@ bool changeTopMsgProcess(char *type, DLC_SYMBOL(TopMsgProcessFunc) func,
 }
 
 static void newActivity(af_Code *bt, const af_Code *next, bool return_first, af_Environment *env){
-    if (next == NULL && env->activity->body_next == NULL && !env->activity->is_gc) {
+    if (next == NULL && env->activity->body_next == NULL && env->activity->type == act_func) {
         printf("Tail tone recursive optimization\n");
         clearActivity(env->activity);
         env->activity->bt_top = bt;
         if (!env->activity->return_first)  // 若原本就有设置 return_first 则没有在设置的必要了, 因为该执行不会被返回
             env->activity->return_first = return_first;
     } else {
-        af_Activity *activity = makeActivity(bt, NULL, return_first, env->activity->msg_up,
-                                             env->activity->var_list, env->activity->belong,
-                                             env->activity->func);
+        af_Activity *activity = makeFuncActivity(bt, NULL, return_first, env->activity->msg_up,
+                                                 env->activity->var_list, env->activity->belong,
+                                                 env->activity->func);
         activity->prev = env->activity;
         env->activity = activity;
     }
@@ -551,7 +574,7 @@ bool pushExecutionActivity(af_Code *bt, bool return_first, af_Environment *env)
     env->activity->bt_start = bt->next;
     env->activity->bt_next = bt->next;
 
-    env->activity->status = act_normal;
+    env->activity->status = act_func_normal;
     return true;
 }
 
@@ -619,7 +642,7 @@ bool pushFuncActivity(af_Code *bt, af_Environment *env) {
     env->activity->bt_next = func;
 
     env->activity->call_type = env->activity->bt_top->block.type;
-    env->activity->status = act_func;
+    env->activity->status = act_func_get;
     if (env->activity->call_type == parentheses) { // 对于类前缀调用, 已经获得func的实际值了
         if (parentheses_call == NULL) {
             pushMessageDown(makeMessage("ERROR-STR", 0), env);
@@ -670,7 +693,7 @@ bool pushMacroFuncActivity(af_Object *func, af_Environment *env) {
 
 void pushGCActivity(gc_DestructList *dl, gc_DestructList **pdl, af_Environment *env) {
     for (af_Activity *tmp = env->activity; tmp != NULL; tmp = tmp->prev) {
-        if (tmp->is_gc) {
+        if (tmp->type == act_gc) {
             *(tmp->pdl) = dl;
             tmp->pdl = pdl;
             if (tmp->dl_next == NULL)  // 原dl_next已经运行到末端
@@ -680,16 +703,7 @@ void pushGCActivity(gc_DestructList *dl, gc_DestructList **pdl, af_Environment *
     }
 
     /* gc Activity 可能创建为顶层 activity, 故信息不能继承上一级(可能没有上一级) */
-    af_Activity *activity = makeActivity(NULL, NULL, false, NULL, NULL, env->core->global, NULL);
-
-    activity->var_list = makeVarSpaceList(getProtectVarSpace(env));
-    activity->vsl = activity->var_list;
-    activity->new_vs_count = 1;
-
-    activity->is_gc = true;
-    activity->dl = dl;
-    activity->pdl = pdl;
-    activity->dl_next = dl;
+    af_Activity *activity = makeGcActivity(dl, pdl, env);
 
     activity->prev = env->activity;
     env->activity = activity;
@@ -699,8 +713,8 @@ bool pushDestructActivity(gc_DestructList *dl, af_Environment *env) {
     env->activity->dl_next = dl->next;
 
     /* 隐式调用不设置 bt_top */
-    af_Activity *activity = makeActivity(NULL, NULL, false, env->activity->msg_up,
-                                         env->activity->var_list, env->activity->belong, NULL);
+    af_Activity *activity = makeFuncActivity(NULL, NULL, false, env->activity->msg_up,
+                                             env->activity->var_list, env->activity->belong, NULL);
     activity->prev = env->activity;
     env->activity = activity;
     return setFuncActivityToArg(dl->func, env);
@@ -729,7 +743,7 @@ bool setFuncActivityToArg(af_Object *func, af_Environment *env) {
 
     env->activity->func = func;
     env->activity->belong = getBelongObject(func);
-    env->activity->status = act_arg;
+    env->activity->status = act_func_arg;
 
     /* 遇到错误时 get_acl 和 get_var_list 要自行设定msg */
     if (get_acl != NULL) {
@@ -841,7 +855,7 @@ bool setFuncActivityAddVar(af_Environment *env){
  */
 int setFuncActivityToNormal(af_Environment *env){  // 获取函数的函数体
     af_FuncBody *body = env->activity->body_next;
-    env->activity->status = act_normal;
+    env->activity->status = act_func_normal;
     env->activity->bt_next = NULL;
 
     if (body == NULL)  // 已经没有下一步了 (原msg不释放)
@@ -895,7 +909,7 @@ static void freeMarkByActivity(af_Activity *activity) {
 }
 
 static void freeMark(af_Environment *env) {
-    if (env->activity->func != NULL) {
+    if (env->activity->type == act_func && env->activity->func != NULL) {
         obj_funcFreeMask *func = findAPI("obj_funcFreeMask", env->activity->func->data->api);
         if (func != NULL)
             func(env->activity->mark);
@@ -904,25 +918,27 @@ static void freeMark(af_Environment *env) {
 }
 
 void popActivity(af_Message *msg, af_Environment *env) {
-    if (msg != NULL && env->activity->return_first) {
-        if (EQ_STR(msg->type, "NORMAL")) {
-            gc_delReference(*(af_Object **) msg->msg);
-            freeMessage(msg);
-            msg = NULL;
-        }
-    } else if (env->activity->return_first) {  // msg == NULL
-        if (env->activity->msg_down != NULL && EQ_STR(env->activity->msg_down->type, "NORMAL")) {
-            af_Message *tmp = getFirstMessage(env);
-            gc_delReference(*(af_Object **)(tmp->msg));
-            freeMessage(tmp);
+    if (env->activity->type == act_func) {
+        if (msg != NULL && env->activity->return_first) {
+            if (EQ_STR(msg->type, "NORMAL")) {
+                gc_delReference(*(af_Object **) msg->msg);
+                freeMessage(msg);
+                msg = NULL;
+            }
+        } else if (env->activity->return_first) {  // msg == NULL
+            if (env->activity->msg_down != NULL && EQ_STR(env->activity->msg_down->type, "NORMAL")) {
+                af_Message *tmp = getFirstMessage(env);
+                gc_delReference(*(af_Object **) (tmp->msg));
+                freeMessage(tmp);
+            }
         }
-    }
 
-    if (msg == NULL && env->activity->return_first) {
-        if (env->activity->return_obj == NULL)
-            msg = makeMessage("ERROR-STR", 0);
-        else
-            msg = makeNORMALMessage(env->activity->return_obj);
+        if (msg == NULL && env->activity->return_first) {
+            if (env->activity->return_obj == NULL)
+                msg = makeMessage("ERROR-STR", 0);
+            else
+                msg = makeNORMALMessage(env->activity->return_obj);
+        }
     }
 
     if (msg != NULL)
@@ -930,8 +946,8 @@ void popActivity(af_Message *msg, af_Environment *env) {
 
     freeMark(env);
 
-    if (env->activity->prev == NULL || env->activity->is_gc)  // 顶层或gc层
-        runTopMessageProcess(env->activity->is_gc, env);
+    if (env->activity->prev == NULL || env->activity->type == act_gc)  // 顶层或gc层
+        runTopMessageProcess((env->activity->type == act_gc), env);
     else {
         connectMessage(&(env->activity->msg_down), env->activity->prev->msg_down);
         env->activity->prev->msg_down = env->activity->msg_down;

+ 5 - 1
src/core/gc.c

@@ -270,6 +270,11 @@ static pgc_Analyzed reachable(af_Activity *activity, pgc_Analyzed plist) {
         if (activity->belong != NULL)
             plist = reachableObject(activity->belong, plist);
 
+        plist = reachableVarSpaceList(activity->var_list, plist);
+
+        if (activity->type == act_gc)  // gc不执行接下来的检查
+            continue;
+
         if (activity->func != NULL)
             plist = reachableObject(activity->func, plist);
 
@@ -279,7 +284,6 @@ static pgc_Analyzed reachable(af_Activity *activity, pgc_Analyzed plist) {
         if (activity->parentheses_call != NULL)
             plist = reachableObject(activity->parentheses_call, plist);
 
-        plist = reachableVarSpaceList(activity->var_list, plist);
         plist = reachableVarSpaceList(activity->func_var_list, plist);
         plist = reachableVarSpaceList(activity->macro_vsl, plist);
     }

+ 7 - 7
src/core/run.c

@@ -136,7 +136,7 @@ static bool codeVariable(af_Code *code, af_Environment *env) {
     if (code->prefix != getPrefix(V_QUOTE, env)) {
         if ((is_obj = findAPI("obj_isObjFunc", obj->data->api)) != NULL && is_obj(obj))
             return pushVariableActivity(code, var->vn->obj, env);  // 对象函数
-        else if (env->activity->status != act_func && // 在act_func模式时关闭保护
+        else if (env->activity->status != act_func_get && // 在act_func模式时关闭保护
                  (is_infix = findAPI("obj_isInfixFunc", obj->data->api)) != NULL && is_infix(obj)) {
             pushMessageDown(makeMessage("ERROR-STR", 0), env);
             printf("Infix protect : %s\n", code->variable.name);
@@ -193,7 +193,7 @@ static bool codeBlock(af_Code *code, af_Environment *env) {
  * 仅在act_arg模式下, 允许运行变量空间设置为函数变量空间 (参数计算)
  */
 static void setRunVarSpaceList(af_Environment *env) {
-    if (env->activity->status == act_arg && env->activity->run_in_func && env->activity->func_var_list != NULL)
+    if (env->activity->status == act_func_arg && env->activity->run_in_func && env->activity->func_var_list != NULL)
         env->activity->vsl = env->activity->func_var_list;
     else
         env->activity->vsl = env->activity->var_list;
@@ -247,7 +247,7 @@ static int checkMsg(af_Message *msg, af_Environment *env) {
         return 1;  // 正常
 
     pushMessageDown(msg, env);  // msg不弹出
-    if (env->activity->status != act_normal || !checkInMsgType(msg->type, env)) {  // 非normal模式, 或normal模式下msg_type不匹配该msg
+    if (env->activity->status != act_func_normal || !checkInMsgType(msg->type, env)) {  // 非normal模式, 或normal模式下msg_type不匹配该msg
         env->activity->return_first = false;
         env->activity->return_obj = NULL;
         return 0;
@@ -353,13 +353,13 @@ static bool checkGetArgEnd(af_Message *msg, af_Environment *env) {
  */
 static void processMsg(af_Message *msg, bool run_code, af_Environment *env) {
     switch (env->activity->status) {
-        case act_normal:
+        case act_func_normal:
             if (!run_code)
                 popActivity(makeMessage("ERROR-STR", 0), env);
             else if (checkNormalEnd(msg, env))
                 popActivity(NULL, env);
             break;
-        case act_func:
+        case act_func_get:
             if (!run_code)
                 popActivity(makeMessage("ERROR-STR", 0), env);
             else {
@@ -370,7 +370,7 @@ static void processMsg(af_Message *msg, bool run_code, af_Environment *env) {
                     popActivity(NULL, env);
             }
             break;
-        case act_arg: {
+        case act_func_arg: {
             if (!run_code || checkGetArgEnd(msg, env)) {  // 无参数设定或参数设定完成
                 if (!setFuncActivityAddVar(env))
                     popActivity(NULL, env);
@@ -395,7 +395,7 @@ bool iterCode(af_Code *code, af_Environment *env) {
         bool run_code = false;
         checkRunGC(env);
 
-        if (env->activity->is_gc) {  // gc 模式
+        if (env->activity->type == act_gc) {  // gc 模式
             if (env->activity->dl_next == NULL)
                 popActivity(NULL, env);  // 结束运行
             else {