Bladeren bron

refactor: 修改了gc_run函数的细节

SongZihuan 4 jaren geleden
bovenliggende
commit
b4487913f5
6 gewijzigde bestanden met toevoegingen van 39 en 75 verwijderingen
  1. 7 2
      CMakeLists.txt
  2. 1 17
      vmcore/gc/gc.c
  3. 1 1
      vmcore/include/gc.h
  4. 1 1
      vmcore/src/run.c
  5. 15 24
      vmcore/src/value.c
  6. 14 30
      vmcore/src/var.c

+ 7 - 2
CMakeLists.txt

@@ -6,10 +6,15 @@ OPTION(GC "GC" ON)
 OPTION(PG "PG" OFF)
 OPTION(SET_DEBUG "SET_DEBUG" ON)
 
-SET(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/lib-${CMAKE_BUILD_TYPE})
+IF (NOT PG)
+    SET(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/lib-${CMAKE_BUILD_TYPE})
+    SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin-${CMAKE_BUILD_TYPE})
+ELSE()
+    SET(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/lib-pg${CMAKE_BUILD_TYPE})
+    SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin-pg${CMAKE_BUILD_TYPE})
+ENDIF()
 SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH})
 SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH})
-SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin-${CMAKE_BUILD_TYPE})
 
 SET(HELLOVM_INCLUDE_DICT
         ${CMAKE_CURRENT_SOURCE_DIR}/include

+ 1 - 17
vmcore/gc/gc.c

@@ -183,24 +183,8 @@ static void gc_freeBase(Inter *inter){
             var_base = &(*var_base)->gc_next;
 }
 
-void gc_run(Inter *inter, VarList *run_var, int var_list, int link_value, int value, ...){
+void gc_run(Inter *inter, VarList *run_var){
     gc_resetBase(inter);
-    va_list arg;
-    va_start(arg, value);
-    for (int i =0;i < var_list;i ++){
-        VarList *tmp = va_arg(arg, VarList *);
-        gc_varList(tmp);
-    }
-    for (int i =0;i < link_value;i ++){
-        LinkValue *tmp = va_arg(arg, LinkValue *);
-        gc_iterLinkValue(tmp);
-    }
-    for (int i =0;i < value;i ++){
-        Value *tmp = va_arg(arg, Value *);
-        gc_iterValue(tmp);
-    }
-    va_end(arg);
-
     gc_checkBase(inter);
     gc_checkDel(inter);
     gc_freeBase(inter);

+ 1 - 1
vmcore/include/gc.h

@@ -35,7 +35,7 @@ typedef struct GCStatus GCStatus;
 #define gc_freeStatementLink(gcs) ((gcs)->statement_link --)
 #define setGC(gcs) ((gcs)->continue_ = false, (gcs)->link = 0, (gcs)->tmp_link = 0, (gcs)->statement_link = 0, (gcs)->c_value = not_free)
 void gc_runDelAll(struct Inter *inter);
-void gc_run(struct Inter *inter, struct VarList *run_var, int var_list, int link_value, int value, ...);
+void gc_run(struct Inter *inter, struct VarList *run_var);
 #else
 #define gc_addTmpLink(gcs) ((void)0)
 #define gc_addStatementLink(gcs) ((void)0)

+ 1 - 1
vmcore/src/run.c

@@ -127,7 +127,7 @@ ResultType runStatement(FUNC) {
     gc_freeTmpLink(&belong->gc_status);
 #if START_GC
     if (run_gc)
-        gc_run(inter, var_list, 1, 2, 0, var_list, belong, result->value);
+        gc_run(inter, var_list);
 #endif
     return type;
 }

+ 15 - 24
vmcore/src/value.c

@@ -1,12 +1,15 @@
 #include "__run.h"
 
 Value *makeObject(Inter *inter, VarList *object, VarList *out_var, Inherit *inherit) {
-    Value *tmp, *list_tmp = inter->base;
+    register Value **list_tmp = &inter->base;
+    Value *last;
+    Value *tmp;
     tmp = memCalloc(1, sizeof(Value));
     setGC(&tmp->gc_status);
     gc_addTmpLink(&tmp->gc_status);
     tmp->type = V_obj;
     tmp->gc_next = NULL;
+
     if (inter->data.base_obj[B_OBJECT] != NULL && inherit == NULL)
         inherit = makeInherit(inter->data.base_obj[B_OBJECT]);
     if (out_var == NULL && inherit != NULL)
@@ -15,18 +18,11 @@ Value *makeObject(Inter *inter, VarList *object, VarList *out_var, Inherit *inhe
     tmp->object.out_var = out_var;
     tmp->object.inherit = inherit;
 
-    if (list_tmp == NULL){
-        inter->base = tmp;
-        tmp->gc_last = NULL;
-        goto return_;
-    }
-    for (PASS; list_tmp->gc_next != NULL; list_tmp = list_tmp->gc_next)
-        PASS;
-
-    list_tmp->gc_next = tmp;
-    tmp->gc_last = list_tmp;
+    for (last = NULL; (*list_tmp) != NULL; list_tmp = &(*list_tmp)->gc_next)
+        last = *list_tmp;
 
-    return_:
+    *list_tmp = tmp;
+    tmp->gc_last = last;
     return tmp;
 }
 
@@ -272,26 +268,21 @@ void freeValue(Value **value) {
 }
 
 LinkValue *makeLinkValue(Value *value, LinkValue *belong, Inter *inter){  // TODO-szh 为LinkValue添加gc_tmpLink
+    LinkValue **list_tmp = &inter->link_base;
+    LinkValue *last;
     LinkValue *tmp;
-    LinkValue *list_tmp = inter->link_base;
     tmp = memCalloc(1, sizeof(Value));
     tmp->belong = belong;
     tmp->value = value;
+    tmp->gc_next = NULL;
     setGC(&tmp->gc_status);
-    if (list_tmp == NULL){
-        inter->link_base = tmp;
-        tmp->gc_last = NULL;
-        goto return_;
-    }
 
-    for (PASS; list_tmp->gc_next != NULL; list_tmp = list_tmp->gc_next)
-        PASS;
+    for (last = NULL; *list_tmp != NULL; list_tmp = &(*list_tmp)->gc_next)
+        last = *list_tmp;
 
-    list_tmp->gc_next = tmp;
-    tmp->gc_last = list_tmp;
+    *list_tmp = tmp;
+    tmp->gc_last = last;
     tmp->aut = auto_aut;
-
-    return_:
     return tmp;
 }
 

+ 14 - 30
vmcore/src/var.c

@@ -1,7 +1,8 @@
 #include "__virtualmath.h"
 
 Var *makeVar(wchar_t *name, LinkValue *value, LinkValue *name_, Inter *inter) {
-    Var *list_tmp = inter->base_var;
+    Var **list_tmp = &inter->base_var;
+    Var *last;
     Var *tmp;
     tmp = memCalloc(1, sizeof(Var));
     setGC(&tmp->gc_status);
@@ -9,22 +10,12 @@ Var *makeVar(wchar_t *name, LinkValue *value, LinkValue *name_, Inter *inter) {
     tmp->value = copyLinkValue(value, inter);
     tmp->name_ = copyLinkValue(name_, inter);
     tmp->next = NULL;
-
     tmp->gc_next = NULL;
-    tmp->gc_last = NULL;
-
-    if (list_tmp == NULL){
-        inter->base_var = tmp;
-        tmp->gc_last = NULL;
-        goto return_;
-    }
 
-    for (PASS; list_tmp->gc_next !=  NULL; list_tmp = list_tmp->gc_next)
-            PASS;
-    list_tmp->gc_next = tmp;
-    tmp->gc_last = list_tmp;
-
-    return_:
+    for (last = NULL; *list_tmp !=  NULL; list_tmp = &(*list_tmp)->gc_next)
+        last = *list_tmp;
+    *list_tmp = tmp;
+    tmp->gc_last = last;
     return tmp;
 }
 
@@ -42,26 +33,19 @@ void freeVar(Var **var) {
 }
 
 HashTable *makeHashTable(Inter *inter) {
-    HashTable *list_tmp = inter->hash_base;
+    register HashTable **list_tmp = &inter->hash_base;
+    HashTable *last;
     HashTable *tmp;
     tmp = memCalloc(1, sizeof(Value));
     tmp->hashtable = (Var **)calloc(MAX_SIZE, sizeof(Var *));
     setGC(&tmp->gc_status);
+    gc_addTmpLink(&tmp->gc_status);
     tmp->gc_next = NULL;
-    tmp->gc_last = NULL;
 
-    if (list_tmp == NULL){
-        inter->hash_base = tmp;
-        tmp->gc_last = NULL;
-        goto return_;
-    }
-
-    for (PASS; list_tmp->gc_next != NULL; list_tmp = list_tmp->gc_next)
-        PASS;
-    list_tmp->gc_next = tmp;
-    tmp->gc_last = list_tmp;
-
-    return_:
+    for (last = NULL; *list_tmp != NULL; list_tmp = &(*list_tmp)->gc_next)
+        last = *list_tmp;
+    *list_tmp = tmp;
+    tmp->gc_last = last;
     return tmp;
 }
 
@@ -86,8 +70,8 @@ VarList *makeVarList(Inter *inter, bool make_hash, HashTable *hs) {
     else {
         assert(hs != NULL);
         tmp->hashtable = hs;
+        gc_addTmpLink(&tmp->hashtable->gc_status);
     }
-    gc_addTmpLink(&tmp->hashtable->gc_status);
     tmp->default_var = NULL;
     return tmp;
 }