浏览代码

refactor: 调整runCode函数

取消了部分封装
提高可读性
添加部分注释
SongZihuan 3 年之前
父节点
当前提交
de45d90128
共有 4 个文件被更改,包括 119 次插入149 次删除
  1. 2 1
      include/core/info/runtime_error.h
  2. 3 3
      src/core/env.c
  3. 113 144
      src/core/run.c
  4. 1 1
      src/main.c

+ 2 - 1
include/core/info/runtime_error.h

@@ -17,12 +17,13 @@
 #define FUNCBODY_ERROR_INFO "Dynamic function body is not filled."  /* 执行函数体时, 获得func_body_dynamic类型的函数体 */
 #define RETURN_OBJ_NOT_FOUND_INFO "Sequential execution but unable to return the first execution result (The result does not exist)."
 #define NOT_MSG_INFO "Don't get msg after function call."
+#define NOT_NORMAL_MSG_INFO "Don't get normal msg after function call."
 
 #define INFIX_PROTECT "Infix-Protect"
 #define LITERAL_ERROR "Literal-Error"
 #define VARIABLE_ERROR "Variable-Error"
 
-#define CALL_ERRPR "Call-Error"
+#define CALL_ERROR "Call-Error"
 #define BRACKETS_FUNC_BODY_INFO "Brackets cannot get function body."
 #define PARENTHESES_FUNC_BODY_INFO "Parentheses cannot get function body."
 #define CURLY_FUNC_BODY_INFO "Curly cannot get function body."

+ 3 - 3
src/core/env.c

