1
0
Эх сурвалжийг харах

fix: 修复msg在activity中没有释放的问题

SongZihuan 3 жил өмнө
parent
commit
ea29938bd5

+ 3 - 2
include/env.h

@@ -1,5 +1,5 @@
-#ifndef AFUN__ENV_H_PUBLIV
-#define AFUN__ENV_H_PUBLIV
+#ifndef AFUN__ENV_H_PUBLIC
+#define AFUN__ENV_H_PUBLIC
 
 
 typedef struct af_Environment af_Environment;
 typedef struct af_Environment af_Environment;
 typedef struct af_Message af_Message;
 typedef struct af_Message af_Message;
@@ -19,6 +19,7 @@ void popActivity(af_Environment *env);
 
 
 af_Message *makeMessage(char *type, size_t size);
 af_Message *makeMessage(char *type, size_t size);
 af_Message *freeMessage(af_Message *msg);
 af_Message *freeMessage(af_Message *msg);
+void freeAllMessage(af_Message *msg);
 void pushMessageUp(af_Message *msg, af_Environment *env);
 void pushMessageUp(af_Message *msg, af_Environment *env);
 void pushMessageDown(af_Message *msg, af_Environment *env);
 void pushMessageDown(af_Message *msg, af_Environment *env);
 af_Message *popMessageUp(char *type, af_Environment *env);
 af_Message *popMessageUp(char *type, af_Environment *env);

+ 1 - 0
src/core/__env.h

@@ -50,6 +50,7 @@ struct af_Activity {  // 活动记录器
     ActivityCount new_vs_count;  // 需要释放的空间数
     ActivityCount new_vs_count;  // 需要释放的空间数
 
 
     struct af_Object *belong;  // 属对象
     struct af_Object *belong;  // 属对象
+    bool is_top;  // 最顶层
 };
 };
 
 
 struct af_Environment {  // 运行环境
 struct af_Environment {  // 运行环境

+ 5 - 0
src/core/env.c

@@ -130,11 +130,15 @@ static af_Activity *makeActivity(af_ByteCode *bt, bool new_vs, af_VarSpaceListNo
 static af_Activity *freeActivity(af_Activity *activity) {
 static af_Activity *freeActivity(af_Activity *activity) {
     af_Activity *prev = activity->prev;
     af_Activity *prev = activity->prev;
     af_VarSpaceListNode *vs = activity->var_list;
     af_VarSpaceListNode *vs = activity->var_list;
+
     for (int i = activity->new_vs_count; i > 0; i--) {
     for (int i = activity->new_vs_count; i > 0; i--) {
         if (vs == NULL)  // 发生了错误
         if (vs == NULL)  // 发生了错误
             break;
             break;
         vs = popLastVarList(vs);
         vs = popLastVarList(vs);
     }
     }
+
+    freeAllMessage(activity->msg_up);  // msg转移后需要将对应成员设置为NULL
+    freeAllMessage(activity->msg_down);
     free(activity);
     free(activity);
     return prev;
     return prev;
 }
 }
@@ -211,6 +215,7 @@ bool enableEnvironment(af_ByteCode *bt, af_Environment *env) {
     env->activity->new_vs_count = 2;
     env->activity->new_vs_count = 2;
     env->activity->var_list = makeVarSpaceList(env->core->global->data->var_space);
     env->activity->var_list = makeVarSpaceList(env->core->global->data->var_space);
     env->activity->var_list->next = makeVarSpaceList(env->core->protect);
     env->activity->var_list->next = makeVarSpaceList(env->core->protect);
+    env->activity->is_top = true;  // 设置为最顶层
     return true;
     return true;
 }
 }