浏览代码

feat: core中部分属性改用EnvVar记录

SongZihuan 3 年之前
父节点
当前提交
30039ad730
共有 9 个文件被更改,包括 103 次插入52 次删除
  1. 2 2
      include/core/README
  2. 6 5
      include/core/env.h
  3. 4 1
      include/core/info/magic_func.h
  4. 11 5
      src/core/__env.h
  5. 72 31
      src/core/env.c
  6. 2 2
      src/core/gc.c
  7. 3 3
      src/core/run.c
  8. 2 2
      src/runtime/aFunlang.c
  9. 1 1
      src/runtime/base/quit.c

+ 2 - 2
include/core/README

@@ -218,7 +218,7 @@ af_ErrorInfo 描述错误信息
 * popMessageUp
 * pushMessageDown
 * popMessageDown
-* setEnvVar
+* setEnvVarData
 * addTopMsgProcess
 * pushLiteralRegex
 * fprintfErrorInfo
@@ -238,7 +238,7 @@ af_ErrorInfo 描述错误信息
 * getBelong
 * getActivityFile
 * getActivityLine
-* findEnvVar
+* findEnvVarData
 * getMsgNormalData
 * getMsgErrorInfo
 * getMsgImportInfo

+ 6 - 5
include/core/env.h

@@ -45,7 +45,7 @@ void freeImportInfo(af_ImportInfo *ii);
 
 /* 运行环境 相关操作 */
 AFUN_CORE_EXPORT void enableEnvironment(af_Environment *env);
-AFUN_CORE_EXPORT void setGcMax(size_t max, af_Environment *env);
+AFUN_CORE_EXPORT void setGcMax(int32_t max, af_Environment *env);
 AFUN_CORE_EXPORT void setGcRun(enum GcRunTime grt, af_Environment *env);
 AFUN_CORE_EXPORT char setPrefix(size_t name, char prefix, af_Environment *env);
 AFUN_CORE_EXPORT void setCoreStop(af_Environment *env);
@@ -62,7 +62,8 @@ AFUN_CORE_EXPORT af_Message *popMessageDown(char *type, af_Environment *env);
 AFUN_CORE_EXPORT af_Message *getFirstMessage(af_Environment *env);
 
 /* 环境变量 相关操作 */
-AFUN_CORE_EXPORT void setEnvVar(char *name, char *data, af_Environment *env);
+AFUN_CORE_EXPORT void setEnvVarData(char *name, char *data, af_Environment *env);
+AFUN_CORE_EXPORT void setEnvVarNumber(char *name, int32_t data, af_Environment *env);
 
 /* 顶层消息处理器 相关操作 */
 AFUN_CORE_EXPORT bool addTopMsgProcess(char *type, DLC_SYMBOL(TopMsgProcessFunc) func, af_Environment *env);
@@ -77,14 +78,14 @@ AFUN_CORE_EXPORT void fprintfErrorInfo(FILE *file, af_ErrorInfo *ei);
 AFUN_CORE_EXPORT void pushErrorBacktracking(FileLine line, FilePath file, char *note, af_ErrorInfo *ei);
 
 /* 环境变量 属性访问 */
-AFUN_CORE_EXPORT char *findEnvVar(char *name, af_Environment *env);
+AFUN_CORE_EXPORT char *findEnvVarData(char *name, af_Environment *env);
 
 /* 运行环境 属性访问 */
 AFUN_CORE_EXPORT char getPrefix(size_t name, af_Environment *env);
 AFUN_CORE_EXPORT af_Object *getBaseObject(char *name, af_Environment *env);
 AFUN_CORE_EXPORT af_VarSpace *getProtectVarSpace(af_Environment *env);
-AFUN_CORE_EXPORT size_t getGcCount(af_Environment *env);
-AFUN_CORE_EXPORT size_t getGcMax(af_Environment *env);
+AFUN_CORE_EXPORT int32_t getGcCount(af_Environment *env);
+AFUN_CORE_EXPORT int32_t getGcMax(af_Environment *env);
 AFUN_CORE_EXPORT enum GcRunTime getGcRun(af_Environment *env);
 AFUN_CORE_EXPORT af_Object *getCoreGlobal(af_Environment *env);
 AFUN_CORE_EXPORT af_Object *getGlobal(af_Environment *env);

+ 4 - 1
include/core/info/magic_func.h

@@ -15,7 +15,10 @@
 /* 内置环境变量 */
 #define SYS_NAME(job) ("sys-" #job)
 
-/* gc模块 */
 #define ev_sys_prefix SYS_NAME(prefix)
+#define ev_grt SYS_NAME(grt)
+#define ev_gcmax SYS_NAME(gc-max)
+#define ev_gccount SYS_NAME(gc-count)
+#define ev_exit_code SYS_NAME(exit-code)
 
 #endif //AFUN_MAGIC_FUNC_H

