Jelajahi Sumber

feat: 调整了Inherit结构体和其Object相关函数

SongZihuan 3 tahun lalu
induk
melakukan
050ef2bb1b
7 mengubah file dengan 81 tambahan dan 79 penghapusan
  1. 10 2
      include/object.h
  2. 2 2
      src/core/__object.h
  3. 2 26
      src/core/env.c
  4. 62 44
      src/core/object.c
  5. 1 1
      src/core/run.c
  6. 2 2
      src/main.c
  7. 2 2
      test/test_env.c

+ 10 - 2
include/object.h

@@ -4,15 +4,15 @@
 
 typedef struct af_Object af_Object;
 typedef struct af_Inherit af_Inherit;
+typedef struct af_ObjectAPI af_ObjectAPI;
 
 /* 对象API函数 DLC */
 DEFINE_DLC_SYMBOL(pValueAPI, pAPIFUNC);
 
 #include "env.h"
-#include "tool.h"
 
 /* 对象创建与释放函数 */
-af_Object *makeObject(char *id, size_t data_size, bool inherit_api, bool allow_inherit, af_Object *belong,
+af_Object *makeObject(char *id, bool free_api, af_ObjectAPI *api, bool allow_inherit, af_Object *belong,
                       af_Inherit *inherit, af_Environment *env);
 void freeObject(af_Object *obj);
 
@@ -24,6 +24,14 @@ af_Inherit *makeInherit(af_Object *obj);
 af_Inherit *freeInherit(af_Inherit *ih);
 void freeAllInherit(af_Inherit *ih);
 
+/* API表 创建与释放 */
+af_ObjectAPI *makeObjectAPI(void);
+void freeObjectAPI(af_ObjectAPI *api);
+
+/* API表 管理函数 */
+int addAPI(DLC_SYMBOL(pAPIFUNC) func, char *api_name, af_ObjectAPI *api);
+void *findAPI(char *api_name, af_ObjectAPI *api);
+
 /* 对象API函数 */
 void *findObjectAPI(char *api_name, af_Object *obj);
 int addAPIToObject(DLC_SYMBOL(pAPIFUNC) func, char *api_name, af_Object *obj);

+ 2 - 2
src/core/__object.h

@@ -11,7 +11,6 @@
 // 这些typedef可能会被下面include的文件使用
 typedef struct af_ObjectData af_ObjectData;
 typedef struct af_ObjectAPINode af_ObjectAPINode;
-typedef struct af_ObjectAPI af_ObjectAPI;
 
 #include "object.h"
 #include "__gc.h"
@@ -40,7 +39,7 @@ struct af_ObjectData {
 
     struct af_ObjectAPI *api;  // 继承的api必须位于Inherit链中
     bool allow_inherit;  // 是否允许被继承
-    bool inherit_api;  // api被继承
+    bool free_api;  // api被继承
 
     struct af_VarSpace *var_space;
     struct af_Inherit *inherit;  // 只有顶级继承对象的inherit属性可为NULL
@@ -57,6 +56,7 @@ struct af_Object {
 
 struct af_Inherit {
     struct af_Object *obj;
+    struct af_VarSpace *vs;  // 共享变量空间
     struct af_Inherit *next;
 };
 

+ 2 - 26
src/core/env.c

@@ -6,7 +6,6 @@ static void freeCore(af_Core *core);
 
 /* 核心初始化 */
 static bool enableCore(af_Core *core);
-static bool checkInheritAPI(af_ObjectData *od);
 static void checkInherit(af_Inherit **ih, af_Object *obj);
 
 /* 活动记录器创建和释放 */
@@ -102,19 +101,6 @@ static void checkInherit(af_Inherit **ih, af_Object *obj) {
     *ih = makeInherit(obj);
 }
 
-static bool checkInheritAPI(af_ObjectData *od) {
-    if (od->api != NULL)
-        return true;
-
-    if (!od->inherit_api)
-        return false;
-
-    if (od->inherit->obj->data->api == NULL && !checkInheritAPI(od->inherit->obj->data))
-        return false;
-
-    od->api = od->inherit->obj->data->api;
-    return true;
-}
 
 static bool enableCore(af_Core *core) {
     af_Object *object = getBaseObjectFromCore("object", core);
@@ -123,8 +109,8 @@ static bool enableCore(af_Core *core) {
     if (global == NULL || global->belong != NULL)
         return false;  // global未找到 或其有属对象
 
-    if (object == NULL || object->data->inherit != NULL || object->data->inherit_api || !object->data->allow_inherit)
-        return false;  // object未找到 或其继承自其他对象 或其使用继承api 或其不可被继承
+    if (object == NULL || object->data->inherit != NULL || !object->data->allow_inherit)
+        return false;  // object未找到 或其继承自其他对象 或其不可被继承
 
     core->global = global;
     core->object = object;
@@ -137,22 +123,12 @@ static bool enableCore(af_Core *core) {
             obj->belong = global;
     }
 
-    af_ObjectData *last = NULL;
     for (af_ObjectData *od = core->gc_ObjectData; od != NULL; od = od->gc.next) {
-        last = od;
         if (od == object->data)
             continue;
         checkInherit(&od->inherit, object);
     }
 
-    // 先创造的obj在后面, 因此倒着遍历, 先遍历到的obj依赖少, 可以减少checkInheritAPI递归的深度
-    for (af_ObjectData *od = last; od != NULL; od = od->gc.prev) {
-        if (od == object->data)
-            continue;
-        if(!checkInheritAPI(od))
-            return false;
-    }
-
     gc_addReference(object);
     gc_addReference(global);
     addVarSpaceGCByCore(global->data->var_space, core);  // global的vs是全局作用空间, 被外部引用, 所以由gc管理 (不需要要标记Reference, global已经标记了)

+ 62 - 44
src/core/object.c

@@ -3,8 +3,8 @@
 #include "tool.h"
 
 /* ObjectData 创建与释放 */
-static af_ObjectData *makeObjectData_Pri(char *id, size_t data_size, bool inherit_api, bool allow_inherit);
-static af_Object *makeObject_Pri(char *id, size_t data_size, bool inherit_api, bool allow_inherit);
+static af_ObjectData *makeObjectData_Pri(char *id, bool free_api, af_ObjectAPI *api, bool allow_inherit);
+static af_Object *makeObject_Pri(char *id, bool free_api, af_ObjectAPI *api, bool allow_inherit);
 
 /* ObjectData API 创建与释放 */
 static af_ObjectAPINode *makeObjectAPINode(DLC_SYMBOL(pAPIFUNC) func, char *api_name);
@@ -15,26 +15,16 @@ static void freeAllObjectAPINode(af_ObjectAPINode *apin);
 static af_ObjectAPINode *findObjectDataAPINode(char *api_name, af_ObjectData *od);
 static int addAPIToObjectData(DLC_SYMBOL(pAPIFUNC) func, char *api_name, af_ObjectData *od);
 
-/* ObjectData API表 管理函数 */
-static af_ObjectAPI *makeObjectAPI(void);
-static void freeObjectAPI(af_ObjectAPI *api);
-
-
-static af_ObjectData *makeObjectData_Pri(char *id, size_t data_size, bool inherit_api, bool allow_inherit) {
+static af_ObjectData *makeObjectData_Pri(char *id, bool free_api, af_ObjectAPI *api, bool allow_inherit) {
     af_ObjectData *od = calloc(sizeof(af_ObjectData), 1);
     od->id = strCopy(id == NULL ? "Unknow" : id);
 
-    if (data_size != 0)
-        od->data = calloc(data_size, 1);
-    od->size = data_size;
-
-    if (inherit_api)
-        od->api = NULL;
-    else
-        od->api = makeObjectAPI();
+    // data通过调用api实现
+    od->size = 0;
 
+    od->api = api;
+    od->free_api = free_api;
     od->allow_inherit = allow_inherit;
-    od->inherit_api = inherit_api;
 
     od->var_space = makeVarSpace();
     od->inherit = NULL;
@@ -43,10 +33,10 @@ static af_ObjectData *makeObjectData_Pri(char *id, size_t data_size, bool inheri
     return od;
 }
 
-static af_Object *makeObject_Pri(char *id, size_t data_size, bool inherit_api, bool allow_inherit) {
+static af_Object *makeObject_Pri(char *id, bool free_api, af_ObjectAPI *api, bool allow_inherit) {
     af_Object *obj = calloc(sizeof(af_Object), 1);
     obj->belong = NULL;
-    obj->data = makeObjectData_Pri(id, data_size, inherit_api, allow_inherit);
+    obj->data = makeObjectData_Pri(id, free_api, api, allow_inherit);
     obj->data->base = obj;
     return obj;
 }
@@ -56,9 +46,21 @@ static af_Object *makeObject_Pri(char *id, size_t data_size, bool inherit_api, b
  * 目标: 生成Object和ObjectData, 并且添加到gc链表中
  * 若处于初始化模式, 则belong, inherit等可以设置为NULL, 由后期统一填上
  */
-af_Object *makeObject(char *id, size_t data_size, bool inherit_api, bool allow_inherit, af_Object *belong,
+af_Object *makeObject(char *id, bool free_api, af_ObjectAPI *api, bool allow_inherit, af_Object *belong,
                       af_Inherit *inherit, af_Environment *env) {
-    af_Object *obj = makeObject_Pri(id, data_size, inherit_api, allow_inherit);
+    if (api == NULL)
+        return NULL;
+
+    af_Inherit *ih = NULL;
+    if (env->core->in_init || inherit != NULL)
+        ih = inherit;
+    else if (env->core->object != NULL)
+        ih = makeInherit(env->core->object);
+
+    if (!env->core->in_init && ih == NULL)
+        return NULL;
+
+    af_Object *obj = makeObject_Pri(id, free_api, api, allow_inherit);
 
     if (env->core->in_init || belong != NULL)
         obj->belong = belong;
@@ -67,16 +69,7 @@ af_Object *makeObject(char *id, size_t data_size, bool inherit_api, bool allow_i
     else
         return NULL;
 
-    if (env->core->in_init || inherit != NULL)
-        obj->data->inherit = inherit;
-    else if (env->core->object != NULL)
-        obj->data->inherit = makeInherit(env->core->object);
-    else
-        return NULL;
-
-    if (!env->core->in_init && inherit_api)
-        obj->data->api = obj->data->inherit->obj->data->api;
-
+    obj->data->inherit = ih;
     gc_addObjectData(obj->data, env);
     gc_addObject(obj, env);
     return obj;
@@ -90,7 +83,7 @@ af_Object *makeObject(char *id, size_t data_size, bool inherit_api, bool allow_i
 void freeObjectData(af_ObjectData *od) {
     free(od->id);
     free(od->data);
-    if (!od->inherit_api)
+    if (od->free_api)
         freeObjectAPI(od->api);
     if (!od->var_space->gc.info.start_gc)
         freeVarSpace(od->var_space);
@@ -105,23 +98,19 @@ void freeObject(af_Object *obj) {
 }
 
 af_Object *getBelongObject(af_Object *object, af_Environment *env) {
-    af_Object *belong = object->belong;
-    if (belong == NULL){
-        if (object != env->core->global)
-            object->belong = env->core->global;
-        return env->core->global;
-    }
-    return belong;
+    if (object->belong == NULL)
+        return object;
+    return object->belong;
 }
 
 af_Inherit *makeInherit(af_Object *obj) {
     af_Inherit *ih = calloc(sizeof(af_Inherit), 1);
-    ih->obj = obj;
+    ih->obj = obj;  // 调用API获取vs
     return ih;
 }
 
 af_Inherit *freeInherit(af_Inherit *ih) {
-    af_Inherit *next = ih->next;
+    af_Inherit *next = ih->next;  // vs一定是被gc托管的
     free(ih);
     return next;
 }
@@ -154,17 +143,46 @@ static void freeAllObjectAPINode(af_ObjectAPINode *apin) {
         apin = freeObjectAPINode(apin);
 }
 
-static af_ObjectAPI *makeObjectAPI(void) {
+af_ObjectAPI *makeObjectAPI(void) {
     af_ObjectAPI *api = calloc(sizeof(af_ObjectAPI), 1);
     return api;
 }
 
-static void freeObjectAPI(af_ObjectAPI *api) {
+void freeObjectAPI(af_ObjectAPI *api) {
     for (int i = 0; i < API_HASHTABLE_SIZE; i++)
         freeAllObjectAPINode(api->node[i]);
     free(api);
 }
 
+/*
+ * 函数名: addAPIToObjectData
+ * 目标: 从DLC中获取函数并写入api
+ * 若已存在api则返回0且不作修改
+ * 若dlc中不存在指定函数则返回-1且不作修改
+ * 操作成功返回1
+ */
+int addAPI(DLC_SYMBOL(pAPIFUNC) func, char *api_name, af_ObjectAPI *api) {
+    time33_t index = time33(api_name) % API_HASHTABLE_SIZE;
+    af_ObjectAPINode **pNode = &api->node[index];
+
+    for (NULL; *pNode != NULL; pNode = &((*pNode)->next)) {
+        if (EQ_STR((*pNode)->name, api_name))
+            return 0;
+    }
+
+    *pNode = makeObjectAPINode(func, api_name);
+    return *pNode == NULL ? -1 : 1;
+}
+
+void *findAPI(char *api_name, af_ObjectAPI *api) {
+    time33_t index = time33(api_name) % API_HASHTABLE_SIZE;
+    for (af_ObjectAPINode *node = api->node[index]; node != NULL; node = node->next) {
+        if (EQ_STR(node->name, api_name))
+            return GET_SYMBOL(node->api);
+    }
+    return NULL;
+}
+
 /*
  * 函数名: addAPIToObjectData
  * 目标: 从DLC中获取函数并写入api
@@ -173,7 +191,7 @@ static void freeObjectAPI(af_ObjectAPI *api) {
  * 操作成功返回1
  */
 static int addAPIToObjectData(DLC_SYMBOL(pAPIFUNC) func, char *api_name,
-                        af_ObjectData *od) {
+                              af_ObjectData *od) {
     time33_t index = time33(api_name) % API_HASHTABLE_SIZE;
     af_ObjectAPINode **pNode = &od->api->node[index];
 

+ 1 - 1
src/core/run.c

@@ -36,7 +36,7 @@ static void codeVariable(af_Code *code, af_Environment *env) {
 }
 
 static void codeLiteral(af_Code *code, af_Environment *env) {
-    af_Object *obj = makeObject("Literal", 0, true, true, NULL, NULL, env);
+    af_Object *obj = makeObject("Literal", true, makeObjectAPI(), true, NULL, NULL, env);
     af_Message *msg = makeMessage("NORMAL", sizeof(af_Object *));
     *((af_Object **)msg->msg) = obj;
     gc_addReference(obj);

+ 2 - 2
src/main.c

@@ -16,10 +16,10 @@ int main() {
 
     af_Environment *env = makeEnvironment();
     addVarToProtectVarSpace(makeVar("global", 3, 3, 3,
-                                    makeObject("global", 0, false, true, NULL, NULL, env)),
+                                    makeObject("global", true, makeObjectAPI(), true, NULL, NULL, env)),
                             env);
     addVarToProtectVarSpace(makeVar("object", 3, 3, 3,
-                                    makeObject("object", 0, false, true, NULL, NULL, env)),
+                                    makeObject("object", true, makeObjectAPI(), true, NULL, NULL, env)),
                             env);
 
     {

+ 2 - 2
test/test_env.c

@@ -6,10 +6,10 @@ int main() {
 
     af_Environment *env = makeEnvironment();
     addVarToProtectVarSpace(makeVar("global", 3, 3, 3,
-                                    makeObject("global", 0, false, true, NULL, NULL, env)),
+                                    makeObject("global", true, makeObjectAPI(), true, NULL, NULL, env)),
                             env);
     addVarToProtectVarSpace(makeVar("object", 3, 3, 3,
-                                    makeObject("object", 0, false, true, NULL, NULL, env)),
+                                    makeObject("object", true, makeObjectAPI(), true, NULL, NULL, env)),
                             env);
     if (!enableEnvironment(env)) {
         fprintf(stderr, "Enable Error.\n");