Przeglądaj źródła

feat: 添加了变量,常量,表达式折叠的开关

循环体和调用函数默认启动三个折叠的开关
SongZihuan 4 lat temu
rodzic
commit
ce75a35075

+ 6 - 0
vmcore/include/inter.h

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

+ 6 - 0
vmcore/src/inter.c

@@ -129,6 +129,12 @@ void setBaseInterData(struct Inter *inter){
     inter->data.start_gc = false;
     inter->data.free_mode = false;
     inter->data.opt_mode = om_normal;
+
+    inter->data.value_folding = true;
+    inter->data.var_folding = false;
+    inter->data.opt_folding = true;
+    inter->data.func_folding = true;
+    inter->data.cyc_folding = true;
 }
 #undef setName
 

+ 11 - 0
vmcore/src/runbranch.c

@@ -1,5 +1,12 @@
 #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]*/}; \
+bool set_folding = (inter)->data.func_folding; \
+if (set_folding) { (inter)->data.value_folding = (inter)->data.var_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.var_folding = (folding_bak)[1];(inter)->data.opt_folding = (folding_bak)[2];}
+
 static bool checkNumber(FUNC){
     if (!isType(result->value->value, V_int)) {
         setResultErrorSt(E_TypeException, L"Don't get a int of layers", true, st, CNEXT_NT);
@@ -276,6 +283,7 @@ ResultType whileBranch(FUNC) {
     bool yield_run = false;
     bool do_while = st->u.while_branch.type == do_while_;
     enum StatementInfoStatus result_from = info_first_do;
+    SET_FOLDING_BRANCH(folding_bak, set_folding, inter)  // 不需要分号
 
     setResultCore(result);
     yield_run = popYieldVarList(st, &var_list, var_list, inter);
@@ -341,6 +349,7 @@ ResultType whileBranch(FUNC) {
     setBranchResult(yield_run, while_list, st, result, result_from, CFUNC_CORE(var_list));
     if (set_result)
         setResult(result, inter);
+    SET_FOLDING_END(folding_bak, set_folding, inter)  // 不需要分号
     return result->type;
 }
 
@@ -467,6 +476,7 @@ ResultType forBranch(FUNC) {
     LinkValue *iter = NULL;
     enum StatementInfoStatus result_from = info_first_do;
 
+    SET_FOLDING_BRANCH(folding_bak, set_folding, inter)  // 不需要分号
     setResultCore(result);
 
     yield_run = popYieldVarList(st, &var_list, var_list, inter);
@@ -550,6 +560,7 @@ ResultType forBranch(FUNC) {
 
     if (set_result)
         setResult(result, inter);
+    SET_FOLDING_END(folding_bak, set_folding, inter)
     return result->type;
 }
 

+ 9 - 0
vmcore/src/runcall.c

@@ -564,6 +564,10 @@ static ResultType callVMFunction(LinkValue *func_value, Argument *arg, long int
 }
 
 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 set_folding = inter->data.func_folding;
+    if (set_folding)
+        inter->data.value_folding = inter->data.var_folding = inter->data.opt_folding = true;  // 全部启动
     setResultCore(result);
     gc_addTmpLink(&function_value->gc_status);
     switch (function_value->value->type) {
@@ -592,6 +596,11 @@ ResultType callBackCore(LinkValue *function_value, Argument *arg, fline line, ch
     }
     // callBackCore不执行错误回溯
 
+    if (set_folding) {
+        inter->data.value_folding = folding_bak[0];
+        inter->data.var_folding = folding_bak[1];
+        inter->data.opt_folding = folding_bak[2];
+    }
     gc_freeTmpLink(&function_value->gc_status);
     return result->type;
 }

+ 17 - 11
vmcore/src/runoperation.c

@@ -562,7 +562,7 @@ ResultType getVar(FUNC, VarInfo var_info) {
 
     setResultCore(result);
 
-    if (st->type == base_var && st->u.base_var.link != NULL) {
+    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);
@@ -574,9 +574,14 @@ ResultType getVar(FUNC, VarInfo var_info) {
         }
         GET_RESULT(name_, result);
         var = findFromVarList(name, int_times, &re_var, read_var, CFUNC_CORE(var_list));
-        if (re_var != NULL && (st->u.base_var.times == NULL || st->u.base_var.times->type == base_value)) {  // 变量折叠 TODO-szh 增加开关 处理del var的情况
-            gc_addStatementLink(&re_var->gc_status);
-            st->u.base_var.link = re_var;
+        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;
         }
     }
 
@@ -634,12 +639,13 @@ ResultType getBaseValue(FUNC) {
                 break;
         }
         result->value->belong = belong;
-        // 常量折叠 TODO-szh 增设开关
-        memFree(st->u.base_value.str);
-        st->u.base_value.type = link_value;
-        st->u.base_value.value = result->value;
-        st->u.base_value.str = NULL;
-        gc_addStatementLink(&result->value->gc_status);
+        if (inter->data.value_folding) {  // 常量折叠
+            memFree(st->u.base_value.str);
+            st->u.base_value.type = link_value;
+            st->u.base_value.value = result->value;
+            st->u.base_value.str = NULL;
+            gc_addStatementLink(&result->value->gc_status);
+        }
     }
     return result->type;
 }
@@ -761,7 +767,7 @@ static ResultType operationCore(FUNC, wchar_t *name, enum OperationType type) {
     } else
         default_mode: runOperationFromValue(left.value, right.value, name, st->line, st->code_file, CNEXT_NT);
 
-    if (st->u.operation.left->type == base_value && st->u.operation.right->type == base_value) {  // 常量表达式折叠 TODO-szh 添加开关
+    if (inter->data.opt_folding && st->u.operation.left->type == base_value && st->u.operation.right->type == base_value) {  // 常量表达式折叠
         freeStatement(st->u.operation.left);
         freeStatement(st->u.operation.right);
         st->type = base_value;