浏览代码

feat: 为activity添加了message模块

SongZihuan 3 年之前
父节点
当前提交
0c2bcff4ef
共有 4 个文件被更改,包括 77 次插入0 次删除
  1. 7 0
      include/env.h
  2. 10 0
      src/core/__env.h
  3. 53 0
      src/core/env.c
  4. 7 0
      src/core/run.c

+ 7 - 0
include/env.h

@@ -2,6 +2,7 @@
 #define AFUN__ENV_H_PUBLIV
 
 typedef struct af_Environment af_Environment;
+typedef struct af_Message af_Message;
 
 #include "bytecode.h"
 #include "object.h"
@@ -16,4 +17,10 @@ void pushActivity(af_ByteCode *bt, bool new_vs, af_VarSpaceListNode *vsl, af_Obj
                   af_Environment *env);
 void popActivity(af_Environment *env);
 
+af_Message *makeMessage(char *type, size_t size);
+af_Message *freeMessage(af_Message *msg);
+void pushMessageUp(af_Message *msg, af_Environment *env);
+void pushMessageDown(af_Message *msg, af_Environment *env);
+af_Message *popMessageUp(char *type, af_Environment *env);
+af_Message *popMessageDown(char *type, af_Environment *env);
 #endif //AFUN__ENV_H_PUBLIV

+ 10 - 0
src/core/__env.h

@@ -30,9 +30,19 @@ struct af_Core {  // 解释器核心
     struct af_VarSpace *protect;  // 顶级保护变量空间
 };
 
+struct af_Message {
+    char *type;  // 消息类型
+    void *msg;  // 信息内容
+    size_t size;
+    struct af_Message *next;
+};
+
 struct af_Activity {  // 活动记录器
     struct af_Activity *prev;  // 上一个活动记录器
 
+    struct af_Message *msg_down;  // 被调用者向调用者传递信息
+    struct af_Message *msg_up;  // 调用者向被调用者传递信息
+
     struct af_ByteCode *bt_start;  // 代码的起始位置
     struct af_ByteCode *bt;  // 指示代码运行的地方
 

+ 53 - 0
src/core/env.c

@@ -144,6 +144,59 @@ static void freeAllActivity(af_Activity *activity) {
         activity = freeActivity(activity);
 }
 
+af_Message *makeMessage(char *type, size_t size) {
+    af_Message *msg = calloc(sizeof(af_Message), 1);
+    msg->type = strCopy(type);
+    if (size != 0)
+        msg->msg = calloc(size, 1);
+    msg->size = size;
+    return msg;
+}
+
+af_Message *freeMessage(af_Message *msg) {
+    af_Message *next = msg->next;
+    free(msg->msg);
+    free(msg);
+    return next;
+}
+
+void freeAllMessage(af_Message *msg) {
+    while (msg != NULL)
+        msg = freeMessage(msg);
+}
+
+void pushMessageUp(af_Message *msg, af_Environment *env) {
+    msg->next = env->activity->msg_up;
+    env->activity->msg_up = msg;
+}
+
+void pushMessageDown(af_Message *msg, af_Environment *env) {
+    msg->next = env->activity->msg_down;
+    env->activity->msg_down = msg;
+}
+
+af_Message *popMessageUp(char *type, af_Environment *env) {
+    for (af_Message **pmsg = &env->activity->msg_up; *pmsg != NULL; pmsg = &((*pmsg)->next)) {
+        if (EQ_STR((*pmsg)->type, type)) {
+            af_Message *msg = *pmsg;
+            *pmsg = msg->next;
+            return msg;
+        }
+    }
+    return NULL;
+}
+
+af_Message *popMessageDown(char *type, af_Environment *env) {
+    for (af_Message **pmsg = &env->activity->msg_down; *pmsg != NULL; pmsg = &((*pmsg)->next)) {
+        if (EQ_STR((*pmsg)->type, type)) {
+            af_Message *msg = *pmsg;
+            *pmsg = msg->next;
+            return msg;
+        }
+    }
+    return NULL;
+}
+
 af_Environment *makeEnvironment(void) {
     af_Environment *env = calloc(sizeof(af_Environment), 1);
     env->core = makeCore();

+ 7 - 0
src/core/run.c

@@ -0,0 +1,7 @@
+#include "aFun.h"
+
+#include "__env.h"
+#include "__object.h"
+#include "__var.h"
+#include "__gc.h"
+#include "__bytecode.h"