Browse Source

feat: 继承链创建使用API

SongZihuan 3 năm trước cách đây
mục cha
commit
94ae20f869
6 tập tin đã thay đổi với 87 bổ sung13 xóa
  1. 3 0
      include/obj_api.h
  2. 1 0
      include/object.h
  3. 6 4
      src/core/env.c
  4. 2 0
      src/core/gc.c
  5. 21 0
      src/core/object.c
  6. 54 9
      src/main.c

+ 3 - 0
include/obj_api.h

@@ -29,6 +29,9 @@ typedef size_t obj_getDataSize(char *id);  // 获取data的大小
 typedef void obj_initData(char *id, void *data, af_Environment *env);  // 初始化data
 typedef void obj_freeData(char *id, void *data, af_Environment *env);  // 释放data的内容 (但不释放void *data)指针
 
+/* Object 面向对象管理 */
+typedef af_VarSpace *obj_getShareVarSpace(af_Object *obj);
+
 /* Object 函数调用 */
 typedef bool obj_funcGetArgCodeList(af_ArgCodeList **acl, af_Object *obj, af_Code *code, void **mark, af_Environment *env);  // 获取参数计算表
 typedef bool obj_funcGetVarList(af_VarSpaceListNode **vsl, af_Object *obj, void *mark, af_Environment *env);  // 获取函数变量空间

+ 1 - 0
include/object.h

@@ -21,6 +21,7 @@ void freeObject(af_Object *obj, af_Environment *env);
 /* 对象属性获取函数 */
 void *getObjectData(af_Object *obj);
 af_Object *getBelongObject(af_Object *object, af_Environment *env);
+af_Object *findObjectAttributes(char *name, af_Object *obj);
 
 /* 对象继承关系函数 */
 af_Inherit *makeInherit(af_Object *obj);

+ 6 - 4
src/core/env.c

@@ -6,7 +6,7 @@ static void freeCore(af_Environment *env);
 
 /* Core 初始化 */
 static bool enableCore(af_Core *core);
-static void checkInherit(af_Inherit **ih, af_Object *obj);
+static bool checkInherit(af_Inherit **ih, af_Object *obj);
 
 /* Activity 创建和释放 */
 static af_Activity *makeActivity(af_Code *bt_top, af_Code *bt_start, bool return_first, af_Message *msg_up,
@@ -99,16 +99,17 @@ af_Object *getBaseObject(char *name, af_Environment *env) {
     return getBaseObjectFromCore(name, env->core);
 }
 
-static void checkInherit(af_Inherit **ih, af_Object *obj) {
+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;  // 不需要任何更改
+                return true;  // 不需要任何更改
             *ih = freeInherit(*ih);  // 释放该ih
         } else
             ih = &((*ih)->next);
     }
     *ih = makeInherit(obj);
