فهرست منبع

feat: 添加cmake参数

-DGC 定义是否启动GC
-CMAKE_BUILD_TYPE 定义构建方式 (Debug模式将会有gc机制的输出)
SongZihuan 4 سال پیش
والد
کامیت
e459de7d6b

+ 20 - 4
CMakeLists.txt

@@ -2,13 +2,29 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.16)
 PROJECT(VirtualMath C)
 SET(CMAKE_C_STANDARD 11)
 
-INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
-INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/VirtulMathCore/include)
+OPTION(GC "GC" ON)
 
-AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/src SRC_LIST)
-AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/argument ARGUMENT_LIST)
+IF (${CMAKE_BUILD_TYPE} STREQUAL Debug)
+    ADD_DEFINITIONS(-DDEBUG=1)
+ELSE()
+    ADD_DEFINITIONS(-DDEBUG=0)
+ENDIF()
+
+IF (${GC})
+    ADD_DEFINITIONS(-DSTART_GC=1)
+ELSE()
+    ADD_DEFINITIONS(-DSTART_GC=0)
+ENDIF()
+
+ADD_DEFINITIONS(-DCC=\"${CMAKE_C_COMPILER}\")
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/VirtulMathCore/include)
+
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRC_LIST)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/argument ARGUMENT_LIST)
 
 MESSAGE("project dir is ${PROJECT_SOURCE_DIR}")
+MESSAGE("cmake file in is ${CMAKE_CURRENT_SOURCE_DIR}")
 
 ADD_SUBDIRECTORY(${PROJECT_SOURCE_DIR}/VirtulMathCore)
 ADD_EXECUTABLE(VirtualMath main.c ${SRC_LIST} ${ARGUMENT_LIST})

+ 0 - 34
VirtulMathCore/gc/freeze.c

