Sfoglia il codice sorgente

refactor: 封装makeVarList

SongZihuan 3 anni fa
parent
commit
09d19c8e24

+ 1 - 1
include/core/README

@@ -151,7 +151,7 @@ run
 var
 af_Var 描述一个变量
 af_VarSpace 描述一个变量空间
-af_VarSpaceListNode 描述变量空间链
+af_VarList 描述变量空间链
 
 创建与释放:
 * makeVar

+ 1 - 1
include/core/env.h

@@ -116,7 +116,7 @@ AFUN_CORE_EXPORT af_Object *getGlobal(af_Environment *env);
 AFUN_CORE_EXPORT af_Object *getBelong(af_Environment *env);
 AFUN_CORE_EXPORT FilePath getActivityFile(af_Environment *env);
 AFUN_CORE_EXPORT FileLine getActivityLine(af_Environment *env);
-AFUN_CORE_EXPORT af_VarSpaceListNode *getRunVarSpaceList(af_Environment *env);
+AFUN_CORE_EXPORT af_VarList *getRunVarSpaceList(af_Environment *env);
 AFUN_CORE_EXPORT int isCoreExit(af_Environment *env);
 AFUN_CORE_EXPORT bool getErrorStd(af_Environment *env);
 AFUN_CORE_EXPORT int32_t getCoreExitCode(af_Environment *env);

+ 1 - 1
include/core/func.h

@@ -29,7 +29,7 @@ struct af_CallFuncInfo {
 
     af_Object *belong;
     af_Object *func;
-    struct af_VarSpaceListNode *var_list;
+    struct af_VarList *var_list;
 
     enum af_BlockType call_type;
     bool is_gc_call;

+ 2 - 2
include/core/gc.h

@@ -23,7 +23,7 @@ enum af_GcListType {
                                af_Object *: gc_delObjectReference, \
                                af_Var *: gc_delVarReference, \
                                af_VarSpace *: gc_delVarSpaceReference, \
-                               af_VarSpaceListNode *: gc_delVarListReference))((obj), (env)))
+                               af_VarList *: gc_delVarListReference))((obj), (env)))
 
 /* GcList 创建与释放 */
 AFUN_CORE_EXPORT af_GcList *makeGcList(enum af_GcListType type, void *data);
