Browse Source

feat: 调整Object-API的签名

SongZihuan 3 năm trước cách đây
mục cha
commit
1c7ad6c5f0
9 tập tin đã thay đổi với 134 bổ sung207 xóa
  1. 33 19
      include/core/info/obj_api.h
  2. 6 6
      src/core/env.c
  3. 1 1
      src/core/gc.c
  4. 5 5
      src/core/global_obj.c
  5. 4 4
      src/core/object.c
  6. 3 3
      src/core/run.c
  7. 29 29
      src/main.c
  8. 0 86
      test/src/env_init.c
  9. 53 54
      test/src/run_code.c

+ 33 - 19
include/core/info/obj_api.h

@@ -24,29 +24,43 @@ typedef void TopMsgProcessFunc(af_Message *msg, bool is_gc, af_Environment *env)
 typedef struct af_FuncBody *callFuncBody(void *mark, af_Environment *env);  // 位于env.h
 
 /* 定义Object的函数签名 */
-/* Object void *data 管理 */
-typedef size_t obj_getDataSize(af_Object *obj);  // 获取data的大小
-typedef void obj_initData(af_Object *obj, void *data, af_Environment *env);  // 初始化data
-typedef void obj_destructData(af_Object *obj, void *data, af_Environment *env);  // 释放data的内容 (但不释放void *data)指针
+/*
+ * API的第一个参数必须为: id
+ * API第二个参数通常为: object
+ * API第三个参数: 通常为void *data [仅与data有关的函数会直接传入该值]
+ */
+
+#define BASE_ARG char *id, af_Object *obj /* 基础参数 */
+
+/*** Object void *data 管理 ***/
+typedef size_t obj_getDataSize(BASE_ARG);  // 获取data的大小
+typedef void obj_initData(BASE_ARG, void *data, af_Environment *env);  // 初始化data
+typedef void obj_destructData(BASE_ARG, void *data, af_Environment *env);  // 释放data的内容 (但不释放void *data)指针
 
-/* Object 面向对象管理 */
-typedef af_VarSpace *obj_getShareVarSpace(af_Object *obj);
+/*** Object 面向对象管理 ***/
+typedef af_VarSpace *obj_getShareVarSpace(BASE_ARG);
 
-/* 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);  // 获取函数变量空间
-typedef bool obj_funcGetArgList(af_ArgList **al, af_Object *obj, af_ArgCodeList *acl, void *mark, af_Environment *env);  // 获取参数赋值表
-typedef bool obj_funcGetInfo(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env);  // 获取函数信息
-typedef void obj_funcFreeMask(void *mark);  // 释放mask的函数
+/*** Object 函数调用 ***/
+/* 获取参数计算表 */
+typedef bool obj_funcGetArgCodeList(BASE_ARG, af_ArgCodeList **acl, af_Code *code, void **mark, af_Environment *env);
+/* 获取函数变量空间 */
+typedef bool obj_funcGetVarList(BASE_ARG, af_VarSpaceListNode **vsl, void *mark, af_Environment *env);
+/* 获取参数赋值表 */
+typedef bool obj_funcGetArgList(BASE_ARG, af_ArgList **al, af_ArgCodeList *acl, void *mark, af_Environment *env);
+/* 获取函数信息 */
+typedef bool obj_funcGetInfo(BASE_ARG, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env);
+/* 释放mask的函数 */
+typedef void obj_funcFreeMask(BASE_ARG, void *mark);
 
-/* Object 字面量设定 */
-typedef void obj_literalSetting(char *str, void *data, af_Object *obj, af_Environment *env);
+/*** Object 字面量设定 ***/
+typedef void obj_literalSetting(BASE_ARG, void *data, char *str, af_Environment *env);
 
-/* Object 函数管理 */
-typedef bool obj_isObjFunc(af_Object *obj);  // 是否对象函数
-typedef bool obj_isInfixFunc(af_Object *obj);  // 是否中缀函数
+/*** Object 函数管理 ***/
+typedef bool obj_isObjFunc(BASE_ARG);  // 是否对象函数
+typedef bool obj_isInfixFunc(BASE_ARG);  // 是否中缀函数
 
-/* Object gc管理 */
-typedef af_GcList *obj_getGcList(char *id, void *data);  // 是否对象函数
+/*** Object gc管理 ***/
+typedef af_GcList *obj_getGcList(BASE_ARG, void *data);  // 是否对象函数
 
+#undef BASE_ARG
 #endif //AFUN_OBJ_API_H

