Pārlūkot izejas kodu

feat: global和object对象整合为一个对象

基本对象整合为一个对象
af_Core状态细化为三个模式: Core创建, Core初始化, Core正常
SongZihuan 3 gadi atpakaļ
vecāks
revīzija
d8357df245
10 mainītis faili ar 93 papildinājumiem un 103 dzēšanām
  1. 1 1
      include/env.h
  2. 6 2
      src/core/__env.h
  3. 50 0
      src/core/__global_obj.c
  4. 6 0
      src/core/__global_obj.h
  5. 11 52
      src/core/env.c
  6. 0 2
      src/core/gc.c
  7. 15 13
      src/core/object.c
  8. 2 2
      src/core/var.c
  9. 1 26
      src/main.c
  10. 1 5
      test/test_env.c

+ 1 - 1
include/env.h

@@ -26,7 +26,7 @@ char setPrefix(size_t name, char prefix, af_Environment *env);
 
 /* 运行环境函数 */
 af_Environment *makeEnvironment(enum GcRunTime grt);
-bool enableEnvironment(af_Environment *env);
+void enableEnvironment(af_Environment *env);
 void freeEnvironment(af_Environment *env);
 
 /* 保护空间管理函数 */

+ 6 - 2
src/core/__env.h

@@ -22,6 +22,12 @@ typedef struct af_LiteralDataList af_LiteralDataList;
 typedef uint16_t ActivityCount;
 
 struct af_Core {  // 解释器核心
+    enum af_CoreStatus {
+        core_creat = 0,
+        core_init,  // 执行.i.af
+        core_normal,  // 正常执行
+    } status;
+
     // GC基本信息
     struct af_ObjectData *gc_ObjectData;
     struct af_Object *gc_Object;
@@ -33,10 +39,8 @@ struct af_Core {  // 解释器核心
 
     // 基本对象信息
     struct af_Object *global;  // 顶级属对象
-    struct af_Object *object;  // 顶级继承对象
 
     // 保护空间
-    bool in_init;  // 是否在初始化模式
     struct af_VarSpace *protect;  // 顶级保护变量空间
 };
 

+ 50 - 0
src/core/__global_obj.c

@@ -0,0 +1,50 @@
+#include "aFun.h"
+#include "__object.h"
+
+static size_t getSize(af_Object *obj) {
+    return sizeof(af_VarSpace *);
+}
+
+static void initData(af_Object *obj, af_VarSpace **data, af_Environment *env) {
+    *data = makeVarSpace(obj, env);
+}
+
+static void freeData(af_Object *obj, af_VarSpace **data, af_Environment *env) {
+    freeVarSpace(*data, env);
+}
+
+static af_GcList *getGcList(char *id, void *data) {
+    return pushGcList(glt_vs, *(af_VarSpace **)data, NULL);
+}
+
+
+static af_VarSpace *getShareVS(af_Object *obj) {
+    return *(af_VarSpace **)getObjectData(obj);
+}
+
+af_Object *makeGlobalObject(af_Environment *env) {
+    af_ObjectAPI *api = makeObjectAPI();
+    DLC_SYMBOL(objectAPIFunc) get_size = MAKE_SYMBOL(getSize, objectAPIFunc);
+    DLC_SYMBOL(objectAPIFunc) init_data = MAKE_SYMBOL(initData, objectAPIFunc);
+    DLC_SYMBOL(objectAPIFunc) free_data = MAKE_SYMBOL(freeData, objectAPIFunc);
+    DLC_SYMBOL(objectAPIFunc) get_share_vs = MAKE_SYMBOL(getShareVS, objectAPIFunc);
+    DLC_SYMBOL(objectAPIFunc) get_gl = MAKE_SYMBOL(getGcList, objectAPIFunc);
+    if (addAPI(get_size, "obj_getDataSize", api) != 1)
+        return NULL;
+    if (addAPI(init_data, "obj_initData", api) != 1)
+        return NULL;
+    if (addAPI(free_data, "obj_destructData", api) != 1)
+        return NULL;
+    if (addAPI(get_share_vs, "obj_getShareVarSpace", api) != 1)
+        return NULL;
+    if (addAPI(get_gl, "obj_getGcList", api) != 1)
+        return NULL;
+
+    FREE_SYMBOL(get_size);
+    FREE_SYMBOL(init_data);
+    FREE_SYMBOL(free_data);
+    FREE_SYMBOL(get_share_vs);
+    FREE_SYMBOL(get_gl);
+
+    return makeObject("object", true, api, true, NULL, NULL, env);
+}

+ 6 - 0
src/core/__global_obj.h

@@ -0,0 +1,6 @@
+#ifndef AFUN_GLOBAL_OBJ_H
+#define AFUN_GLOBAL_OBJ_H
+
+af_Object *makeGlobalObject(af_Environment *env);
+
+#endif //AFUN_GLOBAL_OBJ_H

+ 11 - 52
src/core/env.c

@@ -1,15 +1,12 @@
 #include "aFun.h"
 #include "__env.h"
+#include "__global_obj.h"
 #include "run.h"
 
 /* Core 创建和释放 */
 static af_Core *makeCore(enum GcRunTime grt);
 static void freeCore(af_Environment *env);
 
-/* Core 初始化 */
-static bool enableCore(af_Core *core);
-static bool checkInherit(af_Inherit **ih, af_Object *obj);
-
 /* Activity 创建和释放 */
 static af_Activity *makeActivity(af_Message *msg_up, af_VarSpaceListNode *vsl, af_Object *belong);
 static af_Activity *makeFuncActivity(af_Code *bt_top, af_Code *bt_start, bool return_first, af_Message *msg_up,
@@ -44,7 +41,7 @@ static af_LiteralDataList *freeLiteralData_Pri(af_LiteralDataList *ld);
 
 static af_Core *makeCore(enum GcRunTime grt) {
     af_Core *core = calloc(sizeof(af_Core), 1);
-    core->in_init = true;
+    core->status = core_creat;
     core->protect = makeVarSpaceByCore(NULL, core);
     core->gc_run = grt;
     core->gc_count_max = DEFAULT_GC_COUNT_MAX;
@@ -120,50 +117,6 @@ af_Object *getBaseObject(char *name, af_Environment *env) {
     return getBaseObjectFromCore(name, env->core);
 }
 
-static bool checkInherit(af_Inherit **ih, af_Object *obj) {
-    while (*ih != NULL) {
-        if ((*ih)->obj->data == obj->data) {
-            if ((*ih)->next == NULL && (*ih)->obj == obj)  // 最后一个就是obj
-                return true;  // 不需要任何更改
-            *ih = freeInherit(*ih);  // 释放该ih
-        } else
-            ih = &((*ih)->next);
-    }
-    *ih = makeInherit(obj);
-    return (*ih == NULL) ? false : true;
-}
-
-static bool enableCore(af_Core *core) {
-    af_Object *object = getBaseObjectFromCore("object", core);
-    af_Object *global = getBaseObjectFromCore("global", core);
-
-    if (global == NULL || global->belong != NULL)
-        return false;  // global未找到 或其有属对象
-
-    if (object == NULL || object->data->inherit != NULL || !object->data->allow_inherit)
-        return false;  // object未找到 或其继承自其他对象 或其不可被继承
-
-    for (af_Object *obj = core->gc_Object; obj != NULL; obj = obj->gc.next) {
-        if (obj == global)
-            continue;
-        if (obj->belong == NULL)
-            obj->belong = global;
-    }
-
-    for (af_ObjectData *od = core->gc_ObjectData; od != NULL; od = od->gc.next) {
-        if (od == object->data)
-            continue;
-        if (!checkInherit(&od->inherit, object))
-            return false;
-    }
-
-    core->global = global;
-    core->object = object;
-    core->protect->is_protect = true;
-    core->in_init = false;
-    return true;
-}
-
 static af_Activity *makeActivity(af_Message *msg_up, af_VarSpaceListNode *vsl, af_Object *belong) {
     af_Activity *activity = calloc(sizeof(af_Activity), 1);
     activity->msg_up = msg_up;
@@ -454,6 +407,9 @@ af_Environment *makeEnvironment(enum GcRunTime grt) {
     af_Environment *env = calloc(sizeof(af_Environment), 1);
     env->core = makeCore(grt);
     env->esv = makeEnvVarSpace();
+    /* 生成global对象 */
+    env->core->global = makeGlobalObject(env);
+    addVarToProtectVarSpace(makeVar("global", 3, 3, 3, env->core->global, env), env);
 
     /* 设置默认prefix */
     char prefix[PREFIX_SIZE + 1] = "";
@@ -466,6 +422,8 @@ af_Environment *makeEnvironment(enum GcRunTime grt) {
     DLC_SYMBOL(TopMsgProcessFunc) func = MAKE_SYMBOL(mp_NORMAL, TopMsgProcessFunc);
     addTopMsgProcess("NORMAL", func, env);
     FREE_SYMBOL(func);
+
+    env->core->status = core_init;
     return env;
 }
 
@@ -481,12 +439,13 @@ bool addTopActivity(af_Code *code, af_Environment *env) {
     return true;
 }
 
-bool enableEnvironment(af_Environment *env) {
-    return enableCore(env->core);
+void enableEnvironment(af_Environment *env) {
+    env->core->protect->is_protect = true;
+    env->core->status = core_normal;
 }
 
 void freeEnvironment(af_Environment *env) {
-    if (!env->core->in_init)
+    if (env->core->status != core_creat)
         iterDestruct(10, env);
     freeCore(env);
     freeAllActivity(env->activity);

+ 0 - 2
src/core/gc.c

@@ -238,8 +238,6 @@ static pgc_Analyzed reachableVarSpaceList(struct af_VarSpaceListNode *vsl, pgc_A
 
 static pgc_Analyzed iterLinker(af_Core *core, pgc_Analyzed plist) {
     plist = reachableVarSpace(core->protect, plist);
-    if (core->object != NULL)
-        plist = reachableObject(core->object, plist);
     if (core->global != NULL)
         plist = reachableObject(core->global, plist);
 

+ 15 - 13
src/core/object.c

@@ -72,29 +72,31 @@ af_Object *makeObject(char *id, bool free_api, af_ObjectAPI *api, bool allow_inh
         return NULL;
 
     af_Inherit *ih = NULL;
-    if (env->core->in_init || inherit != NULL)
+    if (inherit != NULL)
         ih = inherit;
-    else if (env->core->object != NULL)
-        ih = makeInherit(env->core->object);
-
-    if (!env->core->in_init && ih == NULL)
+    else if (env->core->global != NULL)  // init模式生成: global
+        ih = makeInherit(env->core->global);
+    else if (env->core->status != core_creat)
         return NULL;
 
-    af_Object *obj = makeObject_Pri(id, free_api, api, allow_inherit, env);
+    if (belong == NULL) {
+        if (env->activity != NULL)
+            belong = env->activity->belong;
+        else if (env->core->status == core_init)  // init模式生成: global
+            belong = env->core->global;
+        else if (env->core->status == core_normal)
+            return NULL;
+    }
 
-    if (env->core->in_init || belong != NULL)
-        obj->belong = belong;
-    else if (env->activity != NULL)
-        obj->belong = env->activity->belong;
-    else
-        return NULL;
+    af_Object *obj = makeObject_Pri(id, free_api, api, allow_inherit, env);
 
+    obj->belong = belong;
     obj->data->inherit = ih;
     return obj;
 }
 
 /*
- * 函数名: freeObjectDataByCore
+ * 函数名: freeObjectData
  * 目标: 释放ObjectData, 仅GC函数可用
  * 对外API中, 创建对象的基本单位都是af_Object, 无法直接操控af_ObjectData
  */

+ 2 - 2
src/core/var.c

@@ -101,7 +101,7 @@ static void freeAllVarCup(af_VarCup *vp) {
 }
 
 af_VarSpace *makeVarSpace(af_Object *belong, af_Environment *env) {
-    if (!env->core->in_init && belong == NULL)
+    if (env->core->status != core_creat && belong == NULL)
         return NULL;
 
     af_VarSpace *vs = calloc(sizeof(af_VarSpace), 1);
@@ -111,7 +111,7 @@ af_VarSpace *makeVarSpace(af_Object *belong, af_Environment *env) {
 }
 
 af_VarSpace *makeVarSpaceByCore(af_Object *belong, af_Core *core) {
-    if (!core->in_init && belong == NULL)
+    if (core->status != core_creat && belong == NULL)
         return NULL;
 
     af_VarSpace *vs = calloc(sizeof(af_VarSpace), 1);

+ 1 - 26
src/main.c

@@ -374,28 +374,6 @@ int main() {
     printf("Hello World\n");
 
     af_Environment *env = makeEnvironment(grt_always);
-    {
-        af_ObjectAPI *api = makeObjectAPI();
-        af_Object *obj;
-        DLC_SYMBOL(objectAPIFunc) getSize_ = MAKE_SYMBOL(getSize, objectAPIFunc);
-        DLC_SYMBOL(objectAPIFunc) initData_ = MAKE_SYMBOL(initData, objectAPIFunc);
-        DLC_SYMBOL(objectAPIFunc) freeData_ = MAKE_SYMBOL(freeData, objectAPIFunc);
-        if (addAPI(getSize_, "obj_getDataSize", api) != 1)
-            return 2;
-        if (addAPI(initData_, "obj_initData", api) != 1)
-            return 2;
-        if (addAPI(freeData_, "obj_destructData", api) != 1)
-            return 2;
-
-        addVarToProtectVarSpace(makeVar("global", 3, 3, 3,
-                                        (obj = makeObject("global", true, api, true, NULL, NULL, env)), env),
-                                env);
-        FREE_SYMBOL(getSize_);
-        FREE_SYMBOL(initData_);
-        FREE_SYMBOL(freeData_);
-        printf("global(%p)\n", obj);
-    }
-
     {
         af_ObjectAPI *api = makeObjectAPI();
         af_Object *obj;
@@ -803,10 +781,7 @@ int main() {
         FREE_SYMBOL(func);
     }
 
-    if (!enableEnvironment(env)) {
-        fprintf(stderr, "Enable Error.\n");
-        exit(EXIT_FAILURE);
-    }
+    enableEnvironment(env);
 
     {  // 正常程序
         printf("TAG A:\n");

+ 1 - 5
test/test_env.c

@@ -92,11 +92,7 @@ int main() {
     }
 
 
-    if (!enableEnvironment(env)) {
-        fprintf(stderr, "Enable Error.\n");
-        exit(EXIT_FAILURE);
-    }
-
+    enableEnvironment(env);
     freeEnvironment(env);
     return 0;
 }