Browse Source

refactor: 调整了gc_freeze的运行机制

SongZihuan 4 năm trước cách đây
mục cha
commit
ced19a033c

+ 5 - 0
CMakeLists.txt

@@ -43,6 +43,11 @@ MESSAGE(STATUS "vmcore on ${vmcore_BINARY_DIR}")
 LINK_DIRECTORIES(${vmcore_BINARY_DIR})  # 添加vmcore的构建目录为寻找lib的目录
 ADD_SUBDIRECTORY(${PROJECT_SOURCE_DIR}/vmcore)
 
+IF (PG)
+    ADD_COMPILE_OPTIONS(-pg)
+    ADD_LINK_OPTIONS(-pg)
+ENDIF()
+
 ADD_EXECUTABLE(VirtualMath main.c ${SRC_LIST})
 TARGET_LINK_LIBRARIES(VirtualMath vmcore)
 TARGET_INCLUDE_DIRECTORIES(vmcore PRIVATE HELLOVM_INCLUDE_DICT)

+ 4 - 1
vmcore/CMakeLists.txt

@@ -55,9 +55,12 @@ ENDIF()
 IF (PG)
     ADD_COMPILE_OPTIONS(-pg)
     ADD_LINK_OPTIONS(-pg)
+    ADD_LIBRARY(vmcore STATIC ${SRC})  ## debug模式下, 以静态库形式链接
+ELSE()
+    ADD_LIBRARY(vmcore SHARED ${SRC})
 ENDIF()
 
