浏览代码

refacot: 调整branch的变量空间

执行新的branch的时候不会push新的var_list
SongZihuan 4 年之前
父节点
当前提交
61b0cbcc16
共有 8 个文件被更改,包括 55 次插入100 次删除
  1. 0 1
      vmcore/CMakeLists.txt
  2. 0 1
      vmcore/include/inter.h
  3. 1 2
      vmcore/include/statement.h
  4. 0 1
      vmcore/src/inter.c
  5. 41 59
      vmcore/src/runbranch.c
  6. 3 4
      vmcore/src/runcall.c
  7. 7 22
      vmcore/src/runoperation.c
  8. 3 10
      vmcore/src/statement.c

+ 0 - 1
vmcore/CMakeLists.txt

@@ -60,7 +60,6 @@ ELSE()
     ADD_LIBRARY(vmcore SHARED ${SRC})
     ADD_LIBRARY(vmcore SHARED ${SRC})
 ENDIF()
 ENDIF()
 
 
-#ADD_LIBRARY(vmcore SHARED ${SRC})
 TARGET_LINK_LIBRARIES(vmcore ${libffi} ${libdl} m)
 TARGET_LINK_LIBRARIES(vmcore ${libffi} ${libdl} m)
 TARGET_INCLUDE_DIRECTORIES(vmcore PRIVATE VMCORE_INCLUDE_DICT)
 TARGET_INCLUDE_DIRECTORIES(vmcore PRIVATE VMCORE_INCLUDE_DICT)
 SET_TARGET_PROPERTIES(vmcore PROPERTIES
 SET_TARGET_PROPERTIES(vmcore PROPERTIES

+ 0 - 1
vmcore/include/inter.h

@@ -133,7 +133,6 @@ struct Inter{
         } opt_mode;  // 表达式执行模式
         } opt_mode;  // 表达式执行模式
 
 
         bool value_folding;  // 常量折叠[on]
         bool value_folding;  // 常量折叠[on]
-        bool var_folding;  // 变量折叠[off]
         bool opt_folding;  // 表达式折叠[on]
         bool opt_folding;  // 表达式折叠[on]
         bool cyc_folding;  // 在循环内部自动打开折叠
         bool cyc_folding;  // 在循环内部自动打开折叠
         bool func_folding;  // 在函数内部自动打开
         bool func_folding;  // 在函数内部自动打开

+ 1 - 2
vmcore/include/statement.h

@@ -55,7 +55,6 @@ struct Statement{
         struct base_var{
         struct base_var{
             wchar_t *name;
             wchar_t *name;
             struct Statement *times;
             struct Statement *times;
-            struct Var *link;  // link 模式
             bool run;
             bool run;
         } base_var;
         } base_var;
         struct{
         struct{
@@ -289,7 +288,7 @@ typedef struct DecorationStatement DecorationStatement;
 
 
 Statement *makeStatement(fline line, char *file);
 Statement *makeStatement(fline line, char *file);
 void setRunInfo(Statement *st);
 void setRunInfo(Statement *st);
-void freeRunInfo(Statement *st);
+void freeRunInfo(Statement *st, bool deal_var);
 void freeStatement(Statement *st);
 void freeStatement(Statement *st);
 Statement *copyStatement(Statement *st);
 Statement *copyStatement(Statement *st);
 Statement *copyStatementCore(Statement *st);
 Statement *copyStatementCore(Statement *st);

+ 0 - 1
vmcore/src/inter.c

@@ -131,7 +131,6 @@ void setBaseInterData(struct Inter *inter){
     inter->data.opt_mode = om_normal;
     inter->data.opt_mode = om_normal;
 
 
     inter->data.value_folding = true;
     inter->data.value_folding = true;
-    inter->data.var_folding = false;
     inter->data.opt_folding = true;
     inter->data.opt_folding = true;
     inter->data.func_folding = true;
     inter->data.func_folding = true;
     inter->data.cyc_folding = true;
     inter->data.cyc_folding = true;

+ 41 - 59
vmcore/src/runbranch.c

@@ -1,11 +1,12 @@
 #include "__run.h"
 #include "__run.h"
 
 
-#define SET_FOLDING_BRANCH(folding_bak, set_folding, inter)bool folding_bak[] = {(inter)->data.value_folding /*[0]*/, \
-(inter)->data.var_folding /*[1]*/, (inter)->data.opt_folding /*[2]*/}; \
+#define SET_FOLDING_BRANCH(folding_bak, set_folding, inter)bool folding_bak[] = {(inter)->data.value_folding /*[0]*/, (inter)->data.opt_folding /*[1]*/}; \
 bool set_folding = (inter)->data.func_folding; \
 bool set_folding = (inter)->data.func_folding; \
-if (set_folding) { (inter)->data.value_folding = (inter)->data.var_folding = (inter)->data.opt_folding = true;}
+if (set_folding) { (inter)->data.value_folding = (inter)->data.opt_folding = true;}
+
+#define SET_FOLDING_END(folding_bak, set_folding, inter) if (set_folding) {(inter)->data.value_folding = (folding_bak)[0];(inter)->data.opt_folding = (folding_bak)[1];}
+#define GET_YIELD(st) (st->info.have_info)
 
 
-#define SET_FOLDING_END(folding_bak, set_folding, inter) if (set_folding) {(inter)->data.value_folding = (folding_bak)[0];(inter)->data.var_folding = (folding_bak)[1];(inter)->data.opt_folding = (folding_bak)[2];}
 
 
 static bool checkNumber(FUNC){
 static bool checkNumber(FUNC){
     if (!isType(result->value->value, V_int)) {
     if (!isType(result->value->value, V_int)) {
@@ -15,7 +16,7 @@ static bool checkNumber(FUNC){
     return true;
     return true;
 }
 }
 
 
-static void newBranchYield(Statement *branch_st, Statement *node, StatementList *sl_node, VarList *new_var, enum StatementInfoStatus status, Inter *inter){
+static void newBranchYield(Statement *branch_st, Statement *node, StatementList *sl_node, VarList *new_var, enum StatementInfoStatus status){
     if (new_var != NULL)
     if (new_var != NULL)
         new_var->next = NULL;
         new_var->next = NULL;
     branch_st->info.var_list = new_var;
     branch_st->info.var_list = new_var;
@@ -27,7 +28,7 @@ static void newBranchYield(Statement *branch_st, Statement *node, StatementList
 
 
 static void newWithBranchYield(Statement *branch_st, Statement *node, StatementList *sl_node, VarList *new_var, enum StatementInfoStatus status,
 static void newWithBranchYield(Statement *branch_st, Statement *node, StatementList *sl_node, VarList *new_var, enum StatementInfoStatus status,
                         Inter *inter, LinkValue *value, LinkValue *_exit_, LinkValue *_enter_, LinkValue *with){
                         Inter *inter, LinkValue *value, LinkValue *_exit_, LinkValue *_enter_, LinkValue *with){
-    newBranchYield(branch_st, node, sl_node, new_var, status, inter);
+    newBranchYield(branch_st, node, sl_node, new_var, status);
     branch_st->info.branch.with_.value = value;
     branch_st->info.branch.with_.value = value;
     branch_st->info.branch.with_._exit_ = _exit_;
     branch_st->info.branch.with_._exit_ = _exit_;
     branch_st->info.branch.with_._enter_ = _enter_;
     branch_st->info.branch.with_._enter_ = _enter_;
@@ -36,7 +37,7 @@ static void newWithBranchYield(Statement *branch_st, Statement *node, StatementL
 
 
 static void newForBranchYield(Statement *branch_st, Statement *node, StatementList *sl_node, VarList *new_var, enum StatementInfoStatus status,
 static void newForBranchYield(Statement *branch_st, Statement *node, StatementList *sl_node, VarList *new_var, enum StatementInfoStatus status,
                         Inter *inter, LinkValue *iter){
                         Inter *inter, LinkValue *iter){
-    newBranchYield(branch_st, node, sl_node, new_var, status, inter);
+    newBranchYield(branch_st, node, sl_node, new_var, status);
     branch_st->info.branch.for_.iter = iter;
     branch_st->info.branch.for_.iter = iter;
     gc_addTmpLink(&iter->gc_status);
     gc_addTmpLink(&iter->gc_status);
 }
 }
@@ -48,18 +49,14 @@ static void updateBranchYield(Statement *branch_st, Statement *node, StatementLi
     branch_st->info.have_info = true;
     branch_st->info.have_info = true;
 }
 }
 
 
-static void setBranchResult(bool yield_run, StatementList *sl, Statement *st, Result *result, enum StatementInfoStatus status, FUNC_CORE) {
+static void setBranchResult(bool yield_run, StatementList *sl, Statement *st, Result *result, enum StatementInfoStatus status) {
     if (yield_run) {
     if (yield_run) {
         if (result->type == R_yield)
         if (result->type == R_yield)
             updateBranchYield(st, result->node, sl, status);
             updateBranchYield(st, result->node, sl, status);
         else
         else
-            freeRunInfo(st);
-    } else {
-        if (result->type == R_yield)
-            newBranchYield(st, result->node, sl, var_list, status, inter);
-        else
-            var_list = popVarList(var_list);
-    }
+            freeRunInfo(st, false);
+    } else if (result->type == R_yield)
+        newBranchYield(st, result->node, sl, NULL, status);
 }
 }
 
 
 static bool runBranchHeard(Statement *condition, Statement *var, LinkValue **condition_value, FUNC_NT) {
 static bool runBranchHeard(Statement *condition, Statement *var, LinkValue **condition_value, FUNC_NT) {
@@ -159,7 +156,7 @@ ResultType ifBranch(FUNC) {
     enum StatementInfoStatus result_from = info_vl_branch;
     enum StatementInfoStatus result_from = info_vl_branch;
 
 
     setResultCore(result);
     setResultCore(result);
-    yield_run = popYieldVarList(st, &var_list, var_list, inter);
+    yield_run = GET_YIELD(st);  // 不设置新的作用域
 
 
     if (yield_run) {
     if (yield_run) {
         if (st->info.branch.status == info_vl_branch){
         if (st->info.branch.status == info_vl_branch){
@@ -175,7 +172,6 @@ ResultType ifBranch(FUNC) {
         } else if (st->info.branch.status == info_finally_branch)
         } else if (st->info.branch.status == info_finally_branch)
             finally = st->info.node;
             finally = st->info.node;
         else {
         else {
-            var_list = popVarList(var_list);
             setResultError(E_SystemException, L"yield info error", st->line, st->code_file, true, CNEXT_NT);
             setResultError(E_SystemException, L"yield info error", st->line, st->code_file, true, CNEXT_NT);
             return R_error;
             return R_error;
         }
         }
@@ -207,7 +203,7 @@ ResultType ifBranch(FUNC) {
         result_from = info_finally_branch;
         result_from = info_finally_branch;
     }
     }
 
 
-    setBranchResult(yield_run, if_list, st, result, result_from, CFUNC_CORE(var_list));
+    setBranchResult(yield_run, if_list, st, result, result_from);  // 不设置var_list
     if (set_result)
     if (set_result)
         setResult(result, inter);
         setResult(result, inter);
     return result->type;
     return result->type;
@@ -286,7 +282,8 @@ ResultType whileBranch(FUNC) {
     SET_FOLDING_BRANCH(folding_bak, set_folding, inter)  // 不需要分号
     SET_FOLDING_BRANCH(folding_bak, set_folding, inter)  // 不需要分号
 
 
     setResultCore(result);
     setResultCore(result);
-    yield_run = popYieldVarList(st, &var_list, var_list, inter);
+
+    yield_run = GET_YIELD(st);
     if (yield_run) {
     if (yield_run) {
         if (st->info.branch.status == info_first_do)
         if (st->info.branch.status == info_first_do)
             first = st->info.node;
             first = st->info.node;
@@ -309,7 +306,6 @@ ResultType whileBranch(FUNC) {
             else_st = NULL;
             else_st = NULL;
             finally = st->info.node;
             finally = st->info.node;
         } else {
         } else {
-            var_list = popVarList(var_list);
             setResultError(E_SystemException, L"yield info error", st->line, st->code_file, true, CNEXT_NT);
             setResultError(E_SystemException, L"yield info error", st->line, st->code_file, true, CNEXT_NT);
             return R_error;
             return R_error;
         }
         }
@@ -346,7 +342,7 @@ ResultType whileBranch(FUNC) {
         result_from = info_finally_branch;
         result_from = info_finally_branch;
     }
     }
 
 
-    setBranchResult(yield_run, while_list, st, result, result_from, CFUNC_CORE(var_list));
+    setBranchResult(yield_run, while_list, st, result, result_from);
     if (set_result)
     if (set_result)
         setResult(result, inter);
         setResult(result, inter);
     SET_FOLDING_END(folding_bak, set_folding, inter)  // 不需要分号
     SET_FOLDING_END(folding_bak, set_folding, inter)  // 不需要分号
@@ -452,13 +448,10 @@ static void setForResult(bool yield_run, StatementList *sl, Statement *st, Resul
         if (result->type == R_yield)
         if (result->type == R_yield)
             updateBranchYield(st, result->node, sl, status);
             updateBranchYield(st, result->node, sl, status);
         else
         else
-            freeRunInfo(st);
-    } else {
-        if (result->type == R_yield)
-            newForBranchYield(st, result->node, sl, var_list, status, inter, iter);
-        else
-            popVarList(var_list);
-    }
+            freeRunInfo(st, false);
+    } else if (result->type == R_yield)
+        newForBranchYield(st, result->node, sl, var_list, status, inter, iter);
+    // else - 正常模式, 不作任何操作
 }
 }
 
 
 ResultType forBranch(FUNC) {
 ResultType forBranch(FUNC) {
@@ -479,7 +472,7 @@ ResultType forBranch(FUNC) {
     SET_FOLDING_BRANCH(folding_bak, set_folding, inter)  // 不需要分号
     SET_FOLDING_BRANCH(folding_bak, set_folding, inter)  // 不需要分号
     setResultCore(result);
     setResultCore(result);
 
 
-    yield_run = popYieldVarList(st, &var_list, var_list, inter);
+    yield_run = GET_YIELD(st);
     if (yield_run) {
     if (yield_run) {
         if (st->info.branch.status == info_first_do)
         if (st->info.branch.status == info_first_do)
             first = st->info.node;
             first = st->info.node;
@@ -505,7 +498,6 @@ ResultType forBranch(FUNC) {
             else_st = NULL;
             else_st = NULL;
             finally = st->info.node;
             finally = st->info.node;
         } else {
         } else {
-            var_list = popVarList(var_list);
             setResultError(E_SystemException, L"yield info error", st->line, st->code_file, true, CNEXT_NT);
             setResultError(E_SystemException, L"yield info error", st->line, st->code_file, true, CNEXT_NT);
             return R_error;
             return R_error;
         }
         }
@@ -554,7 +546,7 @@ ResultType forBranch(FUNC) {
         result_from = info_finally_branch;
         result_from = info_finally_branch;
     }
     }
 
 
-    setForResult(yield_run, for_list, st, result, iter, result_from, CFUNC_CORE(var_list));
+    setForResult(yield_run, for_list, st, result, iter, result_from, CFUNC_CORE(NULL));
     if (!yield_run && iter != NULL)
     if (!yield_run && iter != NULL)
         gc_freeTmpLink(&iter->gc_status);
         gc_freeTmpLink(&iter->gc_status);
 
 
@@ -597,9 +589,7 @@ static int runWithList(StatementList *with_list, LinkValue **with_belong, LinkVa
         *with_belong = *value;
         *with_belong = *value;
         gc_addTmpLink(&(*with_belong)->gc_status);
         gc_addTmpLink(&(*with_belong)->gc_status);
 
 
-        *new = copyVarListCore((*value)->value->object.var, inter);
-        (*new)->next = var_list;
-
+        *new = (*value)->value->object.var;
         *_enter_ = NULL;
         *_enter_ = NULL;
         *_exit_ = NULL;
         *_exit_ = NULL;
     } else {
     } else {
@@ -629,14 +619,12 @@ static int runWithList(StatementList *with_list, LinkValue **with_belong, LinkVa
         if (!CHECK_RESULT(result))
         if (!CHECK_RESULT(result))
             return 0;
             return 0;
 
 
-        *new = pushVarList(var_list, inter);
+        *new = var_list;  // 不设置作用域
         enter_value = result->value;
         enter_value = result->value;
         freeResult(result);
         freeResult(result);
         assCore(with_list->var, enter_value, false, false, CFUNC_NT(*new, result, belong));
         assCore(with_list->var, enter_value, false, false, CFUNC_NT(*new, result, belong));
-        if (!CHECK_RESULT(result)) {
-            *new = popVarList(*new);
+        if (!CHECK_RESULT(result))
             return 0;
             return 0;
-        }
         freeResult(result);
         freeResult(result);
     }
     }
     return 1;
     return 1;
@@ -646,25 +634,18 @@ static void setWithResult(bool yield_run, StatementList *sl, Statement *st, Resu
     if (yield_run) {
     if (yield_run) {
         if (result->type == R_yield)
         if (result->type == R_yield)
             if (status == info_finally_branch) {
             if (status == info_finally_branch) {
-                freeRunInfo(st);
-                newBranchYield(st, result->node, sl, NULL, status, inter);
+                freeRunInfo(st, false);
+                newBranchYield(st, result->node, sl, NULL, status);
             } else
             } else
                 updateBranchYield(st, result->node, sl, status);
                 updateBranchYield(st, result->node, sl, status);
         else
         else
-            freeRunInfo(st);
-    } else {
-        if (result->type == R_yield)
-            if (status == info_finally_branch) {
-                newBranchYield(st, result->node, sl, NULL, status, inter);
-                popVarList(var_list);
-            }
-            else
-                newWithBranchYield(st, result->node, sl, var_list, status, inter, value, _exit_, _enter_, with);
-        else {
-            if (var_list != NULL)
-                popVarList(var_list);
-        }
-    }
+            freeRunInfo(st, false);
+    } else if (result->type == R_yield) {
+        if (status == info_finally_branch)
+            newBranchYield(st, result->node, sl, NULL, status);
+        else
+            newWithBranchYield(st, result->node, sl, var_list, status, inter, value, _exit_, _enter_, with);
+    }  // else - 即正常模式, 不需要任何处理
 }
 }
 
 
 ResultType withBranch(FUNC) {
 ResultType withBranch(FUNC) {
@@ -672,7 +653,6 @@ ResultType withBranch(FUNC) {
     Statement *else_st = st->u.with_branch.else_list;
     Statement *else_st = st->u.with_branch.else_list;
     Statement *finally = st->u.with_branch.finally;
     Statement *finally = st->u.with_branch.finally;
     Statement *vl_info = NULL;
     Statement *vl_info = NULL;
-    VarList *new = NULL;
     LinkValue *_enter_ = NULL;
     LinkValue *_enter_ = NULL;
     LinkValue *_exit_ = NULL;
     LinkValue *_exit_ = NULL;
     LinkValue *value = NULL;
     LinkValue *value = NULL;
@@ -681,6 +661,7 @@ ResultType withBranch(FUNC) {
     bool run_block = true;
     bool run_block = true;
     bool run_exit = true;
     bool run_exit = true;
     bool yield_run;
     bool yield_run;
+    VarList *new = NULL;
     enum StatementInfoStatus result_from = info_vl_branch;
     enum StatementInfoStatus result_from = info_vl_branch;
 
 
     setResultCore(result);
     setResultCore(result);
@@ -692,7 +673,8 @@ ResultType withBranch(FUNC) {
         if (st->info.var_list != NULL) {
         if (st->info.var_list != NULL) {
             new = st->info.var_list;
             new = st->info.var_list;
             new->next = var_list;
             new->next = var_list;
-        }
+        } else
+            new = var_list;
 
 
         if (st->info.branch.status == info_vl_branch) {
         if (st->info.branch.status == info_vl_branch) {
             vl_info = st->info.node;
             vl_info = st->info.node;
@@ -709,7 +691,7 @@ ResultType withBranch(FUNC) {
             finally = st->info.node;
             finally = st->info.node;
         }
         }
     } else {
     } else {
-        int status = runWithList(with_list, &with_belong, &value, &new, &_enter_, &_exit_, st->line, st->code_file, CNEXT_NT);
+        int status = runWithList(with_list, &with_belong, &value, &new, &_enter_, &_exit_, st->line, st->code_file, CNEXT_NT);  // 若是__enter__模式则tmp设置为NULL
         if (status == -1) {
         if (status == -1) {
             set_result = false;
             set_result = false;
             run_block = false;
             run_block = false;
@@ -827,7 +809,7 @@ ResultType tryBranch(FUNC) {
     enum StatementInfoStatus result_from = info_first_do;
     enum StatementInfoStatus result_from = info_first_do;
 
 
     setResultCore(result);
     setResultCore(result);
-    yield_run = popYieldVarList(st, &var_list, var_list, inter);
+    yield_run = GET_YIELD(st);
     if (yield_run && st->info.branch.status == info_first_do)
     if (yield_run && st->info.branch.status == info_first_do)
         try = st->info.node;
         try = st->info.node;
     else if (yield_run && st->info.branch.status == info_vl_branch){
     else if (yield_run && st->info.branch.status == info_vl_branch){
@@ -907,7 +889,7 @@ ResultType tryBranch(FUNC) {
         result_from = info_finally_branch;
         result_from = info_finally_branch;
     }
     }
 
 
-    setBranchResult(yield_run, except_list, st, result, result_from, CFUNC_CORE(var_list));
+    setBranchResult(yield_run, except_list, st, result, result_from);
 
 
     if (set_result)
     if (set_result)
         setResult(result, inter);
         setResult(result, inter);

+ 3 - 4
vmcore/src/runcall.c

@@ -564,10 +564,10 @@ static ResultType callVMFunction(LinkValue *func_value, Argument *arg, fline lin
 }
 }
 
 
 ResultType callBackCore(LinkValue *function_value, Argument *arg, fline line, char *file, int pt_sep, FUNC_NT) {
 ResultType callBackCore(LinkValue *function_value, Argument *arg, fline line, char *file, int pt_sep, FUNC_NT) {
-    bool folding_bak[] = {inter->data.value_folding /*[0]*/, inter->data.var_folding /*[1]*/, inter->data.opt_folding /*[2]*/};
+    bool folding_bak[] = {inter->data.value_folding /*[0]*/, inter->data.opt_folding /*[1]*/};
     bool set_folding = inter->data.func_folding;
     bool set_folding = inter->data.func_folding;
     if (set_folding)
     if (set_folding)
-        inter->data.value_folding = inter->data.var_folding = inter->data.opt_folding = true;  // 全部启动
+        inter->data.value_folding = inter->data.opt_folding = true;  // 全部启动
     setResultCore(result);
     setResultCore(result);
     gc_addTmpLink(&function_value->gc_status);
     gc_addTmpLink(&function_value->gc_status);
     switch (function_value->value->type) {
     switch (function_value->value->type) {
@@ -598,8 +598,7 @@ ResultType callBackCore(LinkValue *function_value, Argument *arg, fline line, ch
 
 
     if (set_folding) {
     if (set_folding) {
         inter->data.value_folding = folding_bak[0];
         inter->data.value_folding = folding_bak[0];
-        inter->data.var_folding = folding_bak[1];
-        inter->data.opt_folding = folding_bak[2];
+        inter->data.opt_folding = folding_bak[1];
     }
     }
     gc_freeTmpLink(&function_value->gc_status);
     gc_freeTmpLink(&function_value->gc_status);
     return result->type;
     return result->type;

+ 7 - 22
vmcore/src/runoperation.c

@@ -94,7 +94,7 @@ static void setBlockResult(Statement *st, bool yield_run, Result *result, FUNC_C
             result->is_yield = true;
             result->is_yield = true;
         }
         }
         else
         else
-            freeRunInfo(st);
+            freeRunInfo(st, true);
     }
     }
     else {
     else {
         if (result->type == R_yield){
         if (result->type == R_yield){
@@ -562,28 +562,13 @@ ResultType getVar(FUNC, VarInfo var_info) {
 
 
     setResultCore(result);
     setResultCore(result);
 
 
-    if (inter->data.var_folding && st->type == base_var && st->u.base_var.link != NULL) {
-        var = st->u.base_var.link->value;
-        name_ = st->u.base_var.link->name_;
-        gc_addTmpLink(&name_->gc_status);
-    } else {
-        var_info(&name, &int_times, CNEXT);
-        if (!CHECK_RESULT(result)) {
-            memFree(name);
-            return result->type;
-        }
-        GET_RESULT(name_, result);
-        var = findFromVarList(name, int_times, &re_var, read_var, CFUNC_CORE(var_list));
-        if (inter->data.var_folding) {
-            if (re_var != NULL && (st->u.base_var.times == NULL || st->u.base_var.times->type == base_value)) {  // 变量折叠
-                gc_addStatementLink(&re_var->gc_status);
-                st->u.base_var.link = re_var;
-            }
-        } else if (st->u.base_var.link != NULL) {  // 复位
-            gc_freeStatementLink(&st->u.base_var.link->gc_status);
-            st->u.base_var.link = NULL;
-        }
+    var_info(&name, &int_times, CNEXT);
+    if (!CHECK_RESULT(result)) {
+        memFree(name);
+        return result->type;
     }
     }
+    GET_RESULT(name_, result);
+    var = findFromVarList(name, int_times, &re_var, read_var, CFUNC_CORE(var_list));
 
 
     if (var == NULL) {
     if (var == NULL) {
         if (st->type == base_svar && !st->u.base_svar.is_var) {
         if (st->type == base_svar && !st->u.base_svar.is_var) {

+ 3 - 10
vmcore/src/statement.c

@@ -25,8 +25,8 @@ void setRunInfo(Statement *st){
     st->info.branch.func.push = true;
     st->info.branch.func.push = true;
 }
 }
 
 
-void freeRunInfo(Statement *st) {
-    if (st->info.var_list != NULL)
+void freeRunInfo(Statement *st, bool deal_var) {
+    if (deal_var && st->info.var_list != NULL)
         freeVarList(st->info.var_list);
         freeVarList(st->info.var_list);
     if (st->info.branch.with_.value != NULL)
     if (st->info.branch.with_.value != NULL)
         gc_freeTmpLink(&st->info.branch.with_.value->gc_status);
         gc_freeTmpLink(&st->info.branch.with_.value->gc_status);
@@ -99,7 +99,6 @@ Statement *makeBaseVarStatement(wchar_t *name, Statement *times, fline line, cha
     tmp->type = base_var;
     tmp->type = base_var;
     tmp->u.base_var.name = memWidecpy(name);
     tmp->u.base_var.name = memWidecpy(name);
     tmp->u.base_var.times = times;
     tmp->u.base_var.times = times;
-    tmp->u.base_var.link = NULL;
     tmp->u.base_var.run = true;
     tmp->u.base_var.run = true;
     return tmp;
     return tmp;
 }
 }
@@ -382,8 +381,6 @@ void freeStatement(Statement *st){
             case base_var:
             case base_var:
                 memFree(st->u.base_var.name);
                 memFree(st->u.base_var.name);
                 freeStatement(st->u.base_var.times);
                 freeStatement(st->u.base_var.times);
-                if (st->u.base_var.link != NULL)
-                    gc_freeStatementLink(&st->u.base_var.link->gc_status);
                 break;
                 break;
             case del_:
             case del_:
                 freeStatement(st->u.del_.var);
                 freeStatement(st->u.del_.var);
@@ -505,7 +502,7 @@ void freeStatement(Statement *st){
             default:
             default:
                 break;
                 break;
         }
         }
-        freeRunInfo(st);
+        freeRunInfo(st, true);
         memFree(st->code_file);
         memFree(st->code_file);
         memFree(st);
         memFree(st);
     }
     }
@@ -548,10 +545,6 @@ Statement *copyStatementCore(Statement *st){
             new->u.base_var.name = memWidecpy(st->u.base_var.name);
             new->u.base_var.name = memWidecpy(st->u.base_var.name);
             new->u.base_var.times = copyStatement(st->u.base_var.times);
             new->u.base_var.times = copyStatement(st->u.base_var.times);
             new->u.base_var.run = st->u.base_var.run;
             new->u.base_var.run = st->u.base_var.run;
-            if (st->u.base_var.link != NULL) {
-                new->u.base_var.link = st->u.base_var.link;
-                gc_addStatementLink(&new->u.base_var.link->gc_status);
-            }
             break;
             break;
         case del_:
         case del_:
             new->u.del_.var = copyStatement(st->u.del_.var);
             new->u.del_.var = copyStatement(st->u.del_.var);