Sfoglia il codice sorgente

refactor: 调整了Mark的释放时机

SongZihuan 3 anni fa
parent
commit
e18708a3ae
3 ha cambiato i file con 27 aggiunte e 29 eliminazioni
  1. 1 1
      src/core/__env.h
  2. 16 18
      src/core/env.c
  3. 10 10
      src/core/run.c

+ 1 - 1
src/core/__env.h

@@ -155,7 +155,7 @@ bool addTopActivity(af_Code *code, af_Environment *env);
 /* 运行时Activity设置函数 (新增Activity) */
 bool pushExecutionActivity(af_Code *bt, bool return_first, af_Environment *env);
 bool pushFuncActivity(af_Code *bt, af_Environment *env);
-void popActivity(af_Message *msg, af_Environment *env);
+void popActivity(bool is_normal, af_Message *msg, af_Environment *env);
 
 /* 运行时Activity设置函数 (设置Activity) */
 bool pushDestructActivity(gc_DestructList *dl, af_Environment *env);

+ 16 - 18
src/core/env.c

@@ -19,7 +19,6 @@ static void clearActivity(af_Activity *activity);
 /* Activity 相关处理函数 */
 static void freeMark(af_Environment *env);
 static void newActivity(af_Code *bt, const af_Code *next, bool return_first, af_Environment *env);
-static void freeMarkByActivity(af_Activity *activity);
 
 /* 环境变量 创建与释放 */
 static af_EnvVar *makeEnvVar(char *name, char *data);
