浏览代码

refactor: 调整obj-api

部分api新增char *id参数
SongZihuan 3 年之前
父节点
当前提交
f45f4050a4
共有 4 个文件被更改,包括 15 次插入15 次删除
  1. 4 4
      include/obj_api.h
  2. 1 1
      src/core/gc.c
  3. 3 3
      src/core/object.c
  4. 7 7
      src/main.c

+ 4 - 4
include/obj_api.h

@@ -25,9 +25,9 @@ typedef void callFuncBody(void *mark, af_Environment *env);  // 位于env.h
 
 /* 定义Object的函数签名 */
 /* Object void *data 管理 */
-typedef size_t obj_getDataSize(void);  // 获取data的大小
-typedef void obj_initData(void *data, af_Environment *env);  // 初始化data
-typedef void obj_freeData(void *data, af_Environment *env);  // 释放data的内容 (但不释放void *data)指针
+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 bool obj_funcGetArgCodeList(af_ArgCodeList **acl, af_Object *obj, af_Code *code, void **mark, af_Environment *env);  // 获取参数计算表
@@ -43,6 +43,6 @@ typedef void obj_literalSetting(char *str, void *data, af_Object *obj, af_Enviro
 typedef bool obj_isObjFunc(af_Object *obj);  // 是否对象函数
 
 /* Object gc管理 */
-typedef af_GcList *obj_getGcList(void *data);  // 是否对象函数
+typedef af_GcList *obj_getGcList(char *id, void *data);  // 是否对象函数
 
 #endif //AFUN__OBJ_API_H

+ 1 - 1
src/core/gc.c

@@ -155,7 +155,7 @@ static pgc_Analyzed reachableObjectData(struct af_ObjectData *od, pgc_Analyzed p
 
     obj_getGcList *func = findAPI("obj_getGcList", od->api);
     if (func != NULL) {
-        af_GcList *gl = func(od->data);
+        af_GcList *gl = func(od->id, od->data);
         for (af_GcList *tmp = gl; tmp != NULL; tmp = tmp->next) {
             switch (tmp->type) {
                 case glt_obj:

+ 3 - 3
src/core/object.c

@@ -30,14 +30,14 @@ static af_ObjectData * makeObjectData_Pri(char *id, bool free_api, af_ObjectAPI
     obj_getDataSize *func = findAPI("obj_getDataSize", api);
     obj_initData *init = findAPI("obj_initData", api);
     if (func != NULL)
-        od->size = func();
+        od->size = func(od->id);
     else
         od->size = 0;
 
     if (od->size != 0) {
         od->data = calloc(od->size, 1);
         if (init != NULL)
-            init(od->data, env);
+            init(od->id, od->data, env);
     }
 
     od->api = api;
@@ -102,7 +102,7 @@ void freeObjectData(af_ObjectData *od, af_Environment *env) {
     if (od->size != 0) {
         obj_freeData *func = findAPI("obj_freeData", od->api);
         if (func != NULL)
-            func(od->data, env);
+            func(od->id, od->data, env);
     }
 
     free(od->id);

+ 7 - 7
src/main.c

@@ -10,29 +10,29 @@ void mp_ERROR_STR(af_Message *msg, af_Environment *env) {
     free(*pinfo);
 }
 
-size_t getSize(void) {
+size_t getSize(char *id) {
     return sizeof(int *);
 }
 
-void initData(int **data, af_Environment *env) {
+void initData(char *id, int **data, af_Environment *env) {
     *data = calloc(sizeof(int), 1);
     **data = 100;
 }
 
-void freeData(int **data, af_Environment *env) {
+void freeData(char *id, int **data, af_Environment *env) {
     printf("freeData(): **data = %d\n", **data);
     free(*data);
 }
 
-size_t getSize2(void) {
+size_t getSize2(char *id) {
     return sizeof(af_VarSpaceListNode *);
 }
 
-void initData2(af_VarSpaceListNode **data, af_Environment *env) {
+void initData2(char *id, af_VarSpaceListNode **data, af_Environment *env) {
     *data = makeVarSpaceList(getProtectVarSpace(env));
 }
 
-void freeData2(af_VarSpaceListNode **data, af_Environment *env) {
+void freeData2(char *id, af_VarSpaceListNode **data, af_Environment *env) {
     printf("freeData2(): vsl = %p\n", *data);
     freeAllVarSpaceList(*data);
 }
@@ -49,7 +49,7 @@ bool getVsl(af_VarSpaceListNode **vsl, af_Object *obj, void *mark, af_Environmen
     return true;
 }
 
-af_GcList *getGcList(void *data) {
+af_GcList *getGcList(char *id, void *data) {
     af_GcList *gl = pushGcList(glt_vsl, *(af_VarSpaceListNode **)data, NULL);
     return gl;
 }