-ADD_LIBRARY(vmcore SHARED ${SRC})
+#ADD_LIBRARY(vmcore SHARED ${SRC})
 TARGET_LINK_LIBRARIES(vmcore ${libffi} ${libdl} m)
 TARGET_INCLUDE_DIRECTORIES(vmcore PRIVATE VMCORE_INCLUDE_DICT)
 SET_TARGET_PROPERTIES(vmcore PROPERTIES

+ 3 - 10
vmcore/gc/gc.c

@@ -230,18 +230,11 @@ static void gc_freezeHashTable(HashTable *ht, bool is_lock){
  * 冻结不可达的VarList的hashTable
  * @param inter
  * @param freeze
- * @param base
  * @param is_lock
  */
-void gc_freeze(Inter *inter, VarList *freeze, VarList *base, bool is_lock){
+void gc_freeze(Inter *inter, VarList *freeze, bool is_lock) {
     gc_resetBase(inter);
-    for (PASS; freeze != NULL; freeze = freeze->next){
-        for (VarList *src = base; src != NULL; src = src->next) {
-            if (src->hashtable != freeze->hashtable) {
-                gc_freezeHashTable(freeze->hashtable, is_lock);
-                break;
-            }
-        }
-    }
+    for (PASS; freeze != NULL; freeze = freeze->next)
+        gc_freezeHashTable(freeze->hashtable, is_lock);
 }
 #endif

+ 1 - 1
vmcore/include/gc.h

@@ -37,7 +37,7 @@ typedef struct GCStatus GCStatus;
 
 void gc_runDelAll(struct Inter *inter);
 
-void gc_freeze(struct Inter *inter, struct VarList *freeze, struct VarList *base, bool is_lock);
+void gc_freeze(struct Inter *inter, struct VarList *freeze, bool is_lock);
 void gc_run(struct Inter *inter, struct VarList *run_var, int var_list, int link_value, int value, ...);
 #else
 #define gc_addTmpLink(gcs) ((void)0)

+ 3 - 8
vmcore/include/macro.h

@@ -32,15 +32,10 @@
 #define WNUL ((wchar_t)0)
 
 #ifdef NDEBUG
-#define errasert(e) ((void)0)
+#define err_asert(e) ((void)0)
 #else
-#ifdef __assert_fail
-#define errasert(e) __assert_fail(#e, __FILE__, __LINE__, __ASSERT_FUNCTION)
-#elif defined(_assert)
-#define errasert(e) _assert(#e, __FILE__, __LINE__)
-#else
-#define errasert(e) fprintf(stderr, "%s %s %s %s\n", #e, __FILE__, __LINE__)
-#endif
+#define err_asert(e) fprintf(stderr, "%s %s %d\n", #e, __FILE__, __LINE__)
 #endif
 
+
 #endif //VIRTUALMATH_MACRO_H

+ 2 - 2
vmcore/ofunc/src/__ofunc.c

@@ -31,7 +31,7 @@ bool iterClassFunc(NameFunc *list, FUNC_NT){
     object_var->next = var_list;
     inter->data.default_pt_type = object_free_;
 
-    gc_freeze(inter, object_backup, NULL, true);
+    gc_freeze(inter, object_backup, true);
     for (PASS; list->of != NULL; list++) {
         LinkValue *value = registeredFunctionCore(list->of, list->name, CFUNC_NT(object_var, result, belong));
         if (!CHECK_RESULT(result)) {
@@ -41,7 +41,7 @@ bool iterClassFunc(NameFunc *list, FUNC_NT){
         value->value->data.function.function_data.pt_type = list->type;
         freeResult(result);
     }
-    gc_freeze(inter, object_backup, NULL, false);
+    gc_freeze(inter, object_backup, false);
 
     object_var->next = object_backup;
     inter->data.default_pt_type = bak;

+ 2 - 2
vmcore/ofunc/src/sys.c

@@ -233,7 +233,7 @@ ResultType vm_exec(O_FUNC){
         if (out)
             run->next = var_list;
         else
-            gc_freeze(inter, var_list, run, true);
+            gc_freeze(inter, var_list, true);
     } else
         run = var_list;
 
@@ -242,7 +242,7 @@ ResultType vm_exec(O_FUNC){
 
     if (var != NULL) {
         if (!out)
-            gc_freeze(inter, var_list, run, false);
+            gc_freeze(inter, var_list, false);
         freeVarList(run);
     }
 

+ 4 - 4
vmcore/src/__run.c

@@ -359,11 +359,11 @@ void addStrVar(wchar_t *name, bool free_old, bool setting, LinkValue *value, fli
 
 LinkValue *findAttributes(wchar_t *name, bool free_old, fline line, char *file, bool nowrun, FUNC_NT) {
     LinkValue *attr;
-    gc_freeze(inter, var_list, belong->value->object.var, true);
+    gc_freeze(inter, var_list, true);
     attr = findStrVar(name, free_old, line, file, nowrun, CFUNC_NT(belong->value->object.var, result, belong));
     if (attr != NULL && (attr->belong == NULL || attr->belong->value == belong->value || checkAttribution(belong->value, attr->belong->value)))
         attr->belong = belong;
-    gc_freeze(inter, var_list, belong->value->object.var, false);
+    gc_freeze(inter, var_list, false);
     return attr;
 }
 
@@ -383,9 +383,9 @@ bool addAttributes(wchar_t *name, bool free_old, LinkValue *value, fline line, c
         goto return_;
     GET_RESULT(name_, result);
 
-    gc_freeze(inter, var_list, belong->value->object.var, true);
+    gc_freeze(inter, var_list, true);
     addStrVarCore(false, var_name, name_, line, file, var_list, CFUNC_NT(belong->value->object.var, result, value));
-    gc_freeze(inter, var_list, belong->value->object.var, false);
+    gc_freeze(inter, var_list, false);
 
     gc_freeTmpLink(&name_->gc_status);
 

+ 6 - 6
vmcore/src/parameter.c

@@ -533,8 +533,8 @@ ResultType setParameterCore(fline line, char *file, Argument *call, Parameter *f
     function = copyParameter(function_base);
     tmp_function = function;
     setResultCore(result);
-    gc_freeze(inter, function_var, NULL, true);
-    gc_freeze(inter, var_list, NULL, true);
+    gc_freeze(inter, function_var, true);
+    gc_freeze(inter, var_list, true);
 
     while (true){
         if (call == NULL && function == NULL)
@@ -654,8 +654,8 @@ ResultType setParameterCore(fline line, char *file, Argument *call, Parameter *f
     setResult(result, inter);
 
     return_:
-    gc_freeze(inter, function_var, NULL, false);
-    gc_freeze(inter, var_list, NULL, false);
+    gc_freeze(inter, function_var, false);
+    gc_freeze(inter, var_list, false);
     freeParameter(tmp_function, true);
     return result->type;
 }
@@ -763,7 +763,7 @@ int parserNameArgument(ArgumentParser ap[], Argument *arg, ArgumentParser **bak,
     int return_;
     setResultCore(result);
 
-    gc_freeze(inter, var_list, NULL, true);
+    gc_freeze(inter, var_list, true);
     for (PASS; arg != NULL && arg->type != name_arg; arg = arg->next)
         PASS;
     if (arg == NULL) {
@@ -792,7 +792,7 @@ int parserNameArgument(ArgumentParser ap[], Argument *arg, ArgumentParser **bak,
 
     return_:
     freeVarList(tmp);
-    gc_freeze(inter, var_list, NULL, false);
+    gc_freeze(inter, var_list, false);
     if (bak != NULL)
         *bak = ap;
     return return_;

+ 2 - 3
vmcore/src/run.c

@@ -13,7 +13,7 @@ ResultType runStatement(FUNC) {
     setResultCore(result);
     gc_addTmpLink(&belong->gc_status);
 
-    switch (st->type) {  // TODO-list 优化: 只有指定的st需要执行gc
+    switch (st->type) {
         case base_value:
             type = getBaseValue(CNEXT);
             break;
@@ -46,7 +46,6 @@ ResultType runStatement(FUNC) {
             break;
         case slice_:
             type = elementSlice(CNEXT);
-            run_gc = true;
             break;
         case call_function:
             type = callBack(CNEXT);
@@ -168,7 +167,7 @@ ResultType runStatementOpt(FUNC) {  // 不运行gc机制
             break;
         default:
             setResult(result, inter);
-            errasert(runStatementOpt default);
+            err_asert(runStatementOpt default);
             break;
     }
 

+ 3 - 3
vmcore/src/runbranch.c

@@ -11,7 +11,7 @@ static bool checkNumber(FUNC){
 static void newBranchYield(Statement *branch_st, Statement *node, StatementList *sl_node, VarList *new_var, enum StatementInfoStatus status, Inter *inter){
     if (new_var != NULL)
         new_var->next = NULL;
-    gc_freeze(inter, new_var, NULL, true);
+    gc_freeze(inter, new_var, true);
     branch_st->info.var_list = new_var;
     branch_st->info.node = node->type == yield_code ? node->next : node;
     branch_st->info.branch.sl_node = sl_node;
@@ -715,7 +715,7 @@ ResultType withBranch(FUNC) {
         }
     }
 
-    gc_freeze(inter, new, var_list, true);
+    gc_freeze(inter, new, true);
     if (run_block) {
         if (vl_info == NULL)
             vl_info = with_list->code;
@@ -784,7 +784,7 @@ ResultType withBranch(FUNC) {
         result_from = info_finally_branch;
     }
 
-    gc_freeze(inter, new, var_list, false);
+    gc_freeze(inter, new, false);
     setWithResult(yield_run, with_list, st, result, value, _enter_, _exit_, with_belong, result_from, CFUNC_CORE(new));
     if (set_result)
         setResult(result, inter);

+ 7 - 7
vmcore/src/runcall.c

@@ -24,10 +24,10 @@ ResultType setClass(FUNC) {
         inter->data.default_pt_type = object_free_;
         tmp->value->object.var->next = var_list;
 
-        gc_freeze(inter, var_backup, NULL, true);
+        gc_freeze(inter, var_backup, true);
         // 运行类定义的时候需要调整belong
         functionSafeInterStatement(CFUNC(st->u.set_class.st, tmp->value->object.var, result, tmp));
-        gc_freeze(inter, var_backup, NULL, false);
+        gc_freeze(inter, var_backup, false);
 
         tmp->value->object.var->next = var_backup;
         inter->data.default_pt_type = pt_type_bak;
@@ -232,7 +232,7 @@ static ResultType callCFunction(LinkValue *func_value, Argument *arg, long int l
 
     of = func_value->value->data.function.of;
     function_var = pushVarList(func_value->value->object.out_var != NULL ? func_value->value->object.out_var : var_list, inter);
-    gc_freeze(inter, var_list, function_var, true);
+    gc_freeze(inter, var_list, true);
 
     freeResult(result);
     of(CO_FUNC(arg, function_var, result, func_value->belong));  // belong设置为func的belong, 方便权限的认定
@@ -241,7 +241,7 @@ static ResultType callCFunction(LinkValue *func_value, Argument *arg, long int l
     else if (result->type != R_opt && result->type != R_error)
         setResult(result, inter);
 
-    gc_freeze(inter, var_list, function_var, false);
+    gc_freeze(inter, var_list, false);
     popVarList(function_var);
     freeFunctionArgument(arg, bak);
 
@@ -465,7 +465,7 @@ static void updateFunctionYield(Statement *func_st, Statement *node){
 
 static void newFunctionYield(Statement *func_st, Statement *node, VarList *new_var, Inter *inter){
     new_var->next = NULL;
-    gc_freeze(inter, new_var, NULL, true);
+    gc_freeze(inter, new_var, true);
     func_st->info.var_list = new_var;
     func_st->info.node = node->type == yield_code ? node->next : node;
     func_st->info.have_info = true;
@@ -516,7 +516,7 @@ static ResultType callVMFunction(LinkValue *func_value, Argument *arg, long int
     if (yield_run)
         st_func = st_func->info.node;
 
-    gc_freeze(inter, var_list, var_func, true);
+    gc_freeze(inter, var_list, true);
     setFunctionArgument(&arg, &bak, func_value, line, file, pt_sep, CNEXT_NT);
     if (!CHECK_RESULT(result))
         goto return_;
@@ -534,7 +534,7 @@ static ResultType callVMFunction(LinkValue *func_value, Argument *arg, long int
     functionSafeInterStatement(CFUNC(st_func, var_func, result, func_value->belong));  // belong设置为函数的belong,方便权限校对
 
     return_:
-    gc_freeze(inter, var_list, var_func, false);
+    gc_freeze(inter, var_list, false);
     setFunctionResult(func_value, yield_run, result, CFUNC_CORE(var_func));
     gc_freeTmpLink(&func_value->gc_status);
     return result->type;

+ 4 - 4
vmcore/src/runfile.c

@@ -235,7 +235,7 @@ ResultType importFile(FUNC) {
     char md5_str[MD5_STRING];
 
     setResultCore(result);
-    gc_freeze(inter, var_list, NULL, true);
+    gc_freeze(inter, var_list, true);
 
     importFileCore(&path, &split_path, &status, CFUNC(file, var_list, result, belong));
     if (!CHECK_RESULT(result))
@@ -260,7 +260,7 @@ ResultType importFile(FUNC) {
     return_:
     memFree(split_path);
     memFree(path);
-    gc_freeze(inter, var_list, NULL, false);
+    gc_freeze(inter, var_list, false);
     return result->type;
 }
 
@@ -293,7 +293,7 @@ ResultType fromImportFile(FUNC) {
     Parameter *as = st->u.from_import_file.as != NULL ? st->u.from_import_file.as : st->u.from_import_file.pt;
 
     setResultCore(result);
-    gc_freeze(inter, var_list, NULL, true);
+    gc_freeze(inter, var_list, true);
     importFileCore(&path, &split_path, &status, CFUNC(file, var_list, result, belong));
     if (!CHECK_RESULT(result))
         goto return_;
@@ -332,6 +332,6 @@ ResultType fromImportFile(FUNC) {
     return_:
     memFree(path);
     memFree(split_path);
-    gc_freeze(inter, var_list, NULL, false);
+    gc_freeze(inter, var_list, false);
     return result->type;
 }

+ 7 - 7
vmcore/src/runoperation.c

@@ -81,7 +81,7 @@ static void updateBlockYield(Statement *block_st, Statement *node){
 
 static void newBlockYield(Statement *block_st, Statement *node, VarList *new_var, Inter *inter){
     new_var->next = NULL;
-    gc_freeze(inter, new_var, NULL, true);
+    gc_freeze(inter, new_var, true);
     block_st->info.var_list = new_var;
     block_st->info.node = node->type == yield_code ? node->next : node;
     block_st->info.have_info = true;
@@ -190,14 +190,14 @@ ResultType pointOperation(FUNC) {
         setResultError(E_TypeException, OBJ_NOTSUPPORT(->/.), st->line, st->code_file, true, CNEXT_NT);
         goto return_;
     }
-    gc_freeze(inter, var_list, object, true);
+    gc_freeze(inter, var_list, true);
     operationSafeInterStatement(CFUNC(st->u.operation.right, object, result, left));  // 点运算运算时需要调整belong为点的左值
     pri_auto = result->value->belong == NULL || result->value->belong->value == belong->value || checkAttribution(belong->value, result->value->belong->value);
     if (!CHECK_RESULT(result) || !checkAut(left->aut, result->value->aut, st->line, st->code_file, NULL, pri_auto, CNEXT_NT))
         PASS;
     else if (result->value->belong == NULL || result->value->belong->value == left->value || checkAttribution(left->value, result->value->belong->value))  // 检查result所属于的对象是否位左值的父亲
         result->value->belong = left;
-    gc_freeze(inter, var_list, object, false);
+    gc_freeze(inter, var_list, false);
 
     return_:
     gc_freeTmpLink(&left->gc_status);
@@ -273,12 +273,12 @@ ResultType pointDel(Statement *name, FUNC_NT) {
         goto return_;
     }
 
-    gc_freeze(inter, var_list, object, true);
+    gc_freeze(inter, var_list, true);
     if (right->type == T_OPERATION && (right->u.operation.OperationType == OPT_POINT || right->u.operation.OperationType == OPT_OUTPOINT))
         pointDel(name->u.operation.right, CFUNC_NT(object, result, belong));
     else
         delCore(name->u.operation.right, true, CFUNC_NT(object, result, belong));
-    gc_freeze(inter, var_list, object, false);
+    gc_freeze(inter, var_list, false);
 
     return_:
     gc_freeTmpLink(&left->gc_status);
@@ -491,12 +491,12 @@ ResultType pointAss(Statement *name, LinkValue *value, FUNC_NT) {
         goto return_;
     }
 
-    gc_freeze(inter, var_list, object, true);
+    gc_freeze(inter, var_list, true);
     if (right->type == T_OPERATION && (right->u.operation.OperationType == OPT_POINT || right->u.operation.OperationType == OPT_OUTPOINT))
         pointAss(name->u.operation.right, value, CFUNC_NT(object, result, belong));
     else
         assCore(name->u.operation.right, value, true, false, CFUNC_NT(object, result, belong));
-    gc_freeze(inter, var_list, object, false);
+    gc_freeze(inter, var_list, false);
 
     return_:
     gc_freeTmpLink(&left->gc_status);