@@ -39,5 +39,5 @@ AFUN_CORE_EXPORT void gc_addVarSpaceReference(af_VarSpace *obj, af_Environment *
 AFUN_CORE_EXPORT void gc_delObjectReference(af_Object *obj, af_Environment *base);
 AFUN_CORE_EXPORT void gc_delVarReference(af_Var *obj, af_Environment *base);
 AFUN_CORE_EXPORT void gc_delVarSpaceReference(af_VarSpace *obj, af_Environment *base);
-AFUN_CORE_EXPORT void gc_delVarListReference(af_VarSpaceListNode *vsl, af_Environment *base);
+AFUN_CORE_EXPORT void gc_delVarListReference(af_VarList *vsl, af_Environment *base);
 #endif //AFUN_GC

+ 1 - 1
include/core/info/obj_api.h

@@ -51,7 +51,7 @@ typedef af_VarSpace *obj_getShareVarSpace(BASE_ARG);
 /* 获取参数计算表 */
 typedef bool obj_funcGetArgCodeList(BASE_ARG, af_ArgCodeList **acl, af_Code *code, void **mark, af_Environment *env);
 /* 获取函数变量空间 */
-typedef bool obj_funcGetVarList(BASE_ARG, af_VarSpaceListNode **vsl, void *mark, af_Environment *env);
+typedef bool obj_funcGetVarList(BASE_ARG, af_VarList **vsl, void *mark, af_Environment *env);
 /* 获取参数赋值表 */
 typedef bool obj_funcGetArgList(BASE_ARG, af_ArgList **al, af_ArgCodeList *acl, void *mark, af_Environment *env);
 /* 获取函数信息 */

+ 14 - 12
include/core/var.h

@@ -3,7 +3,7 @@
 
 typedef struct af_Var af_Var;
 typedef struct af_VarSpace af_VarSpace;
-typedef struct af_VarSpaceListNode af_VarSpaceListNode;
+typedef struct af_VarList af_VarList;
 
 #include "aFunCoreExport.h"
 #include "tool.h"
@@ -16,10 +16,10 @@ AFUN_CORE_EXPORT af_Var *makeVar(char *name, char p_self, char p_posterity, char
 AFUN_CORE_EXPORT af_VarSpace *makeVarSpace(af_Object *belong, char p_self, char p_posterity, char p_external, af_Environment *env);
 
 /* 变量空间链 创建与释放 */
-AFUN_CORE_EXPORT af_VarSpaceListNode *makeVarSpaceList(af_VarSpace *vs);
-AFUN_CORE_EXPORT af_VarSpaceListNode *copyVarSpaceList(af_VarSpaceListNode *vsl);
-AFUN_CORE_EXPORT void freeAllVarSpaceList(af_VarSpaceListNode *vsl);
-AFUN_CORE_EXPORT bool freeVarSpaceListCount(size_t count, af_VarSpaceListNode *vsl);
+AFUN_CORE_EXPORT af_VarList *makeVarSpaceList(af_VarSpace *vs);
+AFUN_CORE_EXPORT af_VarList *copyVarSpaceList(af_VarList *vsl);
+AFUN_CORE_EXPORT void freeAllVarSpaceList(af_VarList *vsl);
+AFUN_CORE_EXPORT bool freeVarSpaceListCount(size_t count, af_VarList *vsl);
 
 /* 变量 相关操作 */
 AFUN_CORE_EXPORT void addVarNode(af_Var *var, af_Object *obj, char *id);
@@ -35,16 +35,18 @@ AFUN_CORE_EXPORT void setVarSpacePermissions(af_Object *visitor, af_VarSpace *vs
 AFUN_CORE_EXPORT bool setVarSpaceProtect(af_Object *visitor, af_VarSpace *vs, bool protect);
 
 /* 变量空间链 相关操作 */
-AFUN_CORE_EXPORT bool addVarToVarSpaceList(af_Var *var, af_Object *visitor, af_VarSpaceListNode *vsl,
+AFUN_CORE_EXPORT bool addVarToVarSpaceList(af_Var *var, af_Object *visitor, af_VarList *vsl,
                                            af_Environment *env);
 AFUN_CORE_EXPORT bool makeVarToVarSpaceList(char *name, char p_self, char p_posterity, char p_external, af_Object *obj,
-                                            af_VarSpaceListNode *vsl, af_Object *visitor, af_Environment *env);
+                                            af_VarList *vsl, af_Object *visitor, af_Environment *env);
 AFUN_CORE_EXPORT bool makeVarToProtectVarSpace(char *name, char p_self, char p_posterity, char p_external, af_Object *obj,
                                                af_Environment *env);
 AFUN_CORE_EXPORT bool addVarToProtectVarSpace(af_Var *var, af_Environment *env);
-AFUN_CORE_EXPORT bool delVarFromVarList(char *name, af_Object *visitor, af_VarSpaceListNode *vsl);
-AFUN_CORE_EXPORT bool setVarToVarList(char *name, af_Object *obj, af_Object *visitor, af_VarSpaceListNode *vsl);
-AFUN_CORE_EXPORT af_VarSpaceListNode *pushNewVarList(af_Object *belong, af_VarSpaceListNode *base, af_Environment *env);
+AFUN_CORE_EXPORT bool delVarFromVarList(char *name, af_Object *visitor, af_VarList *vsl);
+AFUN_CORE_EXPORT bool setVarToVarList(char *name, af_Object *obj, af_Object *visitor, af_VarList *vsl);
+AFUN_CORE_EXPORT af_VarList *pushNewVarList(af_Object *belong, af_VarList *base, af_Environment *env);
+AFUN_CORE_EXPORT af_VarList *pushProtectVarList(af_VarList *base, af_Environment *env);
+AFUN_CORE_EXPORT af_VarList *pushVarList(af_VarSpace *vs, af_VarList *base);
 
 /* 变量 属性访问 */
 AFUN_CORE_EXPORT af_Object *findVarNode(af_Var *var, char *id, af_Environment *env);
@@ -54,7 +56,7 @@ AFUN_CORE_EXPORT af_Var *findVarFromVarSpace(char *name, af_Object *visitor, af_
 AFUN_CORE_EXPORT bool isProtectVarSpace(af_VarSpace *vs);
 
 /* 变量空间链 属性访问 */
-AFUN_CORE_EXPORT af_Var *findVarFromVarList(char *name, af_Object *visitor, af_VarSpaceListNode *vsl);
-AFUN_CORE_EXPORT af_VarSpace *getVarSpaceFromList(af_VarSpaceListNode *vsl);
+AFUN_CORE_EXPORT af_Var *findVarFromVarList(char *name, af_Object *visitor, af_VarList *vsl);
+AFUN_CORE_EXPORT af_VarSpace *getVarSpaceFromList(af_VarList *vsl);
 
 #endif //AFUN_VAR

+ 4 - 4
src/core/__env.h

@@ -63,7 +63,7 @@ struct af_Activity {  // 活动记录器
     struct af_Message *msg_up;  // 调用者向被调用者传递信息
     ActivityCount msg_up_count;  // msg_up 添加的个数
 
-    struct af_VarSpaceListNode *run_varlist;  // 主变量空间
+    struct af_VarList *run_varlist;  // 主变量空间
     ActivityCount count_run_varlist;  // 需要释放的空间数
 
     FilePath file;
@@ -88,10 +88,10 @@ struct af_Activity {  // 活动记录器
             struct af_Object *func;  // 函数本身
 
             bool run_in_func;  // 在函数变量空间内运行 (act_arg用)
-            struct af_VarSpaceListNode *out_varlist;  // 变量空间
+            struct af_VarList *out_varlist;  // 变量空间
             ActivityCount count_out_varlist;  // 需要释放的空间数
 
-            struct af_VarSpaceListNode *func_varlist;  // 函数内部变量空间 (运行函数体时会设置为 主变量空间)
+            struct af_VarList *func_varlist;  // 函数内部变量空间 (运行函数体时会设置为 主变量空间)
 
             struct af_Code *bt_top;  // 最顶层设置为NULL, 函数调用设置为block, (bt_start的上一个元素) [只在函数调用的非NORMAL期有用]
             struct af_Code *bt_start;  // 代码的起始位置 (block的第一个元素)
@@ -114,7 +114,7 @@ struct af_Activity {  // 活动记录器
 
             /* 函数调用: 宏函数*/
             bool is_macro_call;  // 宏函数隐式调用
-            struct af_VarSpaceListNode *macro_varlist;  // 宏函数执行的vsl (即调用函数时的外部VarLis)
+            struct af_VarList *macro_varlist;  // 宏函数执行的vsl (即调用函数时的外部VarLis)
             ActivityCount count_macro_varlist;  // 需要释放的空间数
 
             /* 函数调用: 析构函数 在错误回溯时使用, 是个标记*/

+ 1 - 1
src/core/__func.h

@@ -61,6 +61,6 @@ struct af_FuncInfo {
 AFUN_CORE_NO_EXPORT bool pushDynamicFuncBody(af_FuncBody *new, af_FuncBody *body);
 
 /* ArgList 相关操作 */
-AFUN_CORE_NO_EXPORT bool runArgList(af_ArgList *al, af_VarSpaceListNode *vsl, af_Environment *env);
+AFUN_CORE_NO_EXPORT bool runArgList(af_ArgList *al, af_VarList *vsl, af_Environment *env);
 
 #endif //AFUN_FUNC_H_

+ 2 - 2
src/core/__gc.h

@@ -55,7 +55,7 @@ struct af_GcList {
         struct af_Object *obj;
         struct af_VarSpace *vs;
         struct af_Var *var;
-        struct af_VarSpaceListNode *vsl;
+        struct af_VarList *vsl;
     };
 
     struct af_GcList *next;
@@ -88,7 +88,7 @@ struct gc_Factory {
                                af_Object *: gc_delObjectReference, \
                                af_Var *: gc_delVarReference, \
                                af_VarSpace *: gc_delVarSpaceReference, \
-                               af_VarSpaceListNode *: gc_delVarListReference))((obj), (env)))
+                               af_VarList *: gc_delVarListReference))((obj), (env)))
 
 /* gc_Factory 创建与释放 */
 AFUN_CORE_NO_EXPORT gc_Factory *makegGcFactory(void);

+ 2 - 2
src/core/__var.h

@@ -42,9 +42,9 @@ struct af_VarSpace {
     GC_VarSpace gc;  // 仅能由 gc 机制访问
 };
 
-struct af_VarSpaceListNode {  // 变量链
+struct af_VarList {  // 变量链
     struct af_VarSpace *vs;
-    struct af_VarSpaceListNode *next;
+    struct af_VarList *next;
 };
 
 

+ 12 - 12
src/core/env.c

@@ -6,9 +6,9 @@
 #include "obj_api.h"
 
 /* Activity 创建和释放 */
-static af_Activity *makeActivity(af_Message *msg_up, af_VarSpaceListNode *varlist, af_Object *belong, af_Environment *env);
+static af_Activity *makeActivity(af_Message *msg_up, af_VarList *varlist, af_Object *belong, af_Environment *env);
 static af_Activity *makeFuncActivity(af_Code *bt_top, af_Code *bt_start, bool return_first, af_Message *msg_up,
-                                     af_VarSpaceListNode *out_varlist, af_Object *belong, af_Object *func,
+                                     af_VarList *out_varlist, af_Object *belong, af_Object *func,
                                      af_Environment *env);
 static af_Activity *
 makeTopActivity(af_Code *bt_top, af_Code *bt_start, af_VarSpace *protect, af_Object *belong, af_Environment *env);
@@ -203,7 +203,7 @@ void setCoreNormal(af_Environment *env) {
     pthread_rwlock_unlock(&env->esv->lock);
 }
 
-static af_Activity *makeActivity(af_Message *msg_up, af_VarSpaceListNode *varlist, af_Object *belong,
+static af_Activity *makeActivity(af_Message *msg_up, af_VarList *varlist, af_Object *belong,
                                  af_Environment *env){
     af_Activity *activity = calloc(1, sizeof(af_Activity));
     activity->msg_up = msg_up;
@@ -217,7 +217,7 @@ static af_Activity *makeActivity(af_Message *msg_up, af_VarSpaceListNode *varlis
 }
 
 static af_Activity *makeFuncActivity(af_Code *bt_top, af_Code *bt_start, bool return_first, af_Message *msg_up,
-                                     af_VarSpaceListNode *out_varlist, af_Object *belong, af_Object *func,
+                                     af_VarList *out_varlist, af_Object *belong, af_Object *func,
                                      af_Environment *env){
     af_Activity *activity = makeActivity(msg_up, out_varlist, belong, env);
 
@@ -243,8 +243,8 @@ static af_Activity *makeTopActivity(af_Code *bt_top, af_Code *bt_start, af_VarSp
     activity->status = act_func_normal;
 
     activity->count_run_varlist = 2;
-    activity->run_varlist = makeVarSpaceList(getObjectVarSpace(belong));
-    activity->run_varlist->next = makeVarSpaceList(protect);
+    activity->run_varlist = pushVarList(protect, NULL);
+    activity->run_varlist = pushVarList(getObjectVarSpace(belong), activity->run_varlist);
 
     setActivityBtTop(NULL, activity);  // top-activity直接就在normal, bt_top将不被设定
     setActivityBtStart(bt_start, activity);
@@ -265,7 +265,7 @@ static af_Activity *makeGuardianActivity(af_GuardianList *gl, af_GuardianList **
     af_Activity *activity = makeActivity(NULL, NULL, env->global, env);
     activity->type = act_guardian;
 
-    activity->run_varlist = makeVarSpaceList(getProtectVarSpace(env));
+    activity->run_varlist = pushProtectVarList(NULL, env);
     activity->count_run_varlist = 1;
 
     activity->file = strCopy("guardian.aun.sys");
@@ -1344,12 +1344,12 @@ bool pushVariableActivity(af_Code *bt, af_Object *func, af_Environment *env) {
 bool pushMacroFuncActivity(af_Object *func, af_Environment *env) {
     /* Macro是隐式调用, bt不移动 */
     /* 沿用activity */
-    af_VarSpaceListNode *macro_varlist = env->activity->macro_varlist;
+    af_VarList *macro_varlist = env->activity->macro_varlist;
     ActivityCount count = env->activity->count_macro_varlist;
     env->activity->count_macro_varlist = 0;
 
     pthread_mutex_lock(env->activity->gc_lock);
-    af_VarSpaceListNode *tmp = env->activity->run_varlist;
+    af_VarList *tmp = env->activity->run_varlist;
     env->activity->run_varlist = NULL;
     pthread_mutex_unlock(env->activity->gc_lock);
 
@@ -1433,7 +1433,7 @@ bool setFuncActivityToArg(af_Object *func, af_Environment *env) {
     af_ObjectAPI *api = getObjectAPI(func);
     obj_funcGetArgCodeList *get_acl = findAPI("obj_funcGetArgCodeList", api);
     obj_funcGetVarList *get_var_list = findAPI("obj_funcGetVarList", api);
-    af_VarSpaceListNode *func_varlist = NULL;
+    af_VarList *func_varlist = NULL;
     af_Object *belong = getBelongObject(func);
 
     if (get_var_list == NULL) {
@@ -1503,7 +1503,7 @@ bool setFuncActivityAddVar(af_Environment *env){
         env->activity->run_varlist = env->activity->func_varlist;
     } else if (fi->scope == pure_scope) {  // 纯函数只有 protect 变量空间
         env->activity->count_run_varlist = 1;
-        env->activity->run_varlist = makeVarSpaceList(env->protect);
+        env->activity->run_varlist = pushProtectVarList(NULL, env);
     } else if (fi->scope == super_pure_scope) {  // 超纯函数没有变量空间, 因此不得为超内嵌函数(否则var_list就为NULL了)
         env->activity->count_run_varlist = 0;
         env->activity->run_varlist = NULL;
@@ -2252,7 +2252,7 @@ af_Object *getImportObject(af_ImportInfo *ii, af_Environment *env){
     return obj;
 }
 
-af_VarSpaceListNode *getRunVarSpaceList(af_Environment *env) {
+af_VarList *getRunVarSpaceList(af_Environment *env) {
     return env->activity->run_varlist;
 }
 

+ 1 - 1
src/core/func.c

@@ -96,7 +96,7 @@ af_ArgList *makeArgListFromArgCodeList(char *name, af_ArgCodeList *acl, af_Envir
     return al;
 }
 
-bool runArgList(af_ArgList *al, af_VarSpaceListNode *vsl, af_Environment *env){
+bool runArgList(af_ArgList *al, af_VarList *vsl, af_Environment *env){
     for (NULL; al != NULL; al = al->next) {
         if (!makeVarToVarSpaceList(al->name, 3, 3, 3, al->obj, vsl,
                                    env->activity->belong, env))

+ 3 - 3
src/core/gc.c

@@ -169,7 +169,7 @@ void gc_delVarSpaceReference(af_VarSpace *vs, af_Environment *base) {
     pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 
-void gc_delVarListReference(af_VarSpaceListNode *vsl, af_Environment *base) {
+void gc_delVarListReference(af_VarList *vsl, af_Environment *base) {
     gc_delVarSpaceReference(vsl->vs, base);
 }
 
@@ -251,7 +251,7 @@ static void freeAllAnalyzed(gc_Analyzed *base) {
 /* 可达性分析函数 */
 static pgc_Analyzed reachableVar(struct af_Var *var, pgc_Analyzed plist);
 static pgc_Analyzed reachableVarSpace(struct af_VarSpace *vs, pgc_Analyzed plist);
-static pgc_Analyzed reachableVarSpaceList(struct af_VarSpaceListNode *vsl, pgc_Analyzed plist);
+static pgc_Analyzed reachableVarSpaceList(struct af_VarList *vsl, pgc_Analyzed plist);
 static pgc_Analyzed reachableObjectData(struct af_ObjectData *od, pgc_Analyzed plist);
 static pgc_Analyzed reachableObject(struct af_Object *obj, pgc_Analyzed plist);
 
@@ -367,7 +367,7 @@ static pgc_Analyzed reachableVar(struct af_Var *var, pgc_Analyzed plist) {
     return plist;
 }
 
-static pgc_Analyzed reachableVarSpaceList(struct af_VarSpaceListNode *vsl, pgc_Analyzed plist) {
+static pgc_Analyzed reachableVarSpaceList(struct af_VarList *vsl, pgc_Analyzed plist) {
     for (NULL; vsl != NULL; vsl = vsl->next) {
         if (!vsl->vs->gc.info.reachable)
             plist = reachableVarSpace(vsl->vs, plist);

+ 7 - 7
src/core/global_obj.c

@@ -76,14 +76,14 @@ af_Object *makeGlobalObject(af_Environment *env) {
 }
 
 size_t getSizec_Cycle(char *id, af_Object *obj) {
-    return sizeof(af_VarSpaceListNode *);
+    return sizeof(af_VarList *);
 }
 
-void initDatac_Cycle(char *id, af_Object *obj, af_VarSpaceListNode **data, af_Environment *env) {
-    *data = makeVarSpaceList(getProtectVarSpace(env));
+void initDatac_Cycle(char *id, af_Object *obj, af_VarList **data, af_Environment *env) {
+    *data = pushProtectVarList(NULL, env);
 }
 
-void freeDatac_Cycle(char *id, af_Object *obj, af_VarSpaceListNode **data, af_Environment *env) {
+void freeDatac_Cycle(char *id, af_Object *obj, af_VarList **data, af_Environment *env) {
     freeAllVarSpaceList(*data);
 }
 
@@ -119,13 +119,13 @@ bool getAclc_Cycle(char *id, af_Object *obj, af_ArgCodeList **acl, af_Code *code
     return true;
 }
 
-bool getVslc_Cycle(char *id, af_Object *obj, af_VarSpaceListNode **vsl, CycleMark *mark, af_Environment *env) {
-    *vsl = *(af_VarSpaceListNode **)getObjectData(obj);
+bool getVslc_Cycle(char *id, af_Object *obj, af_VarList **vsl, CycleMark *mark, af_Environment *env) {
+    *vsl = *(af_VarList **)getObjectData(obj);
     return true;
 }
 
 af_GcList *getGcListc_Cycle(char *id, af_Object *obj, void *data) {
-    af_GcList *gl = pushGcList(glt_vsl, *(af_VarSpaceListNode **)data, NULL);
+    af_GcList *gl = pushGcList(glt_vsl, *(af_VarList **)data, NULL);
     return gl;
 }
 

+ 1 - 3
src/core/thread.c

@@ -29,9 +29,7 @@ af_Environment *startRunThread(af_Environment *env, af_VarSpace *vs, af_Code *co
 //        gc_delReference(obj, env);
     }
 
-    af_VarSpaceListNode *vsl = makeVarSpaceList(vs);
-    vsl->next = new->activity->run_varlist;
-    new->activity->run_varlist = vsl;
+    new->activity->run_varlist = pushVarList(vs, new->activity->run_varlist);
     new->activity->count_run_varlist++;
     gc_delReference(vs, base);
 

+ 36 - 17
src/core/var.c

@@ -158,38 +158,38 @@ void freeVarSpace(af_VarSpace *vs, af_Environment *env) {
     free(vs);
 }
 
-af_VarSpaceListNode *makeVarSpaceList(af_VarSpace *vs) {
-    af_VarSpaceListNode *vsl = calloc(1, sizeof(af_VarSpaceListNode));
+af_VarList *makeVarSpaceList(af_VarSpace *vs) {
+    af_VarList *vsl = calloc(1, sizeof(af_VarList));
     vsl->vs = vs;
     return vsl;
 }
 
-af_VarSpaceListNode *copyVarSpaceList(af_VarSpaceListNode *vsl) {
-    af_VarSpaceListNode *base = NULL;
-    af_VarSpaceListNode **pvsl = &base;
+af_VarList *copyVarSpaceList(af_VarList *vsl) {
+    af_VarList *base = NULL;
+    af_VarList **pvsl = &base;
     for (NULL; vsl != NULL; vsl = vsl->next, pvsl = &((*pvsl)->next))
         *pvsl = makeVarSpaceList(vsl->vs);
     return base;
 }
 
-static af_VarSpaceListNode *freeVarSpaceList(af_VarSpaceListNode *vsl){
-    af_VarSpaceListNode *next = vsl->next;
+static af_VarList *freeVarSpaceList(af_VarList *vsl){
+    af_VarList *next = vsl->next;
     free(vsl);
     return next;
 }
 
-void freeAllVarSpaceList(af_VarSpaceListNode *vsl){
+void freeAllVarSpaceList(af_VarList *vsl){
     while (vsl != NULL)
         vsl = freeVarSpaceList(vsl);
 }
 
-af_VarSpace *getVarSpaceFromList(af_VarSpaceListNode *vsl) {
+af_VarSpace *getVarSpaceFromList(af_VarList *vsl) {
     if (vsl != NULL)
         return vsl->vs;
     return NULL;
 }
 
-bool freeVarSpaceListCount(size_t count, af_VarSpaceListNode *vsl) {
+bool freeVarSpaceListCount(size_t count, af_VarList *vsl) {
     for (size_t i = count; i > 0; i--) {
         if (vsl == NULL)  // 发生了错误
             return false;
@@ -293,7 +293,7 @@ bool makeVarToVarSpace(char *name, char p_self, char p_posterity, char p_externa
  * 自动跳过保护空间
  * 调用 addVarToVarSpace
  */
-bool addVarToVarSpaceList(af_Var *var, af_Object *visitor, af_VarSpaceListNode *vsl, af_Environment *env){
+bool addVarToVarSpaceList(af_Var *var, af_Object *visitor, af_VarList *vsl, af_Environment *env){
     for (NULL; vsl != NULL; vsl = vsl->next) {
         if (!vsl->vs->is_protect)
             return addVarToVarSpace(var, visitor, vsl->vs, env);
@@ -308,7 +308,7 @@ bool addVarToVarSpaceList(af_Var *var, af_Object *visitor, af_VarSpaceListNode *
  * 注意: 必须保证 VarSpace被 gc 引用
  */
 bool makeVarToVarSpaceList(char *name, char p_self, char p_posterity, char p_external, af_Object *obj,
-                           af_VarSpaceListNode *vsl, af_Object *visitor, af_Environment *env){
+                           af_VarList *vsl, af_Object *visitor, af_Environment *env){
     af_Var *var = makeVar(name, p_self, p_posterity, p_external, obj, env);
     if (addVarToVarSpaceList(var, visitor, vsl, env))
         return true;
@@ -437,7 +437,7 @@ RETRUN_FALSE:
  * 否则返回true
  * 调用delVarFromVarSpace
  */
-bool delVarFromVarList(char *name, af_Object *visitor, af_VarSpaceListNode *vsl) {
+bool delVarFromVarList(char *name, af_Object *visitor, af_VarList *vsl) {
     return delVarFromVarSpace(name, visitor, vsl->vs);
 }
 
@@ -522,7 +522,7 @@ af_Var *findVarFromVarSpace(char *name, af_Object *visitor, af_VarSpace *vs){
  * 目标: 在VarSpaceListNode中搜索var
  * 调用: findVarFromVarSpaceByIndex
  */
-af_Var *findVarFromVarList(char *name, af_Object *visitor, af_VarSpaceListNode *vsl) {
+af_Var *findVarFromVarList(char *name, af_Object *visitor, af_VarList *vsl) {
     time33_t index = time33(name) % VAR_HASHTABLE_SIZE;
     af_Var *var = NULL;
 
@@ -602,7 +602,7 @@ bool setVarToVarSpace(char *name, af_Object *obj, af_Object *visitor, af_VarSpac
  * 目标: 在VarSpaceListNode中搜索var并修改其值
  * 调用: findVarFromVarSpaceByIndex
  */
-bool setVarToVarList(char *name, af_Object *obj, af_Object *visitor, af_VarSpaceListNode *vsl) {
+bool setVarToVarList(char *name, af_Object *obj, af_Object *visitor, af_VarList *vsl) {
     time33_t index = time33(name) % VAR_HASHTABLE_SIZE;
     af_Var *var = NULL;
 
@@ -634,9 +634,28 @@ bool setVarToVarList(char *name, af_Object *obj, af_Object *visitor, af_VarSpace
  * @param env
  * @return
  */
-af_VarSpaceListNode *pushNewVarList(af_Object *belong, af_VarSpaceListNode *base, af_Environment *env){
+af_VarList *pushNewVarList(af_Object *belong, af_VarList *base, af_Environment *env){
     af_VarSpace *vs = makeVarSpace(belong, 3, 2, 0, env);
-    af_VarSpaceListNode *new = makeVarSpaceList(vs);
+    af_VarList *new = makeVarSpaceList(vs);
+    new->next = base;
+    return new;
+}
+
+/**
+ * 压入新的空保护空间的VarSpace
+ * @param belong
+ * @param base
+ * @param env
+ * @return
+ */
+af_VarList *pushProtectVarList(af_VarList *base, af_Environment *env){
+    af_VarList *new = makeVarSpaceList(getProtectVarSpace(env));
+    new->next = base;
+    return new;
+}
+
+af_VarList *pushVarList(af_VarSpace *vs, af_VarList *base){
+    af_VarList *new = makeVarSpaceList(vs);
     new->next = base;
     return new;
 }

+ 2 - 2
src/runtime/base/quit.c

@@ -4,7 +4,7 @@
 
 typedef struct QuitFunc QuitFunc;
 struct QuitFunc {
-    af_VarSpaceListNode *func_var_list;
+    af_VarList *func_var_list;
 };
 
 static size_t funcGetSize(char *id, af_Object *obj) {
@@ -27,7 +27,7 @@ static bool funcArgList(char *id, af_Object *obj, af_ArgList **al, af_ArgCodeLis
     return true;
 }
 
-static bool funcVarList(char *id, af_Object *obj, af_VarSpaceListNode **vsl, void *mark, af_Environment *env) {
+static bool funcVarList(char *id, af_Object *obj, af_VarList **vsl, void *mark, af_Environment *env) {
     QuitFunc *sf = getObjectData(obj);
     *vsl = sf->func_var_list;
     return true;

+ 2 - 2
src/runtime/base/str_obj.c

@@ -5,7 +5,7 @@ typedef struct ObjectStrFunc ObjectStrFunc;
 struct ObjectStrFunc {
     af_ObjectAPI *api;
     af_VarSpace *share_vs;
-    af_VarSpaceListNode *func_var_list;
+    af_VarList *func_var_list;
 };
 
 static size_t strGetSize(char *id, af_Object *obj) {
@@ -62,7 +62,7 @@ static bool strFuncArgList(char *id, af_Object *obj, af_ArgList **al, af_ArgCode
     return true;
 }
 
-static bool strFuncVarList(char *id, af_Object *obj, af_VarSpaceListNode **vsl, void *mark, af_Environment *env) {
+static bool strFuncVarList(char *id, af_Object *obj, af_VarList **vsl, void *mark, af_Environment *env) {
     ObjectStrFunc *sf = getObjectData(obj);
     *vsl = sf->func_var_list;
     return true;

+ 7 - 7
test/src/run_code.c

@@ -21,15 +21,15 @@ af_VarSpace *getShareVS(char *id, af_Object *obj) {
 
 
 size_t getSize_Normal(char *id, af_Object *obj) {
-    return sizeof(af_VarSpaceListNode *);
+    return sizeof(af_VarList *);
 }
 
-void initData_Normal(char *id, af_Object *obj, af_VarSpaceListNode **data, af_Environment *env) {
-    *data = makeVarSpaceList(getProtectVarSpace(env));
+void initData_Normal(char *id, af_Object *obj, af_VarList **data, af_Environment *env) {
+    *data = pushProtectVarList(NULL, env);
     printf("initData_Normal(): VarSpace %p\n", *data);
 }
 
-void freeData_Normal(char *id, af_Object *obj, af_VarSpaceListNode **data, af_Environment *env) {
+void freeData_Normal(char *id, af_Object *obj, af_VarList **data, af_Environment *env) {
     printf("freeData_Normal(): vsl = %p\n", *data);
     freeAllVarSpaceList(*data);
 }
@@ -72,13 +72,13 @@ bool getAcl_Normal(char *id, af_Object *obj, af_ArgCodeList **acl, af_Code *code
     return true;
 }
 
-bool getVsl_Normal(char *id, af_Object *obj, af_VarSpaceListNode **vsl, void *mark, af_Environment *env) {
-    *vsl = *(af_VarSpaceListNode **)getObjectData(obj);
+bool getVsl_Normal(char *id, af_Object *obj, af_VarList **vsl, void *mark, af_Environment *env) {
+    *vsl = *(af_VarList **)getObjectData(obj);
     return true;
 }
 
 af_GcList *getGcList_Normal(char *id, af_Object *obj, void *data) {
-    af_GcList *gl = pushGcList(glt_vsl, *(af_VarSpaceListNode **)data, NULL);
+    af_GcList *gl = pushGcList(glt_vsl, *(af_VarList **)data, NULL);
     return gl;
 }