+    return (*ih == NULL) ? false : true;
 }
 
 static bool enableCore(af_Core *core) {
@@ -131,7 +132,8 @@ static bool enableCore(af_Core *core) {
     for (af_ObjectData *od = core->gc_ObjectData; od != NULL; od = od->gc.next) {
         if (od == object->data)
             continue;
-        checkInherit(&od->inherit, object);
+        if (!checkInherit(&od->inherit, object))
+            return false;
     }
 
     core->global = global;

+ 2 - 0
src/core/gc.c

@@ -151,6 +151,8 @@ static pgc_Analyzed reachableObjectData(struct af_ObjectData *od, pgc_Analyzed p
     for (af_Inherit *ih = od->inherit; ih != NULL; ih = ih->next) {
         if (!ih->obj->gc.info.reachable)
             plist = newObjectAnalyzed(ih->obj, plist);
+        if (!ih->vs->gc.info.reachable)
+            plist = reachableVarSpace(ih->vs, plist);
     }
 
     obj_getGcList *func = findAPI("obj_getGcList", od->api);

+ 21 - 0
src/core/object.c

@@ -135,7 +135,13 @@ af_Object *getBelongObject(af_Object *object, af_Environment *env) {
 }
 
 af_Inherit *makeInherit(af_Object *obj) {
+    obj_getShareVarSpace *func = findAPI("obj_getShareVarSpace", obj->data->api);
+    af_VarSpace *vs = NULL;
+    if (func == NULL || (vs = func(obj)) == NULL)
+        return NULL;
+
     af_Inherit *ih = calloc(sizeof(af_Inherit), 1);
+    ih->vs = vs;
     ih->obj = obj;  // 调用API获取vs
     return ih;
 }
@@ -263,3 +269,18 @@ void *findObjectAPI(char *api_name, af_Object *obj) {
         return NULL;
     return GET_SYMBOL(node->api);
 }
+
+af_Object *findObjectAttributes(char *name, af_Object *obj) {
+    af_Var *var = findVarFromVarSpace(name, obj->data->var_space);
+
+    if (var != NULL)
+        return var->vn->obj;
+
+    for (af_Inherit *ih = obj->data->inherit; ih != NULL; ih = ih->next) {
+        var = findVarFromVarSpace(name, ih->vs);  // 搜索共享变量空间
+        if (var != NULL)
+            return var->vn->obj;
+    }
+
+    return NULL;
+}

+ 54 - 9
src/main.c

@@ -37,6 +37,29 @@ void freeData2(char *id, af_VarSpaceListNode **data, af_Environment *env) {
     freeAllVarSpaceList(*data);
 }
 
+size_t getSize3(char *id) {
+    return sizeof(af_VarSpace *);
+}
+
+void initData3(char *id, af_VarSpace **data, af_Environment *env) {
+    *data = makeVarSpace(env);
+}
+
+void freeData3(char *id, af_VarSpace **data, af_Environment *env) {
+    printf("freeData(): *data = %p\n", *data);
+    freeVarSpace(*data, env);
+}
+
+af_GcList *getGcList3(char *id, void *data) {
+    af_GcList *gl = pushGcList(glt_vs, *(af_VarSpace **)data, NULL);
+    return gl;
+}
+
+
+af_VarSpace *getShareVS(af_Object *obj) {
+    return *(af_VarSpace **)getObjectData(obj);
+}
+
 bool getAcl(af_ArgCodeList **acl, af_Object *obj, af_Code *code, int **mark, af_Environment *env) {
     *acl = makeArgCodeList(makeVariableCode("object", NUL, 0, "Unknown"), 0, true, false);
     *mark = calloc(sizeof(int), 1);
@@ -213,6 +236,37 @@ int main() {
         printf("global(%p)\n", obj);
     }
 
+    {
+        af_ObjectAPI *api = makeObjectAPI();
+        af_Object *obj;
+        DLC_SYMBOL(objectAPIFunc) getSize_3 = MAKE_SYMBOL(getSize3, objectAPIFunc);
+        DLC_SYMBOL(objectAPIFunc) initData_3 = MAKE_SYMBOL(initData3, objectAPIFunc);
+        DLC_SYMBOL(objectAPIFunc) freeData_3 = MAKE_SYMBOL(freeData3, objectAPIFunc);
+        DLC_SYMBOL(objectAPIFunc) getShareVS_ = MAKE_SYMBOL(getShareVS, objectAPIFunc);
+        DLC_SYMBOL(objectAPIFunc) get_gl3 = MAKE_SYMBOL(getGcList3, objectAPIFunc);
+        if (addAPI(getSize_3, "obj_getDataSize", api) != 1)
+            return 2;
+        if (addAPI(initData_3, "obj_initData", api) != 1)
+            return 2;
+        if (addAPI(freeData_3, "obj_freeData", api) != 1)
+            return 2;
+        if (addAPI(getShareVS_, "obj_getShareVarSpace", api) != 1)
+            return 2;
+        if (addAPI(get_gl3, "obj_getGcList", api) != 1)
+            return 2;
+
+        addVarToProtectVarSpace(makeVar("object", 3, 3,
+                                        (obj = makeObject("object", true, api, true, NULL, NULL, env)),
+                                        env),
+                                env);
+        FREE_SYMBOL(getSize_3);
+        FREE_SYMBOL(initData_3);
+        FREE_SYMBOL(freeData_3);
+        FREE_SYMBOL(getShareVS_);
+        FREE_SYMBOL(get_gl3);
+        printf("object(%p)\n", obj);
+    }
+
     {
         af_ObjectAPI *api = makeObjectAPI();
         af_Object *obj;
@@ -401,15 +455,6 @@ int main() {
         printf("func4(%p)\n", obj);
     }
 
-    {
-        af_Object *obj;
-        addVarToProtectVarSpace(makeVar("object", 3, 3,
-                                        (obj = makeObject("object", true, makeObjectAPI(), true, NULL, NULL, env)),
-                                        env),
-                                env);
-        printf("object(%p)\n", obj);
-    }
-
     printf("\n");
 
     {