瀏覽代碼

feat: 守护器新增是否派生字段

SongZihuan 3 年之前
父節點
當前提交
c171dfbe7d
共有 6 個文件被更改,包括 21 次插入13 次删除
  1. 1 1
      include/core/env.h
  2. 1 0
      include/runtime/runtime.h
  3. 2 1
      src/core/__env.h
  4. 15 9
      src/core/env.c
  5. 1 1
      src/runtime/runtime.c
  6. 1 1
      test/src/run_code.c

+ 1 - 1
include/core/env.h

@@ -82,7 +82,7 @@ AFUN_CORE_EXPORT void setEnvVarNumber(char *name, int32_t data, af_Environment *
 AFUN_CORE_EXPORT bool addTopMsgProcess(char *type, DLC_SYMBOL(TopMsgProcessFunc) func, af_Environment *env);
 
 /* 顶层消息处理器 相关操作 */
-AFUN_CORE_EXPORT bool addGuardian(char *type, bool always, size_t size, DLC_SYMBOL(GuardianFunc) func,
+AFUN_CORE_EXPORT bool addGuardian(char *type, bool always, bool derive, size_t size, DLC_SYMBOL(GuardianFunc) func,
                                   DLC_SYMBOL(GuardianDestruct) destruct, void **pdata, af_Environment *env);
 AFUN_CORE_EXPORT bool popGuardian(char *type, af_Environment *env);
 

+ 1 - 0
include/runtime/runtime.h

@@ -53,6 +53,7 @@ typedef struct GuardianFuncList GuardianFuncList;
 struct GuardianFuncList {
     char *type;
     bool always;
+    bool derive;
     size_t size;
 
     DlcHandle *dlc;  // func/destruct 的 来源

+ 2 - 1
src/core/__env.h

@@ -182,7 +182,8 @@ struct af_Guardian {  // 守护器
     size_t size;
     DLC_SYMBOL(GuardianFunc) func;
     DLC_SYMBOL(GuardianDestruct) destruct;
-    bool always;
+    bool always;  // 是否总是运行
+    bool derive;  // 是否支持派生
     struct af_Guardian *next;
 };
 

+ 15 - 9
src/core/env.c

@@ -41,7 +41,8 @@ static void freeAllTopMsgProcess(af_TopMsgProcess *mp);
 static af_TopMsgProcess *findTopMsgProcessFunc(char *type, af_Environment *env);
 
 /* 守护器 创建与释放 */
-static af_Guardian *makeGuardian(char *type, bool always, size_t size, DLC_SYMBOL(GuardianFunc) func, DLC_SYMBOL(GuardianDestruct) destruct);
+static af_Guardian *makeGuardian(char *type, bool always, bool derive, size_t size, DLC_SYMBOL(GuardianFunc) func,
+                                 DLC_SYMBOL(GuardianDestruct) destruct);
 static af_Guardian *freeGuardian(af_Guardian *gd, af_Environment *env);
 static void freeAllGuardian(af_Guardian *gd, af_Environment *env);
 
@@ -59,7 +60,7 @@ static void freeAllLiteralRegex(af_LiteralRegex *lr);
 
 /* EnvironmentList 创建与释放 */
 static af_EnvironmentList *makeEnvironmentList(af_Environment *env);
-static bool freeEnvironmentList(af_EnvironmentList *envl, af_Environment *env);
+static bool freeEnvironmentList(af_EnvironmentList *envl, af_Environment *base);
 
 /* af_ErrorBacktracking 创建与释放 */
 static af_ErrorBacktracking *makeErrorBacktracking(FileLine line, FilePath file, char *note);
@@ -919,11 +920,11 @@ af_Environment *makeEnvironment(enum GcRunTime grt) {
 
     /* 设置守护器 */
     DLC_SYMBOL(GuardianFunc) func4 = MAKE_SYMBOL(guardian_Signal, GuardianFunc);
-    addGuardian("SIGNAL", false, 0, func4, NULL, NULL, env);
+    addGuardian("SIGNAL", false, false, 0, func4, NULL, NULL, env);
     FREE_SYMBOL(func4);
 
     DLC_SYMBOL(GuardianFunc) func5 = MAKE_SYMBOL(guardian_GC, GuardianFunc);
-    addGuardian("GC", true, 0, func5, NULL, NULL, env);
+    addGuardian("GC", true, false, 0, func5, NULL, NULL, env);
     FREE_SYMBOL(func5);
 
     env->status = core_init;
@@ -978,8 +979,10 @@ af_Environment *deriveEnvironment(bool derive_tmp, bool derive_guardian, bool de
     }
 
     if (derive_guardian) {
-        for (af_Guardian *gu = base->guardian; gu != NULL; gu = gu->next)
-            addGuardian(gu->type, gu->always, gu->size, gu->func, gu->destruct, NULL, env);
+        for (af_Guardian *gu = base->guardian; gu != NULL; gu = gu->next) {
+            if (gu->derive)
+                addGuardian(gu->type, gu->always, true, gu->size, gu->func, gu->destruct, NULL, env);
+        }
     }
 
     if (derive_lr) {
@@ -1072,10 +1075,12 @@ bool addTopMsgProcess(char *type, DLC_SYMBOL(TopMsgProcessFunc) func, af_Environ
     return true;
 }
 
-static af_Guardian *makeGuardian(char *type, bool always, size_t size, DLC_SYMBOL(GuardianFunc) func, DLC_SYMBOL(GuardianDestruct) destruct) {
+static af_Guardian *makeGuardian(char *type, bool always, bool derive, size_t size, DLC_SYMBOL(GuardianFunc) func,
+                                 DLC_SYMBOL(GuardianDestruct) destruct){
     af_Guardian *gd = calloc(1, sizeof(af_Guardian));
     gd->type = strCopy(type);
     gd->always = always;
+    gd->derive = derive;
 
     if (size != 0) {
         gd->data = calloc(1, size);
@@ -1115,12 +1120,13 @@ static af_Guardian *findGuardian(char *type, af_Environment *env) {
     return NULL;
 }
 
-bool addGuardian(char *type, bool always, size_t size, DLC_SYMBOL(GuardianFunc) func, DLC_SYMBOL(GuardianDestruct) destruct, void **pdata, af_Environment *env) {
+bool addGuardian(char *type, bool always, bool derive, size_t size, DLC_SYMBOL(GuardianFunc) func,
+                 DLC_SYMBOL(GuardianDestruct) destruct, void **pdata, af_Environment *env){
     af_Guardian *gd = findGuardian(type, env);
     if (gd != NULL)
         return false;
 
-    gd = makeGuardian(type, always, size, func, destruct);
+    gd = makeGuardian(type, always, derive, size, func, destruct);
     gd->next = env->guardian;
     env->guardian = gd;
     if (pdata != NULL)

+ 1 - 1
src/runtime/runtime.c

@@ -194,7 +194,7 @@ void makeGuardianFromList(const GuardianFuncList gd_list[], af_Environment *env)
         if (pdata == NULL)
             pdata = &tmp;
 
-        if (addGuardian(gdl->type, gdl->always, gdl->size, func, destruct, pdata, env))
+        if (addGuardian(gdl->type, gdl->always, gdl->derive, gdl->size, func, destruct, pdata, env))
             gdl->initData(*pdata, env);
 
         if (free_func_)

+ 1 - 1
test/src/run_code.c

@@ -1211,7 +1211,7 @@ INIT_ERROR:
         DLC_SYMBOL(GuardianFunc) func = MAKE_SYMBOL(gd_func, GuardianFunc);
         DLC_SYMBOL(GuardianDestruct) des = MAKE_SYMBOL(gd_destruct, GuardianDestruct);
         struct GDData *data = NULL;
-        addGuardian("test", false, sizeof(struct GDData), func, des, (void **) &data, env);
+        addGuardian("test", false, true, sizeof(struct GDData), func, des, (void **) &data, env);
         data->func = af_func;
         gc_addReference(af_func);
         FREE_SYMBOL(func);