Procházet zdrojové kódy

refactor: 函数调用使用FuncInfo模块实现

SongZihuan před 3 roky
rodič
revize
7958e047fc
6 změnil soubory, kde provedl 99 přidání a 73 odebrání
  1. 3 4
      include/func.h
  2. 5 6
      src/core/__env.h
  3. 1 1
      src/core/__func.h
  4. 51 41
      src/core/env.c
  5. 26 15
      src/core/func.c
  6. 13 6
      src/core/run.c

+ 3 - 4
include/func.h

@@ -41,13 +41,12 @@ ArgList **pushNewArgList(ArgList **base, char *name, af_Object *obj);
 bool runArgList(ArgList *al, af_VarSpaceListNode *vsl);
 
 /* FuncInfo 创建与释放 */
-af_FuncInfo *makeFuncInfo(enum af_FuncInfoScope scope, enum af_FuncInfoEmbedded embedded, bool is_macro,
-                          bool is_object, af_VarSpaceListNode *vsl);
+af_FuncInfo *makeFuncInfo(enum af_FuncInfoScope scope, enum af_FuncInfoEmbedded embedded, bool is_macro, bool is_object);
 
 void freeFuncInfo(af_FuncInfo *fi);
 
 /* FuncInfo 操作函数 */
-void makeCFuncBodyToFuncInfo(DLC_SYMBOL(callFuncBody) c_func, af_FuncInfo *fi);
-void makeCodeFuncBodyToFuncInfo(af_Code *code, bool free_code, af_FuncInfo *fi);
+void makeCFuncBodyToFuncInfo(DLC_SYMBOL(callFuncBody) c_func, char **msg_type, af_FuncInfo *fi);
+void makeCodeFuncBodyToFuncInfo(af_Code *code, bool free_code, char **msg_type, af_FuncInfo *fi);
 
 #endif //AFUN__FUNC_H_PUBLIC

+ 5 - 6
src/core/__env.h

@@ -59,7 +59,6 @@ struct af_Activity {  // 活动记录器
     struct af_Message *msg_down;  // 被调用者向调用者传递信息
     struct af_Message *msg_up;  // 调用者向被调用者传递信息
     ActivityCount msg_up_count;  // msg_up 添加的个数
-    char **msg_type;  // 一个包含字符串的列表, 记录了需要处理的`msg`类型的数组
 
     bool run_in_func;  // 在函数变量空间内运行 (act_arg用)
     struct af_VarSpaceListNode *vsl;  // 变量空间
@@ -81,11 +80,11 @@ struct af_Activity {  // 活动记录器
     enum af_BlockType call_type;  // 函数调用类型
     bool must_common_arg;  // 强制普通参数
     bool not_strict;  // 非严格调用
-    af_Object *parentheses_call;  // 类前缀调用
-    ArgCodeList *acl_start;
-    ArgCodeList *acl_next;
-    bool is_last;  // 最后一个函数体 (允许尾调递归优化)
-    bool in_call;  // 当重新执行该活动记录器时先不执行代码, 而是处理msg
+    struct af_Object *parentheses_call;  // 类前缀调用
+    struct ArgCodeList *acl_start;
+    struct ArgCodeList *acl_next;
+    struct af_FuncInfo *fi;
+    struct af_FuncBody *body;
 };
 
 struct af_TopMsgProcess {  // 顶层msg处理器

+ 1 - 1
src/core/__func.h

@@ -42,6 +42,7 @@ struct af_FuncBody {
         };
     };
 
+    char **msg_type;  // 表示对应函数可以处理的msg类型
     struct af_FuncBody *next;
 };
 
@@ -54,7 +55,6 @@ struct af_FuncInfo {
     bool is_object;  // 对象函数
 
     // 函数信息
-    struct af_VarSpaceListNode *vsl;
     struct af_FuncBody *body;
 };
 

+ 51 - 41
src/core/env.c

@@ -161,15 +161,6 @@ static af_Activity *makeActivity(af_Code *bt_top, af_Code *bt_start, bool return
     return activity;
 }
 