@@ -187,7 +186,6 @@ static void freeAllActivity(af_Activity *activity) {
 }
 
 static void clearActivity(af_Activity *activity) {
-    freeMarkByActivity(activity);
     freeVarSpaceListCount(activity->macro_vs_count, activity->macro_vsl);
     freeAllArgCodeList(activity->acl_start);
     if (activity->fi != NULL)
@@ -646,7 +644,7 @@ bool pushMacroFuncActivity(af_Object *func, af_Environment *env) {
     env->activity->new_vs_count = env->activity->macro_vs_count;
     env->activity->macro_vs_count = 0;
 
-    clearActivity(env->activity); /* 隐式调用不设置 bt_top */
+    clearActivity(env->activity);  /* 隐式调用不设置 bt_top */
     return setFuncActivityToArg(func, env);
 }
 
@@ -813,6 +811,7 @@ bool setFuncActivityAddVar(af_Environment *env){
  * 返回  (2) 表示遇到未被替换的动态代码块
  */
 int setFuncActivityToNormal(af_Environment *env){  // 获取函数的函数体
+    int re;
     af_FuncBody *body = env->activity->body_next;
     env->activity->status = act_func_normal;
     env->activity->bt_next = NULL;
@@ -828,18 +827,25 @@ int setFuncActivityToNormal(af_Environment *env){  // 获取函数的函数体
             env->activity->process_msg_first++;  // 处理C函数通过msg_down返回的结果
             pushDynamicFuncBody(new, body);
             env->activity->body_next = body->next;  // 添加新元素后要重新设定body_next的位置
-            return -1;
+            re = -1;
+            break;
         }
         case func_body_code:
             env->activity->bt_start = body->code;
             env->activity->bt_next = body->code;
-            return 1;
+            re = 1;
+            break;
         default:
         case func_body_dynamic:
             pushMessageDown(makeMessage("ERROR-STR", 0), env);
             env->activity->process_msg_first++;  // 处理C函数通过msg_down返回的结果
-            return 2;
+            re = 2;
+            break;
     }
+
+    if (env->activity->body_next == NULL)  // 最后一个aFunBody
+        freeMark(env);
+    return re;
 }
 
 /*
@@ -858,17 +864,8 @@ void runTopMessageProcess(bool is_gc, af_Environment *env) {
     }
 }
 
-static void freeMarkByActivity(af_Activity *activity) {
-    if (activity->func != NULL) {
-        obj_funcFreeMask *func = findAPI("obj_funcFreeMask", activity->func->data->api);
-        if (func != NULL)
-            func(activity->mark);
-        activity->mark = NULL;
-    }
-}
-
 static void freeMark(af_Environment *env) {
-    if (env->activity->type == act_func && env->activity->func != NULL) {
+    if (env->activity->type == act_func && env->activity->func != NULL && env->activity->mark != NULL) {
         obj_funcFreeMask *func = findAPI("obj_funcFreeMask", env->activity->func->data->api);
         if (func != NULL)
             func(env->activity->mark);
@@ -876,7 +873,7 @@ static void freeMark(af_Environment *env) {
     }
 }
 
-void popActivity(af_Message *msg, af_Environment *env) {
+void popActivity(bool is_normal, af_Message *msg, af_Environment *env) {
     if (env->activity->type == act_func) {
         if (msg != NULL && env->activity->return_first) {
             if (EQ_STR(msg->type, "NORMAL")) {
@@ -903,7 +900,8 @@ void popActivity(af_Message *msg, af_Environment *env) {
     if (msg != NULL)
         pushMessageDown(msg, env);
 
-    freeMark(env);
+    if (!is_normal)
+        freeMark(env);  // 遇到非正常退出时, 释放`mark`
 
     if (env->activity->prev == NULL || env->activity->type == act_gc)  // 顶层或gc层
         runTopMessageProcess((env->activity->type == act_gc), env);

+ 10 - 10
src/core/run.c

@@ -287,14 +287,14 @@ static bool runCode(af_Message **msg, bool *run_code, af_Environment *env) {
     (*msg) = getTopMsg(env);
 
     switch (checkMsg((*msg), env)) {
-        case 0:
+        case 0:  // 不可处理的信号
             *msg = NULL;
-            popActivity(NULL, env);  // 跳出当前activity
+            popActivity(false, NULL, env);  // 跳出当前activity
             return true;
-        case -1:
+        case -1:  // 非正常但可处理 [已经放回]
             (*msg) = NULL;
             break;
-        case 1:
+        case 1:  // 正常信号
             if (env->activity->return_first && env->activity->return_obj == NULL)  // 设置return_first
                 env->activity->return_obj = *(af_Object **)(*msg)->msg;
             break;
@@ -355,25 +355,25 @@ static void processMsg(af_Message *msg, bool run_code, af_Environment *env) {
     switch (env->activity->status) {
         case act_func_normal:
             if (!run_code)
-                popActivity(makeMessage("ERROR-STR", 0), env);
+                popActivity(false, makeMessage("ERROR-STR", 0), env);
             else if (checkNormalEnd(msg, env))
-                popActivity(NULL, env);
+                popActivity(true, NULL, env);  // 正常退出
             break;
         case act_func_get:
             if (!run_code)
-                popActivity(makeMessage("ERROR-STR", 0), env);
+                popActivity(false, makeMessage("ERROR-STR", 0), env);
             else {
                 af_Object *func = *(af_Object **)(msg->msg);  // func仍保留了msg的gc计数
                 gc_delReference(func);  // 释放计数
                 freeMessage(msg);
                 if (!setFuncActivityToArg(func, env))
-                    popActivity(NULL, env);
+                    popActivity(false, NULL, env);
             }
             break;
         case act_func_arg: {
             if (!run_code || checkGetArgEnd(msg, env)) {  // 无参数设定或参数设定完成
                 if (!setFuncActivityAddVar(env))
-                    popActivity(NULL, env);
+                    popActivity(false, NULL, env);
             }
             break;
         }
@@ -397,7 +397,7 @@ bool iterCode(af_Code *code, af_Environment *env) {
 
         if (env->activity->type == act_gc) {  // gc 模式
             if (env->activity->dl_next == NULL)
-                popActivity(NULL, env);  // 结束运行
+                popActivity(true, NULL, env);  // 结束运行
             else {
                 printf("env->activity->dl_next.obj = %p, %d\n", env->activity->dl_next->obj->data, env->activity->dl_next->obj->data->gc.done_destruct);
                 pushDestructActivity(env->activity->dl_next, env);