+ 11 - 5
src/core/__env.h

@@ -39,9 +39,6 @@ struct af_Core {  // 解释器核心
     struct af_Object *gc_Object;
     struct af_Var *gc_Var;
     struct af_VarSpace *gc_VarSpace;
-    size_t gc_count;  // gc量计数
-    size_t gc_count_max;  // gc计数最大值
-    enum GcRunTime gc_run;
 
     /* 基本对象信息 */
     struct af_Object *global;  // 顶级属对象
@@ -52,8 +49,12 @@ struct af_Core {  // 解释器核心
     /* 字面量基本信息 */
     af_LiteralRegex *lr;
 
-    /* exit */
-    int exit_code;  // 退出代码
+    /* 数据 */
+    af_EnvVar *gc_count;
+    af_EnvVar *gc_max;
+    af_EnvVar *gc_runtime;
+    af_EnvVar *prefix;
+    af_EnvVar *exit_code_;  // 退出代码
 };
 
 struct af_Message {
@@ -188,6 +189,7 @@ struct af_TopMsgProcess {  // 顶层msg处理器
 struct af_EnvVar {  // 环境变量
     char *name;
     char *data;
+    int32_t num;  // 可以同时记录字符串和数字
     struct af_EnvVar *next;
 };
 
@@ -270,4 +272,8 @@ AFUN_CORE_NO_EXPORT void freeAllMessage(af_Message *msg);
 
 /* 消息管理函数 */
 AFUN_CORE_NO_EXPORT void connectMessage(af_Message **base, af_Message *msg);
+
+/* 环境变量管理函数 */
+AFUN_CORE_NO_EXPORT af_EnvVar *setEnvVarNumber_(char *name, int32_t data, af_Environment *env);
+AFUN_CORE_NO_EXPORT af_EnvVar *setEnvVarData_(char *name, char *data, af_Environment *env);
 #endif //AFUN_ENV_H_

+ 72 - 31
src/core/env.c

@@ -4,7 +4,7 @@
 #include "__run.h"
 
 /* Core 创建和释放 */
-static af_Core *makeCore(enum GcRunTime grt);
+static af_Core *makeCore(enum GcRunTime grt, af_Environment *env);
 static void freeCore(af_Environment *env);
 
 /* Activity 创建和释放 */
@@ -29,7 +29,7 @@ static af_ActivityTrackBack *freeActivityTrackBack(af_ActivityTrackBack *atb);
 static void freeAllActivityTrackBack(af_ActivityTrackBack *atb);
 
 /* 环境变量 创建与释放 */
-static af_EnvVar *makeEnvVar(char *name, char *data);
+static af_EnvVar *makeEnvVar(char *name);
 static af_EnvVar *freeEnvVar(af_EnvVar *var);
 static void freeAllEnvVar(af_EnvVar *var);
 static void freeEnvVarSpace(af_EnvVarSpace *evs);
@@ -69,12 +69,22 @@ static void mp_IMPORT(af_Message *msg, bool is_gc, af_Environment *env);
 /* 变量检查函数 */
 static bool isInfixFunc(af_Code *code, af_Environment *env);
 
-static af_Core *makeCore(enum GcRunTime grt) {
+static af_Core *makeCore(enum GcRunTime grt, af_Environment *env) {
     af_Core *core = calloc(1, sizeof(af_Core));
+
+    /* 设置默认prefix */
+    char prefix[PREFIX_SIZE + 1] = "";
+    prefix[E_QUOTE] = '\'';
+    prefix[B_EXEC] = '\'';
+    prefix[B_EXEC_FIRST] = '$';
+    core->prefix = setEnvVarData_(ev_sys_prefix, prefix, env);
+    core->gc_runtime = setEnvVarNumber_(ev_grt, grt, env);
+    core->gc_max = setEnvVarNumber_(ev_gcmax, DEFAULT_GC_COUNT_MAX, env);
+    core->gc_count = setEnvVarNumber_(ev_gccount, 0, env);
+    core->exit_code_ = setEnvVarNumber_(ev_exit_code, 0, env);
+
     core->status = core_creat;
     core->protect = makeVarSpaceByCore(NULL, 3, 3, 3, core);
-    core->gc_run = grt;
-    core->gc_count_max = DEFAULT_GC_COUNT_MAX;
     return core;
 }
 
@@ -93,7 +103,7 @@ static void freeCore(af_Environment *env) {
 char setPrefix(size_t name, char prefix, af_Environment *env) {
     if (name >= PREFIX_SIZE)
         return '-';  // 表示未获取到prefix (NUL在Code中表示无prefix)
-    char *prefix_ = findEnvVar(ev_sys_prefix, env);
+    char *prefix_ = env->core->prefix->data;
     if (prefix_ == NULL || strlen(prefix_) < PREFIX_SIZE)
         return '-';
     switch (name) {
@@ -118,7 +128,7 @@ char getPrefix(size_t name, af_Environment *env) {
     if (name >= PREFIX_SIZE)
         return '-';  // 表示未获取到prefix (NUL在Code中表示无prefix)
 
-    char *prefix = findEnvVar(ev_sys_prefix, env);
+    char *prefix = env->core->prefix->data;
     if (prefix == NULL || strlen(prefix) < PREFIX_SIZE)
         return '-';
     return prefix[name];
@@ -155,13 +165,13 @@ void setCoreStop(af_Environment *env) {
 
 void setCoreExit(int exit_code, af_Environment *env) {
     env->core->status = core_exit;
-    env->core->exit_code = exit_code;
+    env->core->exit_code_->num = exit_code;
 }
 
 void setCoreNormal(af_Environment *env) {
     if (env->core->status == core_exit || env->core->status == core_stop) {
         env->core->status = core_normal;
-        env->core->exit_code = 0;
+        env->core->exit_code_->num = 0;
     }
 }
 
@@ -574,10 +584,9 @@ af_Message *makeIMPORTMessage(char *mark, af_Object *obj) {
     return msg;
 }
 
-static af_EnvVar *makeEnvVar(char *name, char *data) {
+static af_EnvVar *makeEnvVar(char *name) {
     af_EnvVar *var = calloc(1, sizeof(af_EnvVar));
     var->name = strCopy(name);
-    var->data = strCopy(data);
     return var;
 }
 
@@ -605,7 +614,7 @@ static void freeEnvVarSpace(af_EnvVarSpace *evs) {
     free(evs);
 }
 
-void setEnvVar(char *name, char *data, af_Environment *env) {
+af_EnvVar *setEnvVarData_(char *name, char *data, af_Environment *env) {
     time33_t index = time33(name) % ENV_VAR_HASH_SIZE;
     af_EnvVar **pvar = &env->esv->var[index];
     env->esv->count++;
@@ -613,14 +622,41 @@ void setEnvVar(char *name, char *data, af_Environment *env) {
         if (EQ_STR((*pvar)->name, name)) {
             free((*pvar)->data);
             (*pvar)->data = strCopy(data);
-            return;
+            return *pvar;
         }
     }
 
-    *pvar = makeEnvVar(name, data);
+    *pvar = makeEnvVar(name);
+    (*pvar)->data = strCopy(data);
+    return *pvar;
 }
 
-char *findEnvVar(char *name, af_Environment *env) {
+af_EnvVar *setEnvVarNumber_(char *name, int32_t data, af_Environment *env) {
+    time33_t index = time33(name) % ENV_VAR_HASH_SIZE;
+    af_EnvVar **pvar = &env->esv->var[index];
+    env->esv->count++;
+    for (NULL; *pvar != NULL; pvar = &((*pvar)->next)) {
+        if (EQ_STR((*pvar)->name, name)) {
+            free((*pvar)->data);
+            (*pvar)->num = data;
+            return *pvar;
+        }
+    }
+
+    *pvar = makeEnvVar(name);
+    (*pvar)->num = data;
+    return *pvar;
+}
+
+void setEnvVarData(char *name, char *data, af_Environment *env) {
+    setEnvVarData_(name, data, env);
+}
+
+void setEnvVarNumber(char *name, int32_t data, af_Environment *env) {
+    setEnvVarNumber_(name, data, env);
+}
+
+char *findEnvVarData(char *name, af_Environment *env) {
     time33_t index = time33(name) % ENV_VAR_HASH_SIZE;
     af_EnvVar **pvar = &env->esv->var[index];
 
@@ -632,6 +668,18 @@ char *findEnvVar(char *name, af_Environment *env) {
     return NULL;
 }
 
+int32_t *findEnvVarNumber(char *name, af_Environment *env) {
+    time33_t index = time33(name) % ENV_VAR_HASH_SIZE;
+    af_EnvVar **pvar = &env->esv->var[index];
+
+    for (NULL; *pvar != NULL; pvar = &((*pvar)->next)) {
+        if (EQ_STR((*pvar)->name, name))
+            return &(*pvar)->num;  // 返回指针, NULL表示没找到
+    }
+
+    return NULL;
+}
+
 static void mp_NORMAL(af_Message *msg, bool is_gc, af_Environment *env) {
     if (msg->msg == NULL || *(af_Object **)msg->msg == NULL) {
         fprintf(stderr, "NORMAL msg: %p error\n", msg->msg);
@@ -673,19 +721,12 @@ static void mp_IMPORT(af_Message *msg, bool is_gc, af_Environment *env) {
 
 af_Environment *makeEnvironment(enum GcRunTime grt) {
     af_Environment *env = calloc(1, sizeof(af_Environment));
-    env->core = makeCore(grt);
     env->esv = makeEnvVarSpace();
+    env->core = makeCore(grt, env);
     /* 生成global对象 */
     env->core->global = makeGlobalObject(env);
     addVarToProtectVarSpace(makeVar("global", 3, 3, 3, env->core->global, env), env);
 
-    /* 设置默认prefix */
-    char prefix[PREFIX_SIZE + 1] = "";
-    prefix[E_QUOTE] = '\'';
-    prefix[B_EXEC] = '\'';
-    prefix[B_EXEC_FIRST] = '$';
-    setEnvVar(ev_sys_prefix, prefix, env);
-
     /* 设置NORMAL顶级处理器 */
     DLC_SYMBOL(TopMsgProcessFunc) func1 = MAKE_SYMBOL(mp_NORMAL, TopMsgProcessFunc);
     addTopMsgProcess("NORMAL", func1, env);
@@ -1492,24 +1533,24 @@ void freeImportInfo(af_ImportInfo *ii) {
     free(ii);
 }
 
-void setGcMax(size_t max, af_Environment *env) {
-    env->core->gc_count_max = max;
+void setGcMax(int32_t max, af_Environment *env) {
+    env->core->gc_max->num = max;
 }
 
 void setGcRun(enum GcRunTime grt, af_Environment *env) {
-    env->core->gc_run = grt;
+    env->core->gc_runtime->num = grt;
 }
 
-size_t getGcCount(af_Environment *env) {
-    return env->core->gc_count;
+int32_t getGcCount(af_Environment *env) {
+    return env->core->gc_count->num;
 }
 
-size_t getGcMax(af_Environment *env) {
-    return env->core->gc_count_max;
+int32_t getGcMax(af_Environment *env) {
+    return env->core->gc_max->num;
 }
 
 enum GcRunTime getGcRun(af_Environment *env) {
-    return env->core->gc_run;
+    return env->core->gc_runtime->num;
 }
 
 af_Object *getCoreGlobal(af_Environment *env) {

+ 2 - 2
src/core/gc.c

@@ -13,14 +13,14 @@ void gc_add##type(af_##type *obj, af_Environment *env) { \
     }                             \
     obj->gc.next = env->core->gc_##type; \
     env->core->gc_##type = obj;  \
-    env->core->gc_count++;  \
+    env->core->gc_count->num++;  \
 } \
 void gc_add##type##ByCore(af_##type *obj, af_Core *core) { \
 if (obj->gc.next != NULL || obj->gc.prev != NULL) {return;} \
 obj->gc.prev = NULL; \
 obj->gc.next = core->gc_##type; \
 core->gc_##type = obj;        \
-core->gc_count++;  \
+core->gc_count->num++;  \
 } \
 void gc_add##type##Reference(af_##type *obj) { \
     obj->gc.info.reference++; \

+ 3 - 3
src/core/run.c

@@ -94,9 +94,9 @@ static int checkMacro(af_Message *msg, af_Environment *env) {
  * 目标: 检查是否该运行gc, 若是则返回true并运行gc, 否则返回false
  */
 static bool checkRunGC(af_Environment *env) {
-    if (env->core->gc_run == grt_always ||
-        env->core->gc_run == grt_count && env->core->gc_count >= env->core->gc_count_max) {
-        env->core->gc_count = 0;  // 清零
+    if (env->core->gc_runtime->num == grt_always ||
+        env->core->gc_runtime->num == grt_count && env->core->gc_count->num >= env->core->gc_max->num) {
+        env->core->gc_count->num = 0;  // 清零
         gc_RunGC(env);
         return true;
     }

+ 2 - 2
src/runtime/aFunlang.c

@@ -54,7 +54,7 @@ static int runCode_(FilePath name, af_Parser *parser, int mode, FilePath save_pa
     bool res = iterCode(bt_code, mode, env);
     freeAllCode(bt_code);
     if (!res)
-        return env->core->exit_code;
+        return env->core->exit_code_->num;
     return 0;
 }
 
@@ -133,7 +133,7 @@ int runCodeFromStdin(char *name, FILE *error_file, af_Environment *env) {
 int runCodeFromMemory(af_Code *code, int mode, af_Environment *env){
     bool res = iterCode(code, mode, env);
     if (!res)
-        return env->core->exit_code;
+        return env->core->exit_code_->num;
     return 0;
 }
 

+ 1 - 1
src/runtime/base/quit.c

@@ -34,7 +34,7 @@ static bool funcVarList(char *id, af_Object *obj, af_VarSpaceListNode **vsl, voi
 }
 
 static af_FuncBody *funcBody(CallFuncInfo *cfi, af_Environment *env) {
-    env->core->exit_code = 0;
+    env->core->exit_code_->num = 0;
     env->core->status = core_exit;
     pushMessageDown(makeNORMALMessage(getGlobal(env)), env);
     return NULL;