@@ -1,34 +0,0 @@
-#include "__virtualmath.h"
-
-void gc_freezeHashTable(HashTable *ht, bool is_lock){
-    if (ht == NULL)
-        return;
-
-    if (is_lock)
-        gc_addTmpLink(&ht->gc_status);
-    else
-        gc_freeTmpLink(&ht->gc_status);
-
-    gc_IterAlready(&ht->gc_status);
-}
-
-void gc_iterFreezeVarList(VarList *freeze, VarList *base, bool is_lock){
-    for (PASS; freeze != NULL; freeze = freeze->next){
-        if (!comparVarList(freeze, base))
-            gc_freezeHashTable(freeze->hashtable, 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){
-#if START_GC
-    gc_resetBase(inter);
-    gc_iterFreezeVarList(freeze, base, is_lock);
-#endif
-}

+ 106 - 19
VirtulMathCore/gc/gc.c

@@ -1,25 +1,84 @@
 #include "__virtualmath.h"
 
-void gc_iterLinkValue(LinkValue *value){
+#if START_GC
+static void gc_iterVar(Var *var);
+static void gc_iterLinkValue(LinkValue *value);
+static void gc_fatherValue(Inherit *value);
+static void gc_iterValue(Value *value);
+static void gc_varList(VarList *vl);
+static void gc_iterHashTable(HashTable *ht);
+
+static void resetGC(GCStatus *gcs){
+    gcs->continue_ = false;
+    gcs->link = 0;
+}
+
+void setGC(GCStatus *gcs){
+    resetGC(gcs);
+    gcs->tmp_link = 0;
+    gcs->statement_link = 0;
+    gcs->c_value = not_free;
+}
+
+void gc_addTmpLink(GCStatus *gcs){
+    gcs->tmp_link ++;
+}
+
+void gc_addLink(GCStatus *gcs){
+    gcs->link ++;
+}
+
+void gc_addStatementLink(GCStatus *gcs){
+    gcs->statement_link ++;
+}
+
+void gc_freeStatementLink(GCStatus *gcs){
+    gcs->statement_link --;
+}
+
+void gc_freeTmpLink(GCStatus *gcs){
+    gcs->tmp_link --;
+}
+
+static bool gc_iterAlready(GCStatus *gcs){
+    bool return_ = gcs->continue_;
+    gcs->continue_ = true;
+    return return_;
+}
+
+static bool gc_needFree(GCStatus *gcs){
+    return (gcs->statement_link == 0 && gcs->tmp_link == 0 && gcs->link == 0);
+}
+
+static void gc_resetValue(Value *value){
+    value->gc_status.c_value = not_free;
+}
+
+static bool gc_needFreeValue(Value *value){
+    return (gc_needFree(&value->gc_status) && value->gc_status.c_value == need_free);
+}
+
+
+static void gc_iterLinkValue(LinkValue *value){
     if (value == NULL)
         return;
     gc_addLink(&value->gc_status);
-    if (!gc_IterAlready(&value->gc_status)){
+    if (!gc_iterAlready(&value->gc_status)){
         gc_iterLinkValue(value->belong);
         gc_iterValue(value->value);
     }
 }
 
-void gc_fatherValue(Inherit *value){
+static void gc_fatherValue(Inherit *value){
     for (PASS; value != NULL; value = value->next)
         gc_iterLinkValue(value->value);
 }
 
-void gc_iterValue(Value *value){
+static void gc_iterValue(Value *value){
     if (value == NULL)
         return;
     gc_addLink(&value->gc_status);
-    if (gc_IterAlready(&value->gc_status))
+    if (gc_iterAlready(&value->gc_status))
         return;
     gc_varList(value->object.var);
     gc_varList(value->object.out_var);
@@ -38,25 +97,25 @@ void gc_iterValue(Value *value){
     }
 }
 
-void gc_varList(VarList *vl){
+static void gc_varList(VarList *vl){
     for (PASS; vl != NULL; vl = vl->next)
         gc_iterHashTable(vl->hashtable);
 }
 
-void gc_iterHashTable(HashTable *ht){
+static void gc_iterHashTable(HashTable *ht){
     if (ht == NULL)
         return;
     gc_addLink(&ht->gc_status);
-    if (gc_IterAlready(&ht->gc_status))
+    if (gc_iterAlready(&ht->gc_status))
         return;
     for (int i=0;i < MAX_SIZE;i++)
         gc_iterVar(ht->hashtable[i]);
 }
 
-void gc_iterVar(Var *var){
+static void gc_iterVar(Var *var){
     if (var == NULL)
         return;
-    if (gc_IterAlready(&var->gc_status))
+    if (gc_iterAlready(&var->gc_status))
         return;
     for (PASS; var != NULL; var = var->next){
         gc_addLink(&var->gc_status);
@@ -65,7 +124,7 @@ void gc_iterVar(Var *var){
     }
 }
 
-void gc_resetBase(Inter *inter){
+static void gc_resetBase(Inter *inter){
     for (Value *value_base = inter->base; value_base != NULL; value_base = value_base->gc_next)
         resetGC(&value_base->gc_status);
 
@@ -79,7 +138,7 @@ void gc_resetBase(Inter *inter){
         resetGC(&var_base->gc_status);
 }
 
-void gc_checkBase(Inter *inter){
+static void gc_checkBase(Inter *inter){
     for (Value *value_base = inter->base; value_base != NULL; value_base = value_base->gc_next)
         if (!gc_needFree(&value_base->gc_status) && !value_base->gc_status.continue_)
             gc_iterValue(value_base);
@@ -97,7 +156,7 @@ void gc_checkBase(Inter *inter){
             gc_iterVar(var_base);
 }
 
-void gc_checkDel(Inter *inter){
+static void gc_checkDel(Inter *inter){
     for (Value *value = inter->base; value != NULL; value = value->gc_next)
         if (!gc_needFree(&value->gc_status))
             gc_resetValue(value);
@@ -126,7 +185,7 @@ void gc_runDelAll(Inter *inter){
     }
 }
 
-void gc_runDel(Inter *inter, VarList *var_list){
+static void gc_runDel(Inter *inter, VarList *var_list){
     Result result;
     setResultCore(&result);
     for (Value *value = inter->base; value != NULL; value = value->gc_next) {
@@ -142,8 +201,7 @@ void gc_runDel(Inter *inter, VarList *var_list){
     }
 }
 
-void gc_freeBase(Inter *inter){
-#if START_GC
+static void gc_freeBase(Inter *inter){
     for (Value **value_base = &inter->base; *value_base != NULL;)
         if (gc_needFreeValue(*value_base))
             freeValue(value_base);
@@ -167,11 +225,9 @@ void gc_freeBase(Inter *inter){
             freeVar(var_base);
         else
             var_base = &(*var_base)->gc_next;
-#endif
 }
 
 void gc_run(Inter *inter, VarList *run_var, int var_list, int link_value, int value, ...){
-#if START_GC
     gc_resetBase(inter);
     va_list arg;
     va_start(arg, value);
@@ -192,5 +248,36 @@ void gc_run(Inter *inter, VarList *run_var, int var_list, int link_value, int va
     gc_checkDel(inter);
     gc_freeBase(inter);
     gc_runDel(inter, run_var);
-#endif
 }
+
+static void gc_freezeHashTable(HashTable *ht, bool is_lock){
+    if (ht == NULL)
+        return;
+
+    if (is_lock)
+        gc_addTmpLink(&ht->gc_status);
+    else
+        gc_freeTmpLink(&ht->gc_status);
+
+    gc_iterAlready(&ht->gc_status);
+}
+
+static void gc_iterFreezeVarList(VarList *freeze, VarList *base, bool is_lock){
+    for (PASS; freeze != NULL; freeze = freeze->next){
+        if (!comparVarList(freeze, base))
+            gc_freezeHashTable(freeze->hashtable, 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){
+    gc_resetBase(inter);
+    gc_iterFreezeVarList(freeze, base, is_lock);
+}
+#endif

+ 0 - 51
VirtulMathCore/gc/set.c

@@ -1,51 +0,0 @@
-#include "__virtualmath.h"
-
-void resetGC(GCStatus *gcs){
-    gcs->continue_ = false;
-    gcs->link = 0;
-}
-
-void setGC(GCStatus *gcs){
-    resetGC(gcs);
-    gcs->tmp_link = 0;
-    gcs->statement_link = 0;
-    gcs->c_value = not_free;
-}
-
-void gc_addTmpLink(GCStatus *gcs){
-    gcs->tmp_link ++;
-}
-
-void gc_addLink(GCStatus *gcs){
-    gcs->link ++;
-}
-
-void gc_addStatementLink(GCStatus *gcs){
-    gcs->statement_link ++;
-}
-
-void gc_freeStatementLink(GCStatus *gcs){
-    gcs->statement_link --;
-}
-
-void gc_freeTmpLink(GCStatus *gcs){
-    gcs->tmp_link --;
-}
-
-bool gc_IterAlready(GCStatus *gcs){
-    bool return_ = gcs->continue_;
-    gcs->continue_ = true;
-    return return_;
-}
-
-bool gc_needFree(GCStatus *gcs){
-    return (gcs->statement_link == 0 && gcs->tmp_link == 0 && gcs->link == 0);
-}
-
-void gc_resetValue(Value *value){
-    value->gc_status.c_value = not_free;
-}
-
-bool gc_needFreeValue(Value *value){
-    return (gc_needFree(&value->gc_status) && value->gc_status.c_value == need_free);
-}

+ 0 - 1
VirtulMathCore/include/__virtualmath.h

@@ -22,7 +22,6 @@
 #include "syntax.h"
 #include "grammar.h"
 
-#define DEBUG 1
 #if DEBUG
 /* DEBUG */
 void printGC(Inter *inter);

+ 17 - 22
VirtulMathCore/include/gc.h

@@ -1,6 +1,5 @@
 #ifndef VIRTUALMATH_GC_H
 #define VIRTUALMATH_GC_H
-#define START_GC true
 
 struct Inter;
 struct Value;
@@ -9,6 +8,7 @@ struct HashTable;
 struct Var;
 struct VarList;
 
+#if START_GC
 struct GCStatus{
     long int tmp_link;  // tmp link的次数
     long int statement_link;  // statement link的次数
@@ -20,37 +20,32 @@ struct GCStatus{
     } c_value;  // value的计数 (先call __del__ 后释放)
     bool continue_;  // 是否迭代过
 };
+#else
+struct GCStatus {};
+#endif
 
 typedef struct GCStatus GCStatus;
 
-void resetGC(GCStatus *gcs);
+
+#if START_GC
 void setGC(GCStatus *gcs);
 void gc_addTmpLink(GCStatus *gcs);
-void gc_addLink(GCStatus *gcs);
 void gc_addStatementLink(GCStatus *gcs);
-void gc_freeStatementLink(GCStatus *gcs);
 void gc_freeTmpLink(GCStatus *gcs);
-bool gc_IterAlready(GCStatus *gcs);
-bool gc_needFree(GCStatus *gcs);
-void gc_resetValue(struct Value *value);
-bool gc_needFreeValue(struct Value *value);
-
-void gc_freeBase(struct Inter *inter);
-void gc_checkDel(struct Inter *inter);
+void gc_freeStatementLink(GCStatus *gcs);
 void gc_runDelAll(struct Inter *inter);
-void gc_runDel(struct Inter *inter, struct VarList *var_list);
-void gc_checkBase(struct Inter *inter);
-void gc_resetBase(struct Inter *inter);
-
-void gc_iterValue(struct Value *value);
-void gc_iterLinkValue(struct LinkValue *value);
-void gc_iterHashTable(struct HashTable *ht);
-void gc_iterVar(struct Var *var);
-void gc_varList(struct VarList *vl);
 
-void gc_iterFreezeVarList(struct VarList *freeze, struct VarList *base, bool is_lock);
 void gc_freeze(struct Inter *inter, struct VarList *freeze, struct VarList *base, bool is_lock);
-
 void gc_run(struct Inter *inter, struct VarList *run_var, int var_list, int link_value, int value, ...);
+#else
+#define gc_freeze(...)
+#define gc_run(...)
+#define setGC(...)
+#define gc_addTmpLink(...)
+#define gc_addStatementLink(...)
+#define gc_freeTmpLink(...)
+#define gc_freeStatementLink(...)
+#define gc_runDelAll(...)
+#endif
 
 #endif //VIRTUALMATH_GC_H

+ 6 - 2
VirtulMathCore/src/inter.c

@@ -243,10 +243,11 @@ Inter *deriveInter(LinkValue *belong, Inter *inter) {
     return import_inter;
 }
 
-#if DEBUG == 1
+#if DEBUG
 /* ***********************DEBUG 专用函数*********************************** */
 
 void printGC(Inter *inter){
+#if START_GC
     long int lv_st = 0;
     long int lv_tmp = 0;
     long int v_st = 0;
@@ -265,9 +266,11 @@ void printGC(Inter *inter){
     printf("hashtable tmp       link = %ld\n", h_tmp);
     printf("      tmp link     count = %ld\n", lv_tmp + v_tmp + h_tmp);
     printf("statement link     count = %ld\n", lv_st + v_st);
+#endif
 
 }
 
+#if START_GC
 void printLinkValueGC(char *tag, Inter *inter, long *tmp_link, long *st_link) {
     LinkValue *base = inter->link_base;
     long tmp = 0;
@@ -392,4 +395,5 @@ void printTokenStream(TokenStream *ts) {
     }
     printf("\n");
 }
-#endif
+#endif  // START_GC
+#endif  // DBUG

+ 10 - 4
VirtulMathCore/src/run.c

@@ -109,7 +109,9 @@ ResultType runStatement(INTER_FUNCTIONSIG) {
     if (RUN_TYPE(type) && result->value->aut == auto_aut)
         result->value->aut = st->aut;
     result->node = st;
+#if START_GC
     gc_run(inter, var_list, 1, 0, 0, var_list);
+#endif
     return type;
 }
 
@@ -134,7 +136,7 @@ bool checkSignal(ResultType *type, fline line, char *file, INTER_FUNCTIONSIG_NOT
 ResultType iterStatement(INTER_FUNCTIONSIG) {
     Statement *base;
     ResultType type;
-//    void *bak = NULL;
+    void *bak = NULL;
 
     setResultCore(result);
     if (st == NULL){
@@ -142,8 +144,8 @@ ResultType iterStatement(INTER_FUNCTIONSIG) {
         return result->type;
     }
 
-//    is_KeyInterrupt = signal_reset;
-//    signal(SIGINT, signalStopInter);
+    is_KeyInterrupt = signal_reset;
+    signal(SIGINT, signalStopInter);
     do {
         base = st;
         if (checkSignal(&type, base->line, base->code_file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong)))
@@ -176,8 +178,10 @@ ResultType iterStatement(INTER_FUNCTIONSIG) {
         setResultOperationNone(result, inter, belong);
     result->node = base;
 
+#if START_GC
     gc_run(inter, var_list, 1, 0, 0, var_list);
-//    signal(SIGINT, bak);
+#endif
+    signal(SIGINT, bak);
     return result->type;
 }
 
@@ -234,8 +238,10 @@ ResultType globalIterStatement(Result *result, Inter *inter, Statement *st) {
         setResultOperationNone(result, inter, belong);
     result->node = base;
 
+#if START_GC
     gc_freeTmpLink(&belong->gc_status);
     gc_run(inter, var_list, 1, 0, 0, var_list);
+#endif
 
     signal(SIGINT, bak);
     return result->type;

+ 2 - 2
argument/argument.c

@@ -2,9 +2,9 @@
 
 char *HelloString = "Welcome To VirtualMath ("__TIME__", "__DATE__") \n"
 #ifdef __linux__
-                    "On Linux\n"
+                    "On Linux ("CC")\n"
 #else
-                    "On windows"
+                    "On windows ("CC")\n"
 #endif
                     "VirtualMath Command Line Mode\n";