+ 6 - 6
src/core/env.c

@@ -726,7 +726,7 @@ static bool isInfixFunc(af_Code *code, af_Environment *env) {
     obj_isInfixFunc *func = findAPI("obj_isInfixFunc", var->vn->obj->data->api);
     if (func == NULL)
         return false;
-    return func(var->vn->obj);
+    return func(var->vn->obj->data->id, var->vn->obj);
 }
 
 bool pushExecutionActivity(af_Code *bt, bool return_first, af_Environment *env) {
@@ -912,12 +912,12 @@ bool setFuncActivityToArg(af_Object *func, af_Environment *env) {
 
     /* 遇到错误时 get_acl 和 get_var_list 要自行设定msg */
     if (get_acl != NULL) {
-        if (!get_acl(&env->activity->acl_start, func, env->activity->bt_top, &env->activity->mark, env))  // 设置acl
+        if (!get_acl(func->data->id, func, &env->activity->acl_start, env->activity->bt_top, &env->activity->mark, env))  // 设置acl
             return false;
     } else
         env->activity->acl_start = NULL;
 
-    if (!get_var_list(&env->activity->func_var_list, func, env->activity->mark, env))  // 设置 func_var_list
+    if (!get_var_list(func->data->id, func, &env->activity->func_var_list, env->activity->mark, env))  // 设置 func_var_list
         return false;
 
     env->activity->acl_done = env->activity->acl_start;
@@ -939,7 +939,7 @@ bool setFuncActivityAddVar(af_Environment *env){
     env->activity->fi = NULL;
     env->activity->body_next = NULL;
 
-    if (!get_info(&env->activity->fi, env->activity->func, env->activity->bt_top, env->activity->mark, env))
+    if (!get_info(env->activity->func->data->id, env->activity->func, &env->activity->fi, env->activity->bt_top, env->activity->mark, env))
         return false;
     if (env->activity->fi == NULL) {
         pushMessageDown(makeERRORMessage(API_RUN_ERROR, API_DONOT_GIVE(FuncInfo), env), env);
@@ -999,7 +999,7 @@ bool setFuncActivityAddVar(af_Environment *env){
 
     if (get_arg_list != NULL) {
         af_ArgList *al;
-        if (!get_arg_list(&al, env->activity->func, env->activity->acl_start, env->activity->mark, env))
+        if (!get_arg_list(env->activity->func->data->id, env->activity->func, &al, env->activity->acl_start, env->activity->mark, env))
             return false;
         runArgList(al, env->activity->var_list, env);
         freeAllArgList(al);
@@ -1091,7 +1091,7 @@ static void freeMark(af_Activity *activity) {
     if (activity->type == act_func && activity->func != NULL && activity->mark != NULL) {
         obj_funcFreeMask *func = findAPI("obj_funcFreeMask", activity->func->data->api);
         if (func != NULL)
-            func(activity->mark);
+            func(activity->func->data->id, activity->func, activity->mark);
         activity->mark = NULL;
     }
 }

+ 1 - 1
src/core/gc.c

@@ -178,7 +178,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->id, od->data);
+        af_GcList *gl = func(od->id, od->base, od->data);
         for (af_GcList *tmp = gl; tmp != NULL; tmp = tmp->next) {
             switch (tmp->type) {
                 case glt_obj:

+ 5 - 5
src/core/global_obj.c

@@ -1,24 +1,24 @@
 #include "aFunCore.h"
 #include "__object.h"
 
-static size_t getSize(af_Object *obj) {
+static size_t getSize(char *id, af_Object *obj) {
     return sizeof(af_VarSpace *);
 }
 
-static void initData(af_Object *obj, af_VarSpace **data, af_Environment *env) {
+static void initData(char *id, af_Object *obj, af_VarSpace **data, af_Environment *env) {
     *data = makeVarSpace(obj, 3, 2, 0, env);
 }
 
-static void freeData(af_Object *obj, af_VarSpace **data, af_Environment *env) {
+static void freeData(char *id, af_Object *obj, af_VarSpace **data, af_Environment *env) {
     // 无操作
 }
 
-static af_GcList *getGcList(char *id, void *data) {
+static af_GcList *getGcList(char *id, af_Object *obj, void *data) {
     return pushGcList(glt_vs, *(af_VarSpace **)data, NULL);
 }
 
 
-static af_VarSpace *getShareVS(af_Object *obj) {
+static af_VarSpace *getShareVS(char *id, af_Object *obj) {
     return *(af_VarSpace **)getObjectData(obj);
 }
 

+ 4 - 4
src/core/object.c

@@ -39,14 +39,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(base_obj);
+        od->size = func(id, base_obj);
     else
         od->size = 0;
 
     if (od->size != 0) {
         od->data = calloc(1, od->size);
         if (init != NULL)
-            init(base_obj, od->data, env);
+            init(id, base_obj, od->data, env);
     }
 
     gc_addObjectData(od, env);
@@ -104,7 +104,7 @@ void freeObjectData(af_ObjectData *od, af_Environment *env) {
     if (od->size != 0) {
         obj_destructData *func = findAPI("obj_destructData", od->api);
         if (func != NULL)
-            func(od->base, od->data, env);
+            func(od->id, od->base, od->data, env);
     }
 
     free(od->id);
@@ -142,7 +142,7 @@ 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)
+    if (func == NULL || (vs = func(obj->data->id, obj)) == NULL)
         return NULL;
 
     af_Inherit *ih = calloc(1, sizeof(af_Inherit));

+ 3 - 3
src/core/run.c

@@ -57,7 +57,7 @@ static bool checkLiteral(af_Message **msg, af_Environment *env) {
     }
 
     for (af_LiteralDataList *ld = env->activity->ld; ld != NULL; ld = ld->next)
-        func(ld->literal_data, obj->data->data, obj, env);
+        func(obj->data->id, obj, obj->data->data, ld->literal_data, env);
 
     freeAllLiteralData(env->activity->ld);
     env->activity->ld = NULL;
@@ -194,10 +194,10 @@ static bool codeElement(af_Code *code, af_Environment *env) {
     obj_isInfixFunc *is_infix;
 
     if (code->prefix != getPrefix(E_QUOTE, env)) {
-        if ((is_obj = findAPI("obj_isObjFunc", obj->data->api)) != NULL && is_obj(obj))
+        if ((is_obj = findAPI("obj_isObjFunc", obj->data->api)) != NULL && is_obj(obj->data->id, obj))
             return pushVariableActivity(code, var->vn->obj, env);  // 对象函数
         else if (env->activity->status != act_func_get && // 在act_func_get 模式下不检查是否为is_infix函数 因为本来就要将其作为函数调用
-                 (is_infix = findAPI("obj_isInfixFunc", obj->data->api)) != NULL && is_infix(obj)) {
+                 (is_infix = findAPI("obj_isInfixFunc", obj->data->api)) != NULL && is_infix(obj->data->id, obj)) {
             pushMessageDown(makeERRORMessageFormat(INFIX_PROTECT, env,
                                                    "Infix protect variable: %s.", code->element.data), env);
             return false;

+ 29 - 29
src/main.c

@@ -1,78 +1,78 @@
 #include <stdio.h>
 #include "aFun.h"
 
-size_t getSize(af_Object *obj) {
+size_t getSize(char *id, af_Object *obj) {
     return sizeof(int *);
 }
 
-void initData(af_Object *obj, int **data, af_Environment *env) {
+void initData(char *id, af_Object *obj, int **data, af_Environment *env) {
     *data = calloc(1, sizeof(int));
     **data = 100;
 }
 
-void freeData(af_Object *obj, int **data, af_Environment *env) {
+void freeData(char *id, af_Object *obj, int **data, af_Environment *env) {
     printf("freeData(): **data = %d\n", **data);
     free(*data);
 }
 
-size_t getSize2(af_Object *obj) {
+size_t getSize2(char *id, af_Object *obj) {
     return sizeof(af_VarSpaceListNode *);
 }
 
-void initData2(af_Object *obj, af_VarSpaceListNode **data, af_Environment *env) {
+void initData2(char *id, af_Object *obj, af_VarSpaceListNode **data, af_Environment *env) {
     *data = makeVarSpaceList(getProtectVarSpace(env));
 }
 
-void freeData2(af_Object *obj, af_VarSpaceListNode **data, af_Environment *env) {
+void freeData2(char *id, af_Object *obj, af_VarSpaceListNode **data, af_Environment *env) {
     printf("freeData2(): vsl = %p\n", *data);
     freeAllVarSpaceList(*data);
 }
 
-size_t getSize3(af_Object *obj) {
+size_t getSize3(char *id, af_Object *obj) {
     return sizeof(af_VarSpace *);
 }
 
-void initData3(af_Object *obj, af_VarSpace **data, af_Environment *env) {
+void initData3(char *id, af_Object *obj, af_VarSpace **data, af_Environment *env) {
     *data = makeVarSpace(obj, 3, 2, 0, env);
 }
 
-void freeData3(af_Object *obj, af_VarSpace **data, af_Environment *env) {
+void freeData3(char *id, af_Object *obj, af_VarSpace **data, af_Environment *env) {
     printf("freeData(): *data = %p\n", *data);
 }
 
-af_GcList *getGcList3(char *id, void *data) {
+af_GcList *getGcList3(char *id, af_Object *obj, void *data) {
     af_GcList *gl = pushGcList(glt_vs, *(af_VarSpace **)data, NULL);
     return gl;
 }
 
 
-af_VarSpace *getShareVS(af_Object *obj) {
+af_VarSpace *getShareVS(char *id, af_Object *obj) {
     return *(af_VarSpace **)getObjectData(obj);
 }
 
-bool getAcl(af_ArgCodeList **acl, af_Object *obj, af_Code *code, int **mark, af_Environment *env) {
+bool getAcl(char *id, af_Object *obj, af_ArgCodeList **acl, af_Code *code, int **mark, af_Environment *env) {
     *acl = makeArgCodeList(makeElementCode("object", NUL, 0, "Unknown"), 0, true, false);
     *mark = calloc(1, sizeof(int));
     **mark = 100;
     return true;
 }
 
-bool getVsl(af_VarSpaceListNode **vsl, af_Object *obj, void *mark, af_Environment *env) {
+bool getVsl(char *id, af_Object *obj, af_VarSpaceListNode **vsl, void *mark, af_Environment *env) {
     *vsl = *(af_VarSpaceListNode **)getObjectData(obj);
     return true;
 }
 
-af_GcList *getGcList(char *id, void *data) {
+af_GcList *getGcList(char *id, af_Object *obj, void *data) {
     af_GcList *gl = pushGcList(glt_vsl, *(af_VarSpaceListNode **)data, NULL);
     return gl;
 }
 
-bool getAl(af_ArgList **al, af_Object *obj, af_ArgCodeList *acl, void *mark, af_Environment *env) {
+bool getAl(char *id, af_Object *obj, af_ArgList **al, af_ArgCodeList *acl, void *mark, af_Environment *env) {
     *al = makeArgList("test", getArgCodeListResult(acl));
     return true;
 }
 
-void literalSet(char *str, void *data, af_Object *obj, af_Environment *env) {
+void literalSet(char *id, af_Object *obj, void *data, char *str, af_Environment *env) {
     printf("literalSet(): str = %s\n", str);
 }
 
@@ -93,7 +93,7 @@ af_FuncBody *testFunc(int *mark, af_Environment *env) {  // 测试用函数
     return NULL;
 }
 
-bool getInfo(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
+bool getInfo(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
     *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
     makeCodeFuncBodyToFuncInfo(makeElementCode("test", NUL, 0, "Unknown"), true, NULL, *fi);
 
@@ -103,7 +103,7 @@ bool getInfo(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Env
     return true;
 }
 
-void freeMark(int *mark) {
+void freeMark(char *id, af_Object *obj, int *mark) {
     printf("freeMark(): mark = %d\n", *mark);
     free(mark);
 }
@@ -158,7 +158,7 @@ af_FuncBody *testFunc2(int *mark, af_Environment *env) {  // 测试用函数
     return NULL;
 }
 
-bool getInfo2(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
+bool getInfo2(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
     *fi = makeFuncInfo(normal_scope, not_embedded, true, true, true);
     makeCodeFuncBodyToFuncInfo(makeElementCode("test", NUL, 0, "Unknown"), true, NULL, *fi);
     DLC_SYMBOL(callFuncBody) func = MAKE_SYMBOL(testFunc2, callFuncBody);
@@ -167,7 +167,7 @@ bool getInfo2(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_En
     return true;
 }
 
-bool getInfo3(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
+bool getInfo3(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
     *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
     makeCodeFuncBodyToFuncInfo(makeElementCode("data3", NUL, 0, "Unknown"), true, NULL, *fi);
     return true;
@@ -190,7 +190,7 @@ af_FuncBody *testFunc4(int *mark, af_Environment *env) {  // 测试用函数
     return NULL;
 }
 
-bool getInfo4(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
+bool getInfo4(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
     *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
     DLC_SYMBOL(callFuncBody) func = MAKE_SYMBOL(testFunc4, callFuncBody);
     makeCFuncBodyToFuncInfo(func, NULL, *fi);
@@ -212,7 +212,7 @@ af_FuncBody *testFunc9(int *mark, af_Environment *env) {  // 测试用函数
     return fb;
 }
 
-bool getInfo9(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
+bool getInfo9(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
     *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
     DLC_SYMBOL(callFuncBody) func1 = MAKE_SYMBOL(testFunc9, callFuncBody);
     makeCFuncBodyToFuncInfo(func1, NULL, *fi);
@@ -240,7 +240,7 @@ af_FuncBody *testFunc7(int *mark, af_Environment *env) {  // 测试用函数
     return NULL;
 }
 
-bool getInfo7(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
+bool getInfo7(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
     *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
     DLC_SYMBOL(callFuncBody) func = MAKE_SYMBOL(testFunc7, callFuncBody);
     makeCFuncBodyToFuncInfo(func, NULL, *fi);
@@ -288,7 +288,7 @@ af_FuncBody *testFunc6(int *mark, af_Environment *env) {  // 测试用函数
     return NULL;
 }
 
-bool getInfo6(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
+bool getInfo6(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
     *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
     DLC_SYMBOL(callFuncBody) func1 = MAKE_SYMBOL(testFunc6, callFuncBody);
     makeCFuncBodyToFuncInfo(func1, NULL, *fi);
@@ -340,7 +340,7 @@ af_FuncBody *testFunc5(int *mark, af_Environment *env) {  // 测试用函数
     return NULL;
 }
 
-bool getInfo5(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
+bool getInfo5(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
     *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
     DLC_SYMBOL(callFuncBody) func = MAKE_SYMBOL(testFunc5, callFuncBody);
     makeCFuncBodyToFuncInfo(func, NULL, *fi);
@@ -349,23 +349,23 @@ bool getInfo5(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_En
     return true;
 }
 
-bool getInfo10(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
+bool getInfo10(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
     *fi = makeFuncInfo(normal_scope, not_embedded, true, true, true);
     makeCodeFuncBodyToFuncInfo(makeElementCode("no-var", NUL, 1, "func9.info.af"), true, NULL, *fi);
     return true;
 }
 
-bool getInfo11(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
+bool getInfo11(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
     *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
     makeImportFuncBodyToFuncInfo(makeElementCode("global", NUL, 1, "func9.info.af"), true, NULL, *fi);
     return true;
 }
 
-bool objFunc(af_Object *obj) {
+bool objFunc(char *id, af_Object *obj) {
     return true;
 }
 
-bool infixFunc(af_Object *obj) {
+bool infixFunc(char *id, af_Object *obj) {
     return true;
 }
 

+ 0 - 86
test/src/env_init.c

@@ -1,96 +1,10 @@
 #include <stdio.h>
 #include "aFun.h"
 
-size_t getSize(af_Object *obj) {
-    return sizeof(int *);
-}
-
-void initData(af_Object *obj, int **data, af_Environment *env) {
-    *data = calloc(1, sizeof(int));
-    **data = 100;
-}
-
-void freeData(af_Object *obj, int **data, af_Environment *env) {
-    printf("freeData(): **data = %d\n", **data);
-    free(*data);
-}
-
-size_t getSize3(af_Object *obj) {
-    return sizeof(af_VarSpace *);
-}
-
-void initData3(af_Object *obj, af_VarSpace **data, af_Environment *env) {
-    *data = makeVarSpace(obj, 3, 2, 0, env);
-}
-
-void freeData3(af_Object *obj, af_VarSpace **data, af_Environment *env) {
-    printf("freeData(): *data = %p\n", *data);
-}
-
-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);
-}
-
 int main() {
     aFunCoreInit();
 
     af_Environment *env = makeEnvironment(grt_always);
-    {
-        af_ObjectAPI *api = makeObjectAPI();
-        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,
-                                        makeObject("global", true, api, true, NULL, NULL, env), env),
-                                env);
-        FREE_SYMBOL(getSize_);
-        FREE_SYMBOL(initData_);
-        FREE_SYMBOL(freeData_);
-    }
-
-    {
-        af_ObjectAPI *api = makeObjectAPI();
-        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_destructData", 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, 3,
-                                        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);
-    }
-
-
     enableEnvironment(env);
     freeEnvironment(env);
     return 0;

+ 53 - 54
test/src/run_code.c

@@ -1,78 +1,78 @@
 #include <stdio.h>
 #include "aFun.h"
 
-size_t getSize(af_Object *obj) {
+size_t getSize(char *id, af_Object *obj) {
     return sizeof(int *);
 }
 
-void initData(af_Object *obj, int **data, af_Environment *env) {
+void initData(char *id, af_Object *obj, int **data, af_Environment *env) {
     *data = calloc(1, sizeof(int));
     **data = 100;
 }
 
-void freeData(af_Object *obj, int **data, af_Environment *env) {
+void freeData(char *id, af_Object *obj, int **data, af_Environment *env) {
     printf("freeData(): **data = %d\n", **data);
     free(*data);
 }
 
-size_t getSize2(af_Object *obj) {
+size_t getSize2(char *id, af_Object *obj) {
     return sizeof(af_VarSpaceListNode *);
 }
 
-void initData2(af_Object *obj, af_VarSpaceListNode **data, af_Environment *env) {
+void initData2(char *id, af_Object *obj, af_VarSpaceListNode **data, af_Environment *env) {
     *data = makeVarSpaceList(getProtectVarSpace(env));
 }
 
-void freeData2(af_Object *obj, af_VarSpaceListNode **data, af_Environment *env) {
+void freeData2(char *id, af_Object *obj, af_VarSpaceListNode **data, af_Environment *env) {
     printf("freeData2(): vsl = %p\n", *data);
     freeAllVarSpaceList(*data);
 }
 
-size_t getSize3(af_Object *obj) {
+size_t getSize3(char *id, af_Object *obj) {
     return sizeof(af_VarSpace *);
 }
 
-void initData3(af_Object *obj, af_VarSpace **data, af_Environment *env) {
+void initData3(char *id, af_Object *obj, af_VarSpace **data, af_Environment *env) {
     *data = makeVarSpace(obj, 3, 2, 0, env);
 }
 
-void freeData3(af_Object *obj, af_VarSpace **data, af_Environment *env) {
+void freeData3(char *id, af_Object *obj, af_VarSpace **data, af_Environment *env) {
     printf("freeData(): *data = %p\n", *data);
 }
 
-af_GcList *getGcList3(char *id, void *data) {
+af_GcList *getGcList3(char *id, af_Object *obj, void *data) {
     af_GcList *gl = pushGcList(glt_vs, *(af_VarSpace **)data, NULL);
     return gl;
 }
 
 
-af_VarSpace *getShareVS(af_Object *obj) {
+af_VarSpace *getShareVS(char *id, af_Object *obj) {
     return *(af_VarSpace **)getObjectData(obj);
 }
 
-bool getAcl(af_ArgCodeList **acl, af_Object *obj, af_Code *code, int **mark, af_Environment *env) {
+bool getAcl(char *id, af_Object *obj, af_ArgCodeList **acl, af_Code *code, int **mark, af_Environment *env) {
     *acl = makeArgCodeList(makeElementCode("object", NUL, 0, "Unknown"), 0, true, false);
     *mark = calloc(1, sizeof(int));
     **mark = 100;
     return true;
 }
 
-bool getVsl(af_VarSpaceListNode **vsl, af_Object *obj, void *mark, af_Environment *env) {
+bool getVsl(char *id, af_Object *obj, af_VarSpaceListNode **vsl, void *mark, af_Environment *env) {
     *vsl = *(af_VarSpaceListNode **)getObjectData(obj);
     return true;
 }
 
-af_GcList *getGcList(char *id, void *data) {
+af_GcList *getGcList(char *id, af_Object *obj, void *data) {
     af_GcList *gl = pushGcList(glt_vsl, *(af_VarSpaceListNode **)data, NULL);
     return gl;
 }
 
-bool getAl(af_ArgList **al, af_Object *obj, af_ArgCodeList *acl, void *mark, af_Environment *env) {
+bool getAl(char *id, af_Object *obj, af_ArgList **al, af_ArgCodeList *acl, void *mark, af_Environment *env) {
     *al = makeArgList("test", getArgCodeListResult(acl));
     return true;
 }
 
-void literalSet(char *str, void *data, af_Object *obj, af_Environment *env) {
+void literalSet(char *id, af_Object *obj, void *data, char *str, af_Environment *env) {
     printf("literalSet(): str = %s\n", str);
 }
 
@@ -93,7 +93,7 @@ af_FuncBody *testFunc(int *mark, af_Environment *env) {  // 测试用函数
     return NULL;
 }
 
-bool getInfo(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
+bool getInfo(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
     *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
     makeCodeFuncBodyToFuncInfo(makeElementCode("test", NUL, 0, "Unknown"), true, NULL, *fi);
 
@@ -103,7 +103,7 @@ bool getInfo(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Env
     return true;
 }
 
-void freeMark(int *mark) {
+void freeMark(char *id, af_Object *obj, int *mark) {
     printf("freeMark(): mark = %d\n", *mark);
     free(mark);
 }
@@ -158,7 +158,7 @@ af_FuncBody *testFunc2(int *mark, af_Environment *env) {  // 测试用函数
     return NULL;
 }
 
-bool getInfo2(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
+bool getInfo2(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
     *fi = makeFuncInfo(normal_scope, not_embedded, true, true, true);
     makeCodeFuncBodyToFuncInfo(makeElementCode("test", NUL, 0, "Unknown"), true, NULL, *fi);
     DLC_SYMBOL(callFuncBody) func = MAKE_SYMBOL(testFunc2, callFuncBody);
@@ -167,7 +167,7 @@ bool getInfo2(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_En
     return true;
 }
 
-bool getInfo3(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
+bool getInfo3(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
     *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
     makeCodeFuncBodyToFuncInfo(makeElementCode("data3", NUL, 0, "Unknown"), true, NULL, *fi);
     return true;
@@ -190,7 +190,7 @@ af_FuncBody *testFunc4(int *mark, af_Environment *env) {  // 测试用函数
     return NULL;
 }
 
-bool getInfo4(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
+bool getInfo4(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
     *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
     DLC_SYMBOL(callFuncBody) func = MAKE_SYMBOL(testFunc4, callFuncBody);
     makeCFuncBodyToFuncInfo(func, NULL, *fi);
@@ -212,7 +212,7 @@ af_FuncBody *testFunc9(int *mark, af_Environment *env) {  // 测试用函数
     return fb;
 }
 
-bool getInfo9(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
+bool getInfo9(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
     *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
     DLC_SYMBOL(callFuncBody) func1 = MAKE_SYMBOL(testFunc9, callFuncBody);
     makeCFuncBodyToFuncInfo(func1, NULL, *fi);
@@ -240,7 +240,7 @@ af_FuncBody *testFunc7(int *mark, af_Environment *env) {  // 测试用函数
     return NULL;
 }
 
-bool getInfo7(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
+bool getInfo7(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
     *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
     DLC_SYMBOL(callFuncBody) func = MAKE_SYMBOL(testFunc7, callFuncBody);
     makeCFuncBodyToFuncInfo(func, NULL, *fi);
@@ -288,7 +288,7 @@ af_FuncBody *testFunc6(int *mark, af_Environment *env) {  // 测试用函数
     return NULL;
 }
 
-bool getInfo6(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
+bool getInfo6(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
     *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
     DLC_SYMBOL(callFuncBody) func1 = MAKE_SYMBOL(testFunc6, callFuncBody);
     makeCFuncBodyToFuncInfo(func1, NULL, *fi);
@@ -340,7 +340,7 @@ af_FuncBody *testFunc5(int *mark, af_Environment *env) {  // 测试用函数
     return NULL;
 }
 
-bool getInfo5(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
+bool getInfo5(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
     *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
     DLC_SYMBOL(callFuncBody) func = MAKE_SYMBOL(testFunc5, callFuncBody);
     makeCFuncBodyToFuncInfo(func, NULL, *fi);
@@ -349,23 +349,23 @@ bool getInfo5(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_En
     return true;
 }
 
-bool getInfo10(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
+bool getInfo10(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
     *fi = makeFuncInfo(normal_scope, not_embedded, true, true, true);
     makeCodeFuncBodyToFuncInfo(makeElementCode("no-var", NUL, 1, "func9.info.af"), true, NULL, *fi);
     return true;
 }
 
-bool getInfo11(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
+bool getInfo11(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
     *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
     makeImportFuncBodyToFuncInfo(makeElementCode("global", NUL, 1, "func9.info.af"), true, NULL, *fi);
     return true;
 }
 
-bool objFunc(af_Object *obj) {
+bool objFunc(char *id, af_Object *obj) {
     return true;
 }
 
-bool infixFunc(af_Object *obj) {
+bool infixFunc(char *id, af_Object *obj) {
     return true;
 }
 
@@ -871,7 +871,6 @@ int main() {
     }
 
     printf("\n");
-    enableEnvironment(env);
 
     {  // 正常程序
         printf("TAG A:\n");
@@ -886,7 +885,7 @@ int main() {
         af_Code *bt6 = makeElementCode("global", 0, 1, NULL);
         pushCode(&bt5, bt6);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -902,7 +901,7 @@ int main() {
         af_Code *bt6 = makeElementCode("global", 0, 1, NULL);
         pushCode(&bt5, bt6);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -918,7 +917,7 @@ int main() {
         af_Code *bt5 = makeBlockCode(curly, bt3, 0, 1, NULL, NULL);
         pushCode(&bt2, bt5);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -927,7 +926,7 @@ int main() {
         printf("TAG C:\n");
         af_Code *bt1 = makeElementCode("data", ',', 0, "tagc.af");
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -945,7 +944,7 @@ int main() {
         af_Code *bt6 = makeElementCode("global", 0, 1, NULL);
         pushCode(&bt5, bt6);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -962,7 +961,7 @@ int main() {
         af_Code *bt6 = makeElementCode("global", 0, 1, NULL);
         pushCode(&bt5, bt6);
 
-        iterCode(bt5, 0, env);
+        runCodeFromMemory(bt5, env);
         freeAllCode(bt5);
         printf("\n");
     }
@@ -979,7 +978,7 @@ int main() {
         af_Code *bt6 = makeElementCode("global", 0, 1, NULL);
         pushCode(&bt5, bt6);
 
-        iterCode(bt5, 0, env);
+        runCodeFromMemory(bt5, env);
         freeAllCode(bt5);
         printf("\n");
     }
@@ -993,7 +992,7 @@ int main() {
 
         af_Code *bt5 = makeBlockCode(parentheses, bt3, '\'', 1, "tagg.af", NULL);
 
-        iterCode(bt5, 0, env);
+        runCodeFromMemory(bt5, env);
         freeAllCode(bt5);
         printf("\n");
     }
@@ -1007,7 +1006,7 @@ int main() {
 
         af_Code *bt5 = makeBlockCode(brackets, bt3, ',', 1, "tagh.af", NULL);
 
-        iterCode(bt5, 0, env);
+        runCodeFromMemory(bt5, env);
         freeAllCode(bt5);
         printf("\n");
     }
@@ -1024,7 +1023,7 @@ int main() {
         af_Code *bt6 = makeElementCode("global", 0, 1, NULL);
         pushCode(&bt5, bt6);
 
-        iterCode(bt3, 0, env);
+        runCodeFromMemory(bt3, env);
         freeAllCode(bt3);
         printf("\n");
     }
@@ -1035,7 +1034,7 @@ int main() {
         af_Code *bt2 = makeElementCode("global", 0, 1, NULL);
         pushCode(&bt1, bt2);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1046,7 +1045,7 @@ int main() {
         af_Code *bt2 = makeElementCode("global", 0, 1, NULL);
         pushCode(&bt1, bt2);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1055,7 +1054,7 @@ int main() {
         printf("TAG L:\n");
         af_Code *bt1 = makeElementCode("func4", 0, 1, "tagl.af");
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1066,7 +1065,7 @@ int main() {
         af_Code *bt2 = makeElementCode("func", 0, 1, NULL);
         af_Code *bt1 = makeBlockCode(curly, bt2, 0, 1, "Tagm.af", NULL);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1082,7 +1081,7 @@ int main() {
         pushCode(&bt1, bt3);
         pushCode(&bt3, bt4);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1096,7 +1095,7 @@ int main() {
 
         pushCode(&bt1, bt3);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1110,7 +1109,7 @@ int main() {
 
         pushCode(&bt1, bt3);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1124,7 +1123,7 @@ int main() {
 
         pushCode(&bt1, bt3);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1142,7 +1141,7 @@ int main() {
         af_Code *bt6 = makeElementCode("global", 0, 1, NULL);
         pushCode(&bt5, bt6);
 
-        iterCode(bt1, 1, env);
+        runCodeFromMemoryAsImport(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1173,7 +1172,7 @@ int main() {
 
         pushCode(&bt1, bt3);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1188,7 +1187,7 @@ int main() {
         af_Code *bt6 = makeElementCode("global", 0, 1, NULL);
         pushCode(&bt5, bt6);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1200,7 +1199,7 @@ int main() {
 
         pushCode(&bt1, bt2);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1213,7 +1212,7 @@ int main() {
 
         pushCode(&bt1, bt2);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1227,7 +1226,7 @@ int main() {
         af_Code *bt3 = makeElementCode("global", 0, 1, NULL);
         pushCode(&bt1, bt3);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }