Explorar o código

feat: 函数调用使用API

SongZihuan %!s(int64=3) %!d(string=hai) anos
pai
achega
fcc7a47185
Modificáronse 10 ficheiros con 268 adicións e 100 borrados
  1. 1 0
      include/env.h
  2. 7 3
      include/func.h
  3. 31 2
      include/obj_api.h
  4. 2 1
      include/object.h
  5. 5 3
      src/core/__env.h
  6. 4 3
      src/core/__func.h
  7. 87 44
      src/core/env.c
  8. 8 0
      src/core/func.c
  9. 35 26
      src/core/run.c
  10. 88 18
      src/main.c

+ 1 - 0
include/env.h

@@ -8,6 +8,7 @@ typedef struct af_Environment af_Environment;
 typedef struct af_Message af_Message;
 
 /* 顶层消息处理器的处理函数 DLC */
+typedef void TopMsgProcessFunc(af_Message *msg, af_Environment *env);
 DEFINE_DLC_SYMBOL(TopMsgProcessFunc);
 
 #include "code.h"

+ 7 - 3
include/func.h

@@ -1,5 +1,9 @@
 #ifndef AFUN__FUNC_H_PUBLIC
 #define AFUN__FUNC_H_PUBLIC
+typedef struct ArgCodeList ArgCodeList;
+typedef struct ArgList ArgList;
+typedef struct af_FuncInfo af_FuncInfo;
+
 #include "code.h"
 #include "object.h"
 
@@ -16,9 +20,7 @@ enum af_FuncInfoEmbedded {
     super_embedded,  // 超内嵌函数
 };
 
-typedef struct ArgCodeList ArgCodeList;
-typedef struct ArgList ArgList;
-typedef struct af_FuncInfo af_FuncInfo;
+typedef void callFuncBody(void *make, af_Environment *env);
 DEFINE_DLC_SYMBOL(callFuncBody);
 
 /* ArgCodeList 创建与释放 */
@@ -29,6 +31,8 @@ void freeAllArgCodeList(ArgCodeList *acl);
 /* ArgCodeList 操作函数 */
 ArgCodeList **pushArgCodeList(ArgCodeList **base, ArgCodeList *new);
 ArgCodeList **pushNewArgCodeList(ArgCodeList **base, af_Code *code, size_t size, bool free_code, bool run_in_func);
+void *getArgCodeListData(ArgCodeList *acl);
+af_Object *getArgCodeListResult(ArgCodeList *acl);
 
 /* ArgList 创建与释放 */
 ArgList *makeArgList(char *name, af_Object *obj);

+ 31 - 2
include/obj_api.h

@@ -1,9 +1,38 @@
-#ifndef AFUN__OBJ_API_H
+/*
+ * 文件名: obj_api.h
+ * 目标:
+ * 1) 定义一些函数签名
+ * 2) 定义Object的函数签名
+ */
+
+#ifndef AFUN__OBJ_API_H
 #define AFUN__OBJ_API_H
+#include "env.h"
+#include "object.h"
+#include "var.h"
+#include "func.h"
+
+/* 定义一些函数原型 */
+/* API函数 */
+typedef void objectAPIFunc();  // 位于object.h (所有Object API函数指针都转换为该类型存储, 注: 具体调用类型参见下文)
+
+/* 顶层信号处理器函数 */
+typedef void TopMsgProcessFunc(af_Message *msg, af_Environment *env);  // 位于env.h
 
+/* 回调C函数 */
+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);  // 初始化data
-typedef void obj_freeData(void *data);  // 释放data的内容
+typedef void obj_freeData(void *data);  // 释放data的内容 (但不释放void *data)指针
+
+/* Object 函数调用 */
+typedef bool obj_funcGetArgCodeList(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(ArgList **al, af_Object *obj, 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的函数
 
 #endif //AFUN__OBJ_API_H

+ 2 - 1
include/object.h

@@ -1,15 +1,16 @@
 #ifndef AFUN__OBJECT_H_PUBLIC
 #define AFUN__OBJECT_H_PUBLIC
 #include "tool.h"
-#include "obj_api.h"
 
 typedef struct af_Object af_Object;
 typedef struct af_Inherit af_Inherit;
 typedef struct af_ObjectAPI af_ObjectAPI;
 
 /* 对象API函数 DLC */
+typedef void objectAPIFunc();
 DEFINE_DLC_SYMBOL(objectAPIFunc);
 
+#include "obj_api.h"
 #include "env.h"
 
 /* 对象创建与释放函数 */

+ 5 - 3
src/core/__env.h

@@ -82,7 +82,8 @@ struct af_Activity {  // 活动记录器
     struct ArgCodeList *acl_start;
     struct ArgCodeList *acl_next;
     struct af_FuncInfo *fi;
-    struct af_FuncBody *body;
+    struct af_FuncBody *body_next;
+    void *mark;  // 标记 [完全由API管理, 不随activity释放]
 };
 
 struct af_TopMsgProcess {  // 顶层msg处理器
@@ -121,6 +122,7 @@ void popActivity(af_Message *msg, af_Environment *env);
 
 /* 运行时Activity设置函数 (设置Activity) */
 bool setFuncActivityToArg(af_Object *func, af_Environment *env);
-bool setFuncActivityAddVar(bool new_vsl, bool is_protect, char **msg_type, af_Environment *env);
-bool setFuncActivityToNormal(bool is_first, af_Environment *env);
+bool setFuncActivityAddVar(bool new_vsl, bool is_protect, af_Environment *env);
+
+int setFuncActivityToNormal(af_Environment *env);
 #endif //AFUN__ENV_H

+ 4 - 3
src/core/__func.h

@@ -1,12 +1,13 @@
 #ifndef AFUN__FUNC_H
 #define AFUN__FUNC_H
 #include "macro.h"
+
+typedef struct af_FuncBody af_FuncBody;
+
 #include "func.h"
 #include "__object.h"
 #include "__code.h"
 
-typedef struct af_FuncBody af_FuncBody;
-
 struct ArgCodeList {
     void *info;  // info信息
     size_t size;
@@ -25,7 +26,7 @@ struct ArgList {
     struct ArgList *next;
 };
 
-typedef void callFuncBody(af_Environment *env);
+typedef void callFuncBody(void *mark, af_Environment *env);
 NEW_DLC_SYMBOL(callFuncBody, callFuncBody);
 
 struct af_FuncBody {

+ 87 - 44
src/core/env.c

@@ -14,6 +14,9 @@ static af_Activity *makeActivity(af_Code *bt_top, af_Code *bt_start, bool return
 static af_Activity *freeActivity(af_Activity *activity);
 static void freeAllActivity(af_Activity *activity);
 
+/* 活动记录器相关处理函数 */
+static void freeMark(af_Environment *env);
+
 /* 环境变量创建与释放 */
 static af_EnvVar *makeEnvVar(char *name, char *data);
 static af_EnvVar *freeEnvVar(af_EnvVar *var);
@@ -439,17 +442,20 @@ bool changeTopMsgProcess(char *type, DLC_SYMBOL(TopMsgProcessFunc) func,
 
 bool pushExecutionActivity(af_Code *bt, bool return_first, af_Environment *env) {
     af_Code *next;
-    if (!getCodeBlockNext(bt, &next))
+    if (!getCodeBlockNext(bt, &next)) {
+        pushMessageDown(makeMessage("ERROR-STR", 0), env);
         return false;
+    }
 
     env->activity->bt_next = next;
-    if (next == NULL && env->activity->body == NULL) {
+    if (next == NULL && env->activity->body_next == NULL) {
         printf("Tail tone recursive optimization\n");
         env->activity->bt_top = bt;
         env->activity->bt_start = bt->next;
         env->activity->bt_next = bt->next;
         if (!env->activity->return_first)  // 若原本就有设置 return_first 则没有在设置的必要了, 因为该执行不会被返回
             env->activity->return_first = return_first;
+        freeMark(env);
     } else {
         af_Activity *activity = makeActivity(bt, bt->next, return_first, env->activity->msg_up,
                                              env->activity->var_list, env->activity->belong,
@@ -465,16 +471,19 @@ bool pushExecutionActivity(af_Code *bt, bool return_first, af_Environment *env)
 bool pushFuncActivity(af_Code *bt, af_Environment *env) {
     af_Code *next;
     af_Object **parentheses_call = &env->activity->parentheses_call;
-    if (!getCodeBlockNext(bt, &next))
+    if (!getCodeBlockNext(bt, &next)) {
+        pushMessageDown(makeMessage("ERROR-STR", 0), env);
         return false;
+    }
 
     env->activity->bt_next = next;
-    if (next == NULL && env->activity->body == NULL) {
+    if (next == NULL && env->activity->body_next == NULL) {
         printf("Tail tone recursive optimization\n");
         env->activity->bt_top = bt;
         env->activity->bt_start = bt->next;
         env->activity->bt_next = bt->next;
-        // 保持原有的return_false
+        freeMark(env);
+        /* 保持原有的 return_first */
     } else {
         af_Activity *activity = makeActivity(bt, bt->next, false, env->activity->msg_up,
                                              env->activity->var_list, env->activity->belong, env->activity->func);
@@ -483,17 +492,27 @@ bool pushFuncActivity(af_Code *bt, af_Environment *env) {
     }
 
     env->activity->call_type = env->activity->bt_top->block.type;
+
     if (env->activity->call_type == parentheses) {  // 对于类前缀调用, 已经获得func的实际值了
-        setFuncActivityToArg(*parentheses_call, env);
+        bool re = setFuncActivityToArg(*parentheses_call, env);
         gc_delReference(*parentheses_call);
         *parentheses_call = NULL;
-    } else
-        env->activity->status = act_func;
+        return re;
+    }
 
+    env->activity->status = act_func;
     return true;
 }
 
 bool setFuncActivityToArg(af_Object *func, af_Environment *env) {
+    obj_funcGetArgCodeList *get_acl = findAPI("obj_funcGetArgCodeList", func->data->api);
+    obj_funcGetVarList *get_var_list = findAPI("obj_funcGetVarList", func->data->api);
+
+    if (get_var_list == NULL || get_acl == NULL) {
+        pushMessageDown(makeMessage("ERROR-STR", 0), env);
+        return false;
+    }
+
     af_Object *belong = getBelongObject(func, env);
     gc_delReference(env->activity->belong);
     if (env->activity->func != NULL)
@@ -505,70 +524,84 @@ bool setFuncActivityToArg(af_Object *func, af_Environment *env) {
     env->activity->belong = belong;
     env->activity->status = act_arg;
 
-    env->activity->func_var_list = env->activity->var_list;  // 设置vsl [桩]
-    env->activity->acl_start = NULL;  // 设置acl [桩]
+    /* 遇到错误时 get_acl 和 get_var_list 要自行设定msg */
+    if (!get_acl(&env->activity->acl_start, func, env->activity->bt_top, &env->activity->mark, env))  // 设置acl
+        return false;
+    if (!get_var_list(&env->activity->func_var_list, func, env->activity->mark, env))  // 设置 func_var_list
+        return false;
+
     env->activity->acl_next = env->activity->acl_start;
-    env->activity->bt_next = NULL;
+    if (env->activity->acl_next != NULL)
+        env->activity->bt_next = env->activity->acl_next->code;
+    else
+        env->activity->bt_next = NULL;
     return true;
 }
 
-void testFunc(af_Environment *env) {  // 测试用函数
-    printf("I am testFunc\n");
-}
-
-bool setFuncActivityAddVar(bool new_vsl, bool is_protect, char **msg_type, af_Environment *env) {
+bool setFuncActivityAddVar(bool new_vsl, bool is_protect, af_Environment *env){
     if (!new_vsl && is_protect)
         return false;
 
-    {  // 获取FuncInfo [桩]
-        env->activity->fi = makeFuncInfo(normal_scope, not_embedded, false, false);  // 获取FuncInfo [桩]
-        makeCodeFuncBodyToFuncInfo(env->activity->bt_start, false, NULL, env->activity->fi);
-
-        DLC_SYMBOL(callFuncBody) func = MAKE_SYMBOL(testFunc, callFuncBody);
-        makeCFuncBodyToFuncInfo(func, NULL, env->activity->fi);
-        FREE_SYMBOL(func);
+    obj_funcGetInfo *get_info = findAPI("obj_funcGetInfo", env->activity->func->data->api);
+    obj_funcGetArgList *get_arg_list = findAPI("obj_funcGetArgList", env->activity->func->data->api);
 
+    if (get_info == NULL || get_arg_list == NULL) {
+        pushMessageDown(makeMessage("ERROR-STR", 0), env);
+        return false;
     }
-    env->activity->body = env->activity->fi->body;
 
-    // 桩函数: 目前func_var_list引用自var_list, 故var_list不释放 [桩]
-    //af_VarSpaceListNode *vs = env->activity->var_list;
-    //for (int i = env->activity->new_vs_count; i > 0; i--) {
-    //    if (vs == NULL)  // 发生了错误
-    //        return false;
-    //    vs = popLastVarList(vs);
-    //}
+    if (!get_info(&env->activity->fi, env->activity->func, env->activity->bt_top, env->activity->mark, env))
+        return false;
+    env->activity->body_next = env->activity->fi->body;
+
+    af_VarSpaceListNode *vs = env->activity->var_list;
+    for (int i = env->activity->new_vs_count; i > 0; i--) {
+        if (vs == NULL) {  // 发生了错误
+            pushMessageDown(makeMessage("ERROR-STR", 0), env);
+            return false;
+        }
+        vs = popLastVarList(vs);
+    }
 
     env->activity->var_list = env->activity->func_var_list;
     env->activity->func_var_list = NULL;
-    // env->activity->new_vs_count = 0; // 目前func_var_list引用自var_list, 故不设置此值 [桩]
+    env->activity->new_vs_count = 0; // 目前func_var_list引用自var_list, 故不设置此值 [桩]
     if (new_vsl) {
         env->activity->var_list = pushNewVarList(env->activity->var_list);
         env->activity->new_vs_count++;
     }
 
-    runArgList(NULL, env->activity->var_list);
-    env->activity->var_list->vs->is_protect = is_protect;
+    ArgList *al;
+    if (!get_arg_list(&al, env->activity->func, env->activity->acl_start, env->activity->mark, env))
+        return false;
+    runArgList(al, env->activity->var_list);
+    freeAllArgList(al);
+
+    if (new_vsl && is_protect)
+        env->activity->var_list->vs->is_protect = true;
     return true;
 }
 
-bool setFuncActivityToNormal(bool is_first, af_Environment *env) {  // 获取函数的函数体
+int setFuncActivityToNormal(af_Environment *env){  // 获取函数的函数体
     env->activity->status = act_normal;
     env->activity->bt_next = NULL;
 
-    while (env->activity->body != NULL) {
-        if (env->activity->body->type == func_body_c) {
-            GET_SYMBOL(env->activity->body->c_func)(env);
-            env->activity->body = env->activity->body->next;
+    if (env->activity->body_next == NULL)  // 已经没有下一步了 (原msg不释放)
+        return -1;
+
+    while (env->activity->body_next != NULL) {
+        if (env->activity->body_next->type == func_body_c) {
+            GET_SYMBOL(env->activity->body_next->c_func)(env->activity->mark, env);
+            env->activity->body_next = env->activity->body_next->next;
         } else {
-            env->activity->bt_start = env->activity->body->code;
-            env->activity->bt_next = env->activity->body->code;
-            env->activity->body = env->activity->body->next;
-            return true;
+            env->activity->bt_start = env->activity->body_next->code;
+            env->activity->bt_next = env->activity->body_next->code;
+            env->activity->body_next = env->activity->body_next->next;
+            return 1;  // 仍有下一步
         }
     }
 
-    return false;
+    return 0;  // 没有下一步, 但运行了C函数 (原msg释放)
 }
 
 /*
@@ -587,6 +620,15 @@ static void runTopMessageProcess(af_Environment *env) {
     }
 }
 
+static void freeMark(af_Environment *env) {
+    if (env->activity->func != NULL) {
+        obj_funcFreeMask *func = findAPI("obj_funcFreeMask", env->activity->func->data->api);
+        if (func != NULL)
+            func(env->activity->mark);
+        env->activity->mark = NULL;
+    }
+}
+
 void popActivity(af_Message *msg, af_Environment *env) {
     if (env->activity->prev != NULL) {
         af_Message *new_msg;
@@ -605,5 +647,6 @@ void popActivity(af_Message *msg, af_Environment *env) {
         }
         runTopMessageProcess(env);
     }
+    freeMark(env);
     env->activity = freeActivity(env->activity);
 }

+ 8 - 0
src/core/func.c

@@ -56,6 +56,14 @@ ArgCodeList **pushNewArgCodeList(ArgCodeList **base, af_Code *code, size_t size,
     return &((*base)->next);
 }
 
+void *getArgCodeListData(ArgCodeList *acl) {
+    return acl->info;
+}
+
+af_Object *getArgCodeListResult(ArgCodeList *acl) {
+    return acl->result;
+}
+
 ArgList *makeArgList(char *name, af_Object *obj) {
     ArgList *arg_list = calloc(sizeof(ArgList), 1);
     arg_list->name = strCopy(name);

+ 35 - 26
src/core/run.c

@@ -55,9 +55,9 @@ static void codeBlock(af_Code *code, af_Environment *env) {
 }
 
 static bool checkInMsgType(char *type, af_Environment *env) {
-    if (env->activity->body == NULL || env->activity->body->msg_type == NULL)
+    if (env->activity->body_next == NULL || env->activity->body_next->msg_type == NULL)
         return false;
-    for (char *msg_type_node = *env->activity->body->msg_type; msg_type_node != NULL; msg_type_node++) {
+    for (char *msg_type_node = *env->activity->body_next->msg_type; msg_type_node != NULL; msg_type_node++) {
         if (EQ_STR(type, msg_type_node))
             return true;
     }
@@ -86,7 +86,7 @@ static void popLastActivity(af_Message *msg, af_Environment *env) {
 }
 
 bool iterCode(af_Code *code, af_Environment *env) {
-    bool process_mgs_first = false;  // 优先处理msg而不是运行代码
+    bool process_msg_first = false;  // 优先处理msg而不是运行代码
     if (!addTopActivity(code, env))
         return false;
 
@@ -101,7 +101,7 @@ bool iterCode(af_Code *code, af_Environment *env) {
 
         if (env->activity->bt_next != NULL) {
             run_code = true;
-            if (!process_mgs_first) {
+            if (!process_msg_first) {
                 switch (env->activity->bt_next->type) {
                     case literal:
                         codeLiteral(env->activity->bt_next, env);
@@ -116,7 +116,7 @@ bool iterCode(af_Code *code, af_Environment *env) {
                         break;  // 错误
                 }
             } else
-                process_mgs_first = false;
+                process_msg_first = false;
 
             if (env->activity->msg_down == NULL)  // 若未获得 msg
                 msg = makeMessage("ERROR-STR", 0);
@@ -130,7 +130,7 @@ bool iterCode(af_Code *code, af_Environment *env) {
                         gc_delReference(env->activity->return_obj);
                     env->activity->return_obj = NULL;
                     popLastActivity(NULL, env);  // msg 已经 push进去了
-                    process_mgs_first = true;
+                    process_msg_first = true;
                     continue;
                 }
             } else if (env->activity->return_first && env->activity->return_obj == NULL) {  // 设置return_first
@@ -142,47 +142,56 @@ bool iterCode(af_Code *code, af_Environment *env) {
         switch (env->activity->status) {
             case act_normal:
                 if (!run_code) {
-                    msg = makeMessage("ERROR-STR", 0);  // 无代码可运行
-                    popLastActivity(msg, env);
-                    process_mgs_first = true;
+                    popLastActivity(makeMessage("ERROR-STR", 0), env);
+                    process_msg_first = true;
                 } else if (env->activity->bt_next == NULL) { // 执行完成
-                    if (setFuncActivityToNormal(true, env)) {
-                        goto run_continue;  // 继续运行
-                    } else {
-                        popLastActivity(msg, env);
-                        process_mgs_first = true;
+                    switch (setFuncActivityToNormal(env)) {
+                        case -1:  // 已经没有下一步了 (原msg不释放)
+                            popLastActivity(msg, env);
+                            process_msg_first = true;
+                            break;
+                        case 0:  // 已经没有下一步了 (但原msg释放)
+                            gc_delReference(*(af_Object **)(msg->msg));  // msg->msg是一个指针, 这个指针的内容是一个af_Object *
+                            freeMessage(msg);
+                            popLastActivity(NULL, env);
+                            process_msg_first = true;
+                            break;
+                        default:
+                        case 1:  // 继续运行
+                            gc_delReference(*(af_Object **)(msg->msg));  // msg->msg是一个指针, 这个指针的内容是一个af_Object *
+                            freeMessage(msg);
+                            break;
                     }
                 } else if (env->activity->bt_next->type == block && env->activity->bt_next->block.type == parentheses
                            && env->activity->bt_next->prefix != env->core->prefix[B_EXEC]) {  // 类前缀调用
                     env->activity->parentheses_call = *(af_Object **)(msg->msg);
                     freeMessage(msg);
-                } else {
-                    run_continue:
+                } else {  // 继续运行
                     gc_delReference(*(af_Object **)(msg->msg));  // msg->msg是一个指针, 这个指针的内容是一个af_Object *
                     freeMessage(msg);
                 }
                 break;
             case act_func: {
                 if (!run_code) {
-                    msg = makeMessage("ERROR-STR", 0);  // 无代码可运行
-                    popLastActivity(msg, env);
-                    process_mgs_first = true;
+                    popLastActivity(makeMessage("ERROR-STR", 0), env);
+                    process_msg_first = true;
                 } else {
                     af_Object *func = *(af_Object **)(msg->msg);  // func仍保留了msg的gc计数
-                    freeMessage(msg);
-                    setFuncActivityToArg(func, env);  // 该函数会设定bt_next到arg计算的bt上
                     gc_delReference(func);  // 释放计数
+                    freeMessage(msg);
+                    if (!setFuncActivityToArg(func, env)) {  // 该函数会设定bt_next到arg计算的bt上
+                        popLastActivity(NULL, env);  // setFuncActivityToArg中已设置msg
+                        process_msg_first = true;
+                    }
                 }
                 break;
             }
             case act_arg: {
                 if (!run_code) {
                     act_arg_end:
-                    setFuncActivityAddVar(true, false, NULL, env);
-                    if (!setFuncActivityToNormal(true, env)) {
-                        msg = makeMessage("ERROR-STR", 0);  // 无代码可运行
-                        popLastActivity(msg, env);
-                        process_mgs_first = true;
+                    if (!setFuncActivityAddVar(true, false, env) || !setFuncActivityToNormal(env)) {
+                        popLastActivity(NULL, env);
+                        process_msg_first = true;
                     }
                 } else {
                     env->activity->acl_next->result = *(af_Object **)(msg->msg);

+ 88 - 18
src/main.c

@@ -20,10 +20,52 @@ void initData(int **data) {
 }
 
 void freeData(int **data) {
-    printf("**data = %d\n", **data);
+    printf("freeData(): **data = %d\n", **data);
     free(*data);
 }
 
+bool getAcl(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);
+    **mark = 100;
+    return true;
+}
+
+bool getVsl(af_VarSpaceListNode **vsl, af_Object *obj, void *mark, af_Environment *env) {
+    *vsl = makeVarSpaceList(makeVarSpace());
+    return true;
+}
+
+bool getAl(ArgList **al, af_Object *obj, ArgCodeList *acl, void *mark, af_Environment *env) {
+    *al = makeArgList("test", getArgCodeListResult(acl));
+    return true;
+}
+
+void testFunc(int *mark, af_Environment *env) {  // 测试用函数
+    printf("testFunc(): I am testFunc\n");
+
+    af_Object *obj = makeObject("Literal", true, makeObjectAPI(), true, NULL, NULL, env);
+    af_Message *msg = makeMessage("NORMAL", sizeof(af_Object *));
+    *((af_Object **)(getMessageData(msg))) = obj;  // TODO-szh 没有gc
+    pushMessageDown(msg, env);
+}
+
+bool getInfo(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
+    *fi = makeFuncInfo(normal_scope, not_embedded, false, false);  // 获取FuncInfo [桩]
+    makeCodeFuncBodyToFuncInfo(makeVariableCode("test", NUL, 0, "Unknow"), true, NULL, *fi);
+
+    DLC_SYMBOL(callFuncBody) func = MAKE_SYMBOL(testFunc, callFuncBody);
+    makeCFuncBodyToFuncInfo(func, NULL, *fi);
+    FREE_SYMBOL(func);
+    return true;
+}
+
+void freeMark(int *mark) {
+    printf("freeMark(): mark = %d\n", *mark);
+    free(mark);
+}
+
+
 int main() {
     aFunInit();
     printf("Hello World\n");
@@ -48,6 +90,35 @@ int main() {
         FREE_SYMBOL(initData_);
         FREE_SYMBOL(freeData_);
     }
+
+    {
+        af_ObjectAPI *api = makeObjectAPI();
+        DLC_SYMBOL(objectAPIFunc) get_alc = MAKE_SYMBOL(getAcl, objectAPIFunc);
+        DLC_SYMBOL(objectAPIFunc) get_vsl = MAKE_SYMBOL(getVsl, objectAPIFunc);
+        DLC_SYMBOL(objectAPIFunc) get_al = MAKE_SYMBOL(getAl, objectAPIFunc);
+        DLC_SYMBOL(objectAPIFunc) get_info = MAKE_SYMBOL(getInfo, objectAPIFunc);
+        DLC_SYMBOL(objectAPIFunc) free_mark = MAKE_SYMBOL(freeMark, objectAPIFunc);
+        if (addAPI(get_alc, "obj_funcGetArgCodeList", api) != 1)
+            return 2;
+        if (addAPI(get_vsl, "obj_funcGetVarList", api) != 1)
+            return 2;
+        if (addAPI(get_al, "obj_funcGetArgList", api) != 1)
+            return 2;
+        if (addAPI(get_info, "obj_funcGetInfo", api) != 1)
+            return 2;
+        if (addAPI(free_mark, "obj_funcFreeMask", api) != 1)
+            return 2;
+
+        addVarToProtectVarSpace(makeVar("func", 3, 3,
+                                        makeObject("func", true, api, true, NULL, NULL, env)),
+                                env);
+        FREE_SYMBOL(get_alc);
+        FREE_SYMBOL(get_vsl);
+        FREE_SYMBOL(get_al);
+        FREE_SYMBOL(get_info);
+        FREE_SYMBOL(free_mark);
+    }
+
     addVarToProtectVarSpace(makeVar("object", 3, 3,
                                     makeObject("object", true, makeObjectAPI(), true, NULL, NULL, env)),
                             env);
@@ -66,13 +137,9 @@ int main() {
     {  // 正常程序
         af_Code *bt1 = makeLiteralCode("data", "func", false, ',', 0, "Unknow");
         af_Code *bt2 = makeVariableCode("object", 0, 1, NULL);
-
-        af_Code *bt3 = makeLiteralCode("data2", "func", false, 0, 0, NULL);
-        af_Code *bt4 = makeVariableCode("object", 0, 1, NULL);
-
         connectCode(&bt1, bt2);
-        connectCode(&bt3, bt4);
 
+        af_Code *bt3 = makeVariableCode("func", 0, 1, NULL);
         af_Code *bt5 = makeBlockCode(curly, bt3, 0, 1, NULL, NULL);
         connectCode(&bt2, bt5);
 
@@ -81,40 +148,38 @@ int main() {
 
         iterCode(bt1, env);
         freeAllCode(bt1);
+        printf("\n");
     }
 
     {  // 尾调递归优化
         af_Code *bt1 = makeLiteralCode("data", "func", false, ',', 0, "Unknow");
         af_Code *bt2 = makeVariableCode("object", 0, 1, NULL);
-
-        af_Code *bt3 = makeLiteralCode("data2", "func", false, 0, 0, NULL);
-        af_Code *bt4 = makeVariableCode("object", 0, 1, NULL);
-
         connectCode(&bt1, bt2);
-        connectCode(&bt3, bt4);
 
+        af_Code *bt3 = makeVariableCode("func", 0, 1, NULL);
         af_Code *bt5 = makeBlockCode(curly, bt3, 0, 1, NULL, NULL);
         connectCode(&bt2, bt5);
 
         iterCode(bt1, env);
         freeAllCode(bt1);
+        printf("\n");
     }
 
     {  // 测试类前缀调用
         af_Code *bt1 = makeLiteralCode("data", "func", false, ',', 0, "Unknow");
-        af_Code *bt2 = makeVariableCode("object", 0, 1, NULL);
-
-        af_Code *bt3 = makeLiteralCode("data2", "func", false, 0, 0, NULL);
-        af_Code *bt4 = makeVariableCode("object", 0, 1, NULL);
-
+        af_Code *bt2 = makeVariableCode("func", 0, 1, NULL);
         connectCode(&bt1, bt2);
-        connectCode(&bt3, bt4);
 
-        af_Code *bt5 = makeBlockCode(parentheses, bt3, 0, 1, NULL, NULL);
+        af_Code *bt3 = makeVariableCode("global", 0, 1, NULL);
+        af_Code *bt5 = makeBlockCode(parentheses, bt3, 0, 1, NULL, NULL);  // TODO-szh 参数个数允许为0
         connectCode(&bt2, bt5);
 
+        af_Code *bt6 = makeVariableCode("global", 0, 1, NULL);
+        connectCode(&bt5, bt6);
+
         iterCode(bt1, env);
         freeAllCode(bt1);
+        printf("\n");
     }
 
     {  // 测试错误 (object2 Var not found)
@@ -134,6 +199,7 @@ int main() {
 
         iterCode(bt1, env);
         freeAllCode(bt1);
+        printf("\n");
     }
 
     {  // 测试顺序执行 '(xxx)
@@ -149,6 +215,7 @@ int main() {
 
         iterCode(bt5, env);
         freeAllCode(bt5);
+        printf("\n");
     }
 
     {  // 测试顺序执行 ,[xxx]
@@ -164,6 +231,7 @@ int main() {
 
         iterCode(bt5, env);
         freeAllCode(bt5);
+        printf("\n");
     }
 
     {  // 测试顺序执行 '(xxx) 【尾调递归优化】
@@ -176,6 +244,7 @@ int main() {
 
         iterCode(bt5, env);
         freeAllCode(bt5);
+        printf("\n");
     }
 
     {  // 测试顺序执行 ,[xxx] 【尾调递归优化】
@@ -188,6 +257,7 @@ int main() {
 
         iterCode(bt5, env);
         freeAllCode(bt5);
+        printf("\n");
     }
 
     freeEnvironment(env);