-static void freeMsgType(char **msg_type) {
-    if (msg_type == NULL)
-        return;
-
-    for (char *tmp = *msg_type; tmp != NULL; tmp++)
-        free(tmp);
-    free(msg_type);
-}
-
 static af_Activity *freeActivity(af_Activity *activity) {
     af_Activity *prev = activity->prev;
     af_VarSpaceListNode *vs = activity->var_list;
@@ -201,7 +192,8 @@ static af_Activity *freeActivity(af_Activity *activity) {
         gc_delReference(activity->parentheses_call);
 
     freeAllArgCodeList(activity->acl_start);
-    freeMsgType(activity->msg_type);
+    if (activity->fi != NULL)
+        freeFuncInfo(activity->fi);
     free(activity);
     return prev;
 }
@@ -382,7 +374,6 @@ bool addTopActivity(af_Code *code, af_Environment *env) {
     env->activity->var_list = makeVarSpaceList(env->core->global->data->var_space);
     env->activity->var_list->next = makeVarSpaceList(env->core->protect);
     env->activity->status = act_normal;
-    env->activity->is_last = true;
     return true;
 }
 
@@ -454,21 +445,19 @@ bool pushExecutionActivity(af_Code *bt, bool return_first, af_Environment *env)
         return false;
 
     env->activity->bt_next = next;
-    if (next != NULL || !env->activity->is_last) {
-        env->activity->in_call = true;
-        af_Activity *activity = makeActivity(bt, bt->next, return_first, env->activity->msg_up,
-                                             env->activity->var_list, env->activity->belong,
-                                             env->activity->func);
-        activity->prev = env->activity;
-        env->activity = activity;
-    } else {
+    if (next == NULL && env->activity->body == NULL) {
         printf("Tail tone recursive optimization\n");
         env->activity->bt_top = bt;
         env->activity->bt_start = bt->next;
         env->activity->bt_next = bt->next;
-        env->activity->is_last = false;
         if (!env->activity->return_first)  // 若原本就有设置 return_first 则没有在设置的必要了, 因为该执行不会被返回
             env->activity->return_first = return_first;
+    } else {
+        af_Activity *activity = makeActivity(bt, bt->next, return_first, env->activity->msg_up,
+                                             env->activity->var_list, env->activity->belong,
+                                             env->activity->func);
+        activity->prev = env->activity;
+        env->activity = activity;
     }
 
     env->activity->status = act_normal;
@@ -482,25 +471,20 @@ bool pushFuncActivity(af_Code *bt, af_Environment *env) {
         return false;
 
     env->activity->bt_next = next;
-
-    if (next != NULL || !env->activity->is_last) {
-        af_Activity *activity;
-        env->activity->in_call = true;
-        activity = makeActivity(bt, bt->next, false, env->activity->msg_up,
-                                env->activity->var_list, env->activity->belong, env->activity->func);
-        activity->prev = env->activity;
-        env->activity = activity;
-    } else {  // 尾调递归优化
+    if (next == NULL && env->activity->body == NULL) {
         printf("Tail tone recursive optimization\n");
         env->activity->bt_top = bt;
         env->activity->bt_start = bt->next;
         env->activity->bt_next = bt->next;
-        env->activity->is_last = false;
+        // 保持原有的return_false
+    } else {
+        af_Activity *activity = makeActivity(bt, bt->next, false, env->activity->msg_up,
+                                             env->activity->var_list, env->activity->belong, env->activity->func);
+        activity->prev = env->activity;
+        env->activity = activity;
     }
 
     env->activity->call_type = env->activity->bt_top->block.type;
-    env->activity->func_var_list = env->activity->var_list;  // 设置为函数变量空间 [桩]
-
     if (env->activity->call_type == parentheses) {  // 对于类前缀调用, 已经获得func的实际值了
         setFuncActivityToArg(*parentheses_call, env);
         gc_delReference(*parentheses_call);
@@ -523,17 +507,33 @@ 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 [桩]
     env->activity->acl_next = env->activity->acl_start;
     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) {
     if (!new_vsl && is_protect)
         return false;
 
-    // 桩函数: 目前func_var_list引用自var_list, 故var_list不释放
+    {  // 获取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);
+
+    }
+    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)  // 发生了错误
@@ -543,13 +543,12 @@ bool setFuncActivityAddVar(bool new_vsl, bool is_protect, char **msg_type, af_En
 
     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++;
     }
 
-    env->activity->msg_type = msg_type;
     runArgList(NULL, env->activity->var_list);
     env->activity->var_list->vs->is_protect = is_protect;
     return true;
@@ -558,15 +557,26 @@ bool setFuncActivityAddVar(bool new_vsl, bool is_protect, char **msg_type, af_En
 bool setFuncActivityToNormal(bool is_first, af_Environment *env) {  // 获取函数的函数体
     env->activity->status = act_normal;
     env->activity->bt_next = NULL;
-    if (env->activity->is_last)
-        return false;
 
-    env->activity->bt_start = env->activity->bt_start;
-    env->activity->bt_next = env->activity->bt_start;
-    env->activity->is_last = true;
-    return true;
+    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;
+        } 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;
+        }
+    }
+
+    return false;
 }
 
+/*
+ * 函数名: runTopMessageProcess
+ * 目标: 运行顶层信息处理器
+ */
 static void runTopMessageProcess(af_Environment *env) {
     af_Message **pmsg = &env->activity->msg_down;
     while (*pmsg != NULL) {

+ 26 - 15
src/core/func.c

@@ -1,12 +1,15 @@
 #include "__func.h"
 
 /* FuncBody 创建与释放 */
-static af_FuncBody *makeFuncBody(enum af_FuncBodyType type);
-static af_FuncBody *makeCodeFuncBody(af_Code *code, bool free_code);
-static af_FuncBody *makeCFuncBody(DLC_SYMBOL(callFuncBody) c_func);
+static af_FuncBody *makeFuncBody(enum af_FuncBodyType type, char **msg_type);
+static af_FuncBody *makeCodeFuncBody(af_Code *code, bool free_code, char **msg_type);
+static af_FuncBody *makeCFuncBody(DLC_SYMBOL(callFuncBody) c_func, char **msg_type);
 static af_FuncBody *freeFuncBody(af_FuncBody *fb);
 static void freeAllFuncBody(af_FuncBody *fb);
 
+/* msg_type 释放 */
+static void freeMsgType(char **msg_type);
+
 /* FuncBody 操作函数 */
 static void pushFuncBody(af_FuncBody **base, af_FuncBody *body);
 
@@ -100,31 +103,41 @@ bool runArgList(ArgList *al, af_VarSpaceListNode *vsl) {
     return true;
 }
 
-static af_FuncBody *makeFuncBody(enum af_FuncBodyType type) {
+static af_FuncBody *makeFuncBody(enum af_FuncBodyType type, char **msg_type) {
     af_FuncBody *fb = calloc(sizeof(af_FuncBody), 1);
     fb->type = type;
+    fb->msg_type = msg_type;
     return fb;
 }
 
-static af_FuncBody *makeCodeFuncBody(af_Code *code, bool free_code) {
-    af_FuncBody *fb = makeFuncBody(func_body_code);
+static af_FuncBody *makeCodeFuncBody(af_Code *code, bool free_code, char **msg_type) {
+    af_FuncBody *fb = makeFuncBody(func_body_code, msg_type);
     fb->code = code;
     fb->free_code = free_code;
     return fb;
 }
 
-static af_FuncBody *makeCFuncBody(DLC_SYMBOL(callFuncBody) c_func) {
-    af_FuncBody *fb = makeFuncBody(func_body_c);
+static af_FuncBody *makeCFuncBody(DLC_SYMBOL(callFuncBody) c_func, char **msg_type) {
+    af_FuncBody *fb = makeFuncBody(func_body_c, msg_type);
     fb->c_func = COPY_SYMBOL(c_func, callFuncBody);
     return fb;
 }
 
+static void freeMsgType(char **msg_type) {
+    for (char *tmp = *msg_type; tmp != NULL; tmp++)
+        free(tmp);
+    free(msg_type);
+}
+
 static af_FuncBody *freeFuncBody(af_FuncBody *fb) {
     af_FuncBody *next = fb->next;
     if (fb->type == func_body_code && fb->free_code)
         freeAllCode(fb->code);
     else if (fb->type == func_body_c)
         FREE_SYMBOL(fb->c_func);
+
+    if (fb->msg_type != NULL)
+        freeMsgType(fb->msg_type);
     free(fb);
     return next;
 }
@@ -140,14 +153,12 @@ static void pushFuncBody(af_FuncBody **base, af_FuncBody *body) {
     *base = body;
 }
 
-af_FuncInfo *makeFuncInfo(enum af_FuncInfoScope scope, enum af_FuncInfoEmbedded embedded, bool is_macro,
-                          bool is_object, af_VarSpaceListNode *vsl) {
+af_FuncInfo *makeFuncInfo(enum af_FuncInfoScope scope, enum af_FuncInfoEmbedded embedded, bool is_macro, bool is_object) {
     af_FuncInfo *fi = calloc(sizeof(af_FuncInfo), 1);
     fi->scope = scope;
     fi->embedded = embedded;
     fi->is_macro = is_macro;
     fi->is_object = is_object;
-    fi->vsl = vsl;
     return fi;
 }
 
@@ -156,10 +167,10 @@ void freeFuncInfo(af_FuncInfo *fi) {  // vsl是不释放的
     free(fi);
 }
 
-void makeCFuncBodyToFuncInfo(DLC_SYMBOL(callFuncBody) c_func, af_FuncInfo *fi) {
-    pushFuncBody(&fi->body, makeCFuncBody(c_func));
+void makeCFuncBodyToFuncInfo(DLC_SYMBOL(callFuncBody) c_func, char **msg_type, af_FuncInfo *fi) {
+    pushFuncBody(&fi->body, makeCFuncBody(c_func, msg_type));
 }
 
-void makeCodeFuncBodyToFuncInfo(af_Code *code, bool free_code, af_FuncInfo *fi) {
-    pushFuncBody(&fi->body, makeCodeFuncBody(code, free_code));
+void makeCodeFuncBodyToFuncInfo(af_Code *code, bool free_code, char **msg_type, af_FuncInfo *fi) {
+    pushFuncBody(&fi->body, makeCodeFuncBody(code, free_code, msg_type));
 }

+ 13 - 6
src/core/run.c

@@ -63,9 +63,9 @@ static void codeBlock(af_Code *code, af_Environment *env) {
 }
 
 static bool checkInMsgType(char *type, af_Environment *env) {
-    if (env->activity->msg_type == NULL)
+    if (env->activity->body == NULL || env->activity->body->msg_type == NULL)
         return false;
-    for (char *msg_type_node = *env->activity->msg_type; msg_type_node != NULL; msg_type_node++) {
+    for (char *msg_type_node = *env->activity->body->msg_type; msg_type_node != NULL; msg_type_node++) {
         if (EQ_STR(type, msg_type_node))
             return true;
     }
@@ -96,6 +96,7 @@ static void popLastActivity(af_Message *msg, af_Environment *env) {
 }
 
 bool iterCode(af_Code *code, af_Environment *env) {
+    bool process_mgs_first = false;  // 优先处理msg而不是运行代码
     if (!addTopActivity(code, env))
         return false;
 
@@ -110,7 +111,7 @@ bool iterCode(af_Code *code, af_Environment *env) {
 
         if (env->activity->bt_next != NULL) {
             run_code = true;
-            if (!env->activity->in_call) {
+            if (!process_mgs_first) {
                 switch (env->activity->bt_next->type) {
                     case literal:
                         codeLiteral(env->activity->bt_next, env);
@@ -125,7 +126,7 @@ bool iterCode(af_Code *code, af_Environment *env) {
                         break;  // 错误
                 }
             } else
-                env->activity->in_call = false;
+                process_mgs_first = false;
 
             if (env->activity->msg_down == NULL)  // 若未获得 msg
                 msg = makeMessage("ERROR-STR", 0);
@@ -139,6 +140,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;
                     continue;
                 }
             } else if (env->activity->return_first && env->activity->return_obj == NULL) {  // 设置return_first
@@ -152,11 +154,14 @@ bool iterCode(af_Code *code, af_Environment *env) {
                 if (!run_code) {
                     msg = makeMessage("ERROR-STR", 0);  // 无代码可运行
                     popLastActivity(msg, env);
+                    process_mgs_first = true;
                 } else if (env->activity->bt_next == NULL) { // 执行完成
-                    if (setFuncActivityToNormal(true, env))
+                    if (setFuncActivityToNormal(true, env)) {
                         goto run_continue;  // 继续运行
-                    else
+                    } else {
                         popLastActivity(msg, env);
+                        process_mgs_first = true;
+                    }
                 } else if (env->activity->bt_next->type == block && env->activity->bt_next->block.type == parentheses
                            && env->activity->bt_next->prefix == NUL) {  // 类前缀调用
                     env->activity->parentheses_call = *(af_Object **)(msg->msg);
@@ -171,6 +176,7 @@ bool iterCode(af_Code *code, af_Environment *env) {
                 if (!run_code) {
                     msg = makeMessage("ERROR-STR", 0);  // 无代码可运行
                     popLastActivity(msg, env);
+                    process_mgs_first = true;
                 } else {
                     af_Object *func = *(af_Object **)(msg->msg);  // func仍保留了msg的gc计数
                     freeMessage(msg);
@@ -186,6 +192,7 @@ bool iterCode(af_Code *code, af_Environment *env) {
                     if (!setFuncActivityToNormal(true, env)) {
                         msg = makeMessage("ERROR-STR", 0);  // 无代码可运行
                         popLastActivity(msg, env);
+                        process_mgs_first = true;
                     }
                 } else {
                     env->activity->acl_next->result = *(af_Object **)(msg->msg);