Prechádzať zdrojové kódy

feat: 调整setFuncActivityAddVar中VarList的释放

SongZihuan 3 rokov pred
rodič
commit
efdb5160e2
2 zmenil súbory, kde vykonal 14 pridanie a 13 odobranie
  1. 2 2
      src/core/__env.h
  2. 12 11
      src/core/env.c

+ 2 - 2
src/core/__env.h

@@ -132,7 +132,7 @@ struct af_Activity {  // 活动记录器
 
             /* 函数调用: 宏函数*/
             bool is_macro_call;  // 宏函数隐式调用
-            struct af_VarSpaceListNode *macro_vsl;  // 宏函数执行的vsl
+            struct af_VarSpaceListNode *macro_vsl;  // 宏函数执行的vsl (即调用函数时的外部VarLis)
             ActivityCount macro_vs_count;
 
             /* 函数调用: 析构函数 在错误回溯时使用, 是个标记*/
@@ -154,7 +154,7 @@ struct af_Activity {  // 活动记录器
             /* Import使用 */
             char *import_mark;
 
-            af_ActivityTrackBack *tb;
+            struct af_ActivityTrackBack *tb;
         };
     };
 };

+ 12 - 11
src/core/env.c

@@ -1070,22 +1070,23 @@ bool setFuncActivityAddVar(af_Environment *env){
     if (fi->is_macro) {  // 是宏函数则保存变量空间
         env->activity->macro_vsl = env->activity->var_list;
         env->activity->macro_vs_count = env->activity->new_vs_count;
-    } else if (fi->scope != inline_scope) {  // 非内联函数, 释放外部变量空间
-        if (!freeVarSpaceListCount(env->activity->new_vs_count, env->activity->var_list)) {
+        env->activity->new_vs_count = 0;
+    }
+
+    if (fi->scope != inline_scope) {  // 非内联函数, 释放外部变量空间
+        if (env->activity->new_vs_count != 0 && !freeVarSpaceListCount(env->activity->new_vs_count, env->activity->var_list)) {
             pushMessageDown(makeERRORMessage(RUN_ERROR, FREE_VARSPACE_INFO, env), env);  // 释放失败
             return false;
         }
-    }
 
-    if (fi->scope == normal_scope) {  // 使用函数变量空间
-        env->activity->var_list = env->activity->func_var_list;
-        env->activity->new_vs_count = 0;
-    } else if (fi->scope == pure_scope) {  // 纯函数只有 protect 变量空间
-        env->activity->var_list = makeVarSpaceList(env->core->protect);
-        env->activity->new_vs_count = 0;
-    } else if (fi->scope == super_pure_scope) {  // 超纯函数没有变量空间, 因此不得为超内嵌函数(否则var_list就为NULL了)
-        env->activity->var_list = NULL;
         env->activity->new_vs_count = 0;
+        if (fi->scope == normal_scope)  // 使用函数变量空间
+            env->activity->var_list = env->activity->func_var_list;
+        else if (fi->scope == pure_scope) {  // 纯函数只有 protect 变量空间
+            env->activity->var_list = makeVarSpaceList(env->core->protect);
+            env->activity->new_vs_count = 1;
+        } else if (fi->scope == super_pure_scope)  // 超纯函数没有变量空间, 因此不得为超内嵌函数(否则var_list就为NULL了)
+            env->activity->var_list = NULL;
     }
 
     if (fi->embedded != super_embedded) {  // 不是超内嵌函数则引入一层新的变量空间