@@ -726,7 +726,7 @@ bool pushFuncActivity(af_Code *bt, af_Environment *env) {
     switch (bt->block.type) {
         case curly:
             if (bt->block.elements == 0) {
-                pushMessageDown(makeERRORMessage(CALL_ERRPR, CURLY_FUNC_BODY_INFO, env), env);
+                pushMessageDown(makeERRORMessage(CALL_ERROR, CURLY_FUNC_BODY_INFO, env), env);
                 return false;
             }
             func = bt->next;
@@ -743,7 +743,7 @@ bool pushFuncActivity(af_Code *bt, af_Environment *env) {
                     break;
             }
             if (func == NULL) {
-                pushMessageDown(makeERRORMessage(CALL_ERRPR, BRACKETS_FUNC_BODY_INFO, env), env);
+                pushMessageDown(makeERRORMessage(CALL_ERROR, BRACKETS_FUNC_BODY_INFO, env), env);
                 return false;
             }
             break;
@@ -764,7 +764,7 @@ bool pushFuncActivity(af_Code *bt, af_Environment *env) {
     env->activity->status = act_func_get;
     if (env->activity->call_type == parentheses) { // 对于类前缀调用, 已经获得func的实际值了
         if (parentheses_call == NULL) {
-            pushMessageDown(makeERRORMessage(CALL_ERRPR, PARENTHESES_FUNC_BODY_INFO, env), env);
+            pushMessageDown(makeERRORMessage(CALL_ERROR, PARENTHESES_FUNC_BODY_INFO, env), env);
             return false;
         }
         return setFuncActivityToArg(parentheses_call, env);

+ 113 - 144
src/core/run.c

@@ -1,4 +1,5 @@
-#include "aFunCore.h"
+#include <assert.h>
+#include "aFunCore.h"
 
 #include "run.h"
 #include "__env.h"
@@ -6,12 +7,6 @@
 /* 工具函数: 初始化类型 */
 static bool iterCodeInit(af_Code *code, af_Environment *env);
 
-/* 工具函数: 运行函数 */
-static void setRunVarSpaceList(af_Environment *env);
-static bool runCodeBase(af_Environment *env);
-static bool runCode(af_Message **msg, bool *run_code, af_Environment *env);
-static void processMsg(af_Message *msg, bool run_code, af_Environment *env);
-
 /* 工具函数: Message类函数 */
 static af_Message *getTopMsg(af_Environment *env);
 
@@ -26,7 +21,6 @@ static bool checkGetArgEnd(af_Message *msg, af_Environment *env);
 
 /* Code 执行函数 */
 static bool codeElement(af_Code *code, af_Environment *env);
-static bool codeLiteral(af_Code *code, af_Environment *env);
 static bool codeBlock(af_Code *code, af_Environment *env);
 
 /*
@@ -79,7 +73,7 @@ static bool checkLiteral(af_Message **msg, af_Environment *env) {
 static bool checkMacro(af_Message *msg, af_Environment *env) {
     if (env->activity->fi == NULL || !env->activity->fi->is_macro)  // 非宏函数
         return false;
-    if (msg == NULL || !EQ_STR(msg->type, "NORMAL"))  // msg非正常值
+    if (!EQ_STR(msg->type, "NORMAL"))  // msg非正常值
         return false;
 
     af_Object *obj = *(af_Object **)(msg->msg);
@@ -190,38 +184,6 @@ static bool codeBlock(af_Code *code, af_Environment *env) {
         return pushFuncActivity(env->activity->bt_next, env);
 }
 
-/*
- * 函数名: setRunVarSpaceList
- * 目标: 设置运行的变量空间
- * 仅在act_arg模式下, 允许运行变量空间设置为函数变量空间 (参数计算)
- */
-static void setRunVarSpaceList(af_Environment *env) {
-    if (env->activity->status == act_func_arg && env->activity->run_in_func && env->activity->func_var_list != NULL)
-        env->activity->vsl = env->activity->func_var_list;
-    else
-        env->activity->vsl = env->activity->var_list;
-}
-
-/*
- * 函数名: runCodeBase
- * 目标: 获取代码类型, 调用(codeLiteral, codeElement, codeBlock)运行代码
- * 返回true- 表示执行无消息写入 msg_down (通常是无实质性代码运算)
- * 返回false-表示有消息写入 msg_down
- */
-static bool runCodeBase(af_Environment *env) {
-    switch (env->activity->bt_next->type) {
-        case code_element:
-            if (codeElement(env->activity->bt_next, env))
-                return true;
-            break;
-        case code_block:
-            if (codeBlock(env->activity->bt_next, env))
-                return true;  // 若运行成功则跳转到下一次运行, 该步骤仅为设置Activity
-        default:
-            break;  // 错误
-    }
-    return false;
-}
 
 /*
  * 函数名: getTopMsg
@@ -255,54 +217,6 @@ static int checkMsg(af_Message *msg, af_Environment *env) {
     return -1;  // 遇到非normal, 但继续运行
 }
 
-/*
- * 函数名: runCode
- * 目标: 执行代码
- * *msg - 写入获取的执行信息
- * *run_code - 写入是否有代码运行
- * 返回-true  表示未获得msg (未进行实质性运算)
- * 返回-false 表示获得msg  (进行实质性运算)
- */
-static bool runCode(af_Message **msg, bool *run_code, af_Environment *env) {
-    if (env->activity->bt_next == NULL && env->activity->process_msg_first == 0) {  // 无代码运行, 并且非msg_first
-        *run_code = false;
-        *msg = NULL;
-        return false;
-    }
-
-    if (env->activity->process_msg_first == 0) {
-        if (env->activity->bt_next == NULL) {
-            *run_code = false;
-            *msg = NULL;
-            return false;
-        } else if (runCodeBase(env)) {
-            *msg = NULL;
-            return true;  // (该步骤仅为设置Activity, 无实际运算)
-        }
-    } else
-        env->activity->process_msg_first--;
-
-    *run_code = true;
-    (*msg) = getTopMsg(env);
-
-    switch (checkMsg((*msg), env)) {
-        case 0:  // 不可处理的信号
-            *msg = NULL;
-            popActivity(false, NULL, env);  // 跳出当前activity
-            return true;
-        case -1:  // 非正常但可处理 [已经放回]
-            (*msg) = NULL;
-            break;
-        case 1:  // 正常信号
-            if (env->activity->return_first && env->activity->return_obj == NULL)  // 设置return_first
-                env->activity->return_obj = *(af_Object **)(*msg)->msg;
-            break;
-        default:
-            break;
-    }
-    return false;
-}
-
 /*
  * 函数名: checkNormalEnd
  * 目标: 检查act_normal是否运行到结尾 (若运行到结尾则返回true, 否则返回false)
@@ -310,16 +224,22 @@ static bool runCode(af_Message **msg, bool *run_code, af_Environment *env) {
 bool checkNormalEnd(af_Message *msg, af_Environment *env) {
     if (env->activity->bt_next == NULL) {
         if (setFuncActivityToNormal(env) == 0) {  // 已经没有下一步了
+            if (msg == NULL) {  // msg 得不到处理
+                pushMessageDown(makeERRORMessage(RUN_ERROR, NOT_NORMAL_MSG_INFO, env), env);
+                return true;
+            }
+
             if (checkMacro(msg, env))  // 检查是否宏函数
                 return false;  // 继续执行
+
             checkLiteral(&msg, env);  // 检查是否字面量
             pushMessageDown(msg, env);
             return true;
-        } else {
+        } else if (msg != NULL) {
             gc_delReference(*(af_Object **) (msg->msg));  // msg->msg是一个指针, 这个指针的内容是一个af_Object *
             freeMessage(msg);
         }
-    } else {
+    } else if (msg != NULL) {
         if (env->activity->bt_next->type == code_block && env->activity->bt_next->block.type == parentheses &&
             env->activity->bt_next->prefix != getPrefix(B_EXEC, env)) {
             env->activity->parentheses_call = *(af_Object **) (msg->msg);  // 类前缀调用
@@ -346,80 +266,129 @@ static bool checkGetArgEnd(af_Message *msg, af_Environment *env) {
     return false;
 }
 
-/*
- * 函数名: processMsg
- * 目标: 处理msg
- */
-static void processMsg(af_Message *msg, bool run_code, af_Environment *env) {
-    switch (env->activity->status) {
-        case act_func_normal:
-            if (!run_code)
-                popActivity(false, makeERRORMessage(RUN_ERROR, NOT_CODE_INFO, env), env);
-            else if (checkNormalEnd(msg, env))
-                popActivity(true, NULL, env);  // 正常退出
-            break;
-        case act_func_get:
-            if (!run_code)
-                popActivity(false, makeERRORMessage(RUN_ERROR, NOT_CODE_INFO, env), env);
-            else {
-                af_Object *func = *(af_Object **)(msg->msg);  // func仍保留了msg的gc计数
-                gc_delReference(func);  // 释放计数
-                freeMessage(msg);
-                if (!setFuncActivityToArg(func, env))
-                    popActivity(false, NULL, env);
-            }
-            break;
-        case act_func_arg: {
-            if (!run_code || checkGetArgEnd(msg, env)) {  // 无参数设定或参数设定完成
-                if (!setFuncActivityAddVar(env))
-                    popActivity(false, NULL, env);
-            }
-            break;
-        }
-        default:
-            break;
+static bool checkStop(af_Environment *env) {
+    if (env->core->status == core_stop || env->core->status == core_exit) {
+        while (env->activity->type != act_top || env->activity->prev != NULL)
+            popActivity(false, NULL, env);  // is_normal=false, 非正常退出, 释放mark
+        popActivity(false, NULL, env);  // 再释放 act_top
+        return true;
     }
+    return false;
 }
 
 /*
  * 函数名: iterCode
  * 目标: 运行代码 (代码可通过code参数传入, 或通过env->activity传入)
+ * 注意: 曾为缩短改函数而将该函数的内容进行大量的封装
+ *      但实际上, 这个函数各个部分的关联性是很强的
+ *      因此, 取消了封装, 反而提高了代码的可读性
+ *
+ *      因为该函数的大部分内容运行在循环中, 因此使用continue表示不在运行后面的代码
  */
 bool iterCode(af_Code *code, af_Environment *env){
     if (!iterCodeInit(code, env))
         return false;
 
-    /* destruct模式下则以activity为NULL作为判断 */
-    /* 普通模式则以是否释放到顶层作为判断 */
-    while (env->activity->type != act_top ||
-          env->activity->bt_next != NULL  ||
-          env->activity->process_msg_first != 0) {
-
+    /* 必须位于act_top, 且无next, 并且无msg处理才退出执行 */
+    while (env->activity->type != act_top || env->activity->bt_next != NULL  || env->activity->process_msg_first != 0) {
         /* 检查是否需要退出执行 */
-        if (env->core->status == core_stop || env->core->status == core_exit) {
-            while (env->activity->type != act_top || env->activity->prev != NULL)
-                popActivity(false, NULL, env);  // is_normal=false, 非正常退出, 释放mark
-            popActivity(false, NULL, env);  // 在释放 act_top
+        if (checkStop(env))
             return false;
-        }
 
         /* 检查gc机制 */
         checkRunGC(env);
 
-        /* 检查是否gc状态 */
-        if (env->activity->type == act_gc) {  // gc 模式
+        if (env->activity->type == act_gc) {
             if (env->activity->dl_next == NULL)
                 popActivity(true, NULL, env);  // 结束运行
             else
                 pushDestructActivity(env->activity->dl_next, env);
-        } else {  // 普通运行模式
-            af_Message *msg = NULL;
-            bool run_code = false;
-
-            setRunVarSpaceList(env);
-            if (runCode(&msg, &run_code, env))
-                continue;  // 若未获得msg (未进行实质性运算) 则再次运算
-            processMsg(msg, run_code, env);
+            continue;
+        }
+
+        /* 切换执行的var_list */
+        if (env->activity->type == act_func && env->activity->status == act_func_arg &&
+            env->activity->run_in_func && env->activity->func_var_list != NULL)
+            env->activity->vsl = env->activity->func_var_list;
+        else
+            env->activity->vsl = env->activity->var_list;
+
+        /* 无代码运行 */
+        if (env->activity->bt_next == NULL && env->activity->process_msg_first == 0) {  // 无代码运行, 并且非msg_first
+            switch (env->activity->status) {
+                case act_func_get:
+                case act_func_normal:
+                    popActivity(false, makeERRORMessage(RUN_ERROR, NOT_CODE_INFO, env), env);
+                    break;
+                case act_func_arg:  // 无参数设定
+                    if (!setFuncActivityAddVar(env))
+                        popActivity(false, NULL, env);
+                    break;
+                default:
+                    break;
+            }
+            continue;  // 后面的代码不再运行
+        }
+
+        /* 有代码运行 */
+        bool pass_msg = false;  // 表示不处理msg
+        if (env->activity->process_msg_first == 0) {  /* 运行实际代码 */
+            switch (env->activity->bt_next->type) {
+                case code_element:
+                    if (codeElement(env->activity->bt_next, env))
+                        pass_msg = true;
+                    break;
+                case code_block:
+                    if (codeBlock(env->activity->bt_next, env))
+                        pass_msg = true;  // 若运行成功则跳转到下一次运行, 该步骤仅为设置Activity
+                    break;
+                default:
+                    break;
+            }
+        } else
+            env->activity->process_msg_first--;
+
+        if (pass_msg)
+            continue;  // 后面的代码不再运行
+
+        /* 处理msg */
+        af_Message *msg = getTopMsg(env);
+        switch (checkMsg(msg, env)) {
+            case 0:  // 不可处理的信号
+                popActivity(false, NULL, env);  // 跳出当前activity
+                continue;  // 下面的代码不再执行
+            case 1:  // 正常信号
+                if (env->activity->return_first && env->activity->return_obj == NULL)  // 设置return_first
+                    env->activity->return_obj = *(af_Object **)msg->msg;
+                break;
+            case -1:  // 非正常但可处理 [已经放回]
+            default:
+                assert(env->activity->status == act_func_normal);
+                break;
+        }
+
+        switch (env->activity->status) {
+            case act_func_normal:  // 需要考虑 msg == NULL
+                if (checkNormalEnd(msg, env))
+                    popActivity(true, NULL, env);  // 正常退出
+                break;
+            case act_func_get: {
+                af_Object *func = *(af_Object **) (msg->msg);  // func仍保留了msg的gc计数
+                gc_delReference(func);  // 释放计数
+                freeMessage(msg);
+                if (!setFuncActivityToArg(func, env))
+                    popActivity(false, NULL, env);
+                break;
+            }
+            case act_func_arg: {
+                if (checkGetArgEnd(msg, env)) {  // 参数设定完成
+                    if (!setFuncActivityAddVar(env))
+                        popActivity(false, NULL, env);
+                }
+                break;
+            }
+            default:
+                break;
         }
     }
     return true;

+ 1 - 1
src/main.c

@@ -835,7 +835,7 @@ int main() {
         af_Code *bt6 = makeElementCode("global", 0, 1, NULL);
         connectCode(&bt5, bt6);
 
-        iterCode(bt1, env);
+        iterCode(bt5, env);
         freeAllCode(bt1);
         printf("\n");
     }