Bläddra i källkod

feat: af_CallFuncInfo新增body_next字段

SongZihuan 3 år sedan
förälder
incheckning
242c38cf09
6 ändrade filer med 28 tillägg och 19 borttagningar
  1. 5 3
      include/core/func.h
  2. 2 2
      include/core/info/obj_api.h
  3. 11 4
      src/core/env.c
  4. 1 1
      src/runtime/base/quit.c
  5. 1 1
      src/runtime/base/str_obj.c
  6. 8 8
      test/src/run_code.c

+ 5 - 3
include/core/func.h

@@ -22,9 +22,11 @@ enum af_FuncInfoEmbedded {
 #include "code.h"
 #include "object.h"
 
-typedef struct CallFuncInfo CallFuncInfo;
-struct CallFuncInfo {
+typedef struct af_CallFuncInfo af_CallFuncInfo;
+struct af_CallFuncInfo {
     void *mark;
+    af_FuncBody *body_next;
+
     af_Object *belong;
     af_Object *func;
     struct af_VarSpaceListNode *var_list;
@@ -36,7 +38,7 @@ struct CallFuncInfo {
     bool is_macro_call;
 };
 
-typedef struct af_FuncBody *callFuncBody(CallFuncInfo *info, af_Environment *env);
+typedef struct af_FuncBody *callFuncBody(af_CallFuncInfo *info, af_Environment *env);
 NEW_DLC_SYMBOL(callFuncBody, callFuncBody);
 
 /* af_ArgCodeList 创建与释放 */

+ 2 - 2
include/core/info/obj_api.h

@@ -27,8 +27,8 @@ typedef af_GuardianList *GuardianFunc(char *type, bool is_guard, void *data, af_
 typedef void GuardianDestruct(char *type, void *data, af_Environment *env);
 
 /* 回调C函数 */
-typedef struct CallFuncInfo CallFuncInfo;
-typedef struct af_FuncBody *callFuncBody(CallFuncInfo *info, af_Environment *env);  // 位于env.h
+typedef struct af_CallFuncInfo af_CallFuncInfo;
+typedef struct af_FuncBody *callFuncBody(af_CallFuncInfo *info, af_Environment *env);  // 位于env.h
 
 /* 定义Object的函数签名 */
 /*

+ 11 - 4
src/core/env.c

@@ -1321,8 +1321,10 @@ bool setFuncActivityAddVar(af_Environment *env){
     return true;
 }
 
-static void initCallFuncInfo(CallFuncInfo *cfi, af_Environment *env) {
+static void initCallFuncInfo(af_CallFuncInfo *cfi, af_Environment *env) {
     cfi->mark = env->activity->mark;
+    cfi->body_next = env->activity->body_next;
+
     cfi->belong = env->activity->belong;
     cfi->func = env->activity->func;
     cfi->var_list = env->activity->var_list;  // 传var_list而非vsl
@@ -1356,13 +1358,18 @@ int setFuncActivityToNormal(af_Environment *env){  // 获取函数的函数体
     env->activity->body_next = body->next;
     switch (body->type) {
         case func_body_c: {
-            CallFuncInfo cfi;
+            af_CallFuncInfo cfi;
             initCallFuncInfo(&cfi, env);
 
             af_FuncBody *new = GET_SYMBOL(body->c_func)(&cfi, env);
             activity->process_msg_first++;  // 处理C函数通过msg_down返回的结果
-            pushDynamicFuncBody(new, body);
-            activity->body_next = body->next;  // 添加新元素后要重新设定body_next的位置
+            if (cfi.body_next != env->activity->body_next) {
+                env->activity->body_next = cfi.body_next;
+                freeAllFuncBody(new);  // 不再允许设定 FuncBody
+            } else {
+                pushDynamicFuncBody(new, body);
+                activity->body_next = body->next;  // 添加新元素后要重新设定body_next的位置
+            }
             re = -1;
             break;
         }

+ 1 - 1
src/runtime/base/quit.c

@@ -33,7 +33,7 @@ static bool funcVarList(char *id, af_Object *obj, af_VarSpaceListNode **vsl, voi
     return true;
 }
 
-static af_FuncBody *funcBody(CallFuncInfo *cfi, af_Environment *env) {
+static af_FuncBody *funcBody(af_CallFuncInfo *cfi, af_Environment *env) {
     env->core->exit_code_->num = 0;
     env->core->status = core_exit;
     pushMessageDown(makeNORMALMessage(getGlobal(env)), env);

+ 1 - 1
src/runtime/base/str_obj.c

@@ -67,7 +67,7 @@ static bool strFuncVarList(char *id, af_Object *obj, af_VarSpaceListNode **vsl,
     return true;
 }
 
-static af_FuncBody *strFuncBody(CallFuncInfo *cfi, af_Environment *env) {
+static af_FuncBody *strFuncBody(af_CallFuncInfo *cfi, af_Environment *env) {
     af_Object *obj = cfi->func;
     ObjectStrFunc *osf = getObjectData(obj);
     af_Object *str = makeObject((char *)string_id, false, osf->api, false, NULL, makeInherit(obj), env);

+ 8 - 8
test/src/run_code.c

@@ -76,7 +76,7 @@ void literalSet(char *id, af_Object *obj, void *data, char *str, af_Environment
     printf("literalSet(): str = %s\n", str);
 }
 
-af_FuncBody *testFunc(CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
+af_FuncBody *testFunc(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
     printf("testFunc(): I am testFunc\n");
     af_Object *obj;
 
@@ -108,7 +108,7 @@ void freeMark(char *id, af_Object *obj, int *mark) {
     free(mark);
 }
 
-af_FuncBody *testFunc2(CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
+af_FuncBody *testFunc2(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
     printf("testFunc2(): I am testFunc2\n");
     af_Object *obj;
 
@@ -173,7 +173,7 @@ bool getInfo3(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *m
     return true;
 }
 
-af_FuncBody *testFunc4(CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
+af_FuncBody *testFunc4(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
     printf("testFunc4(): I am testFunc4\n");
     af_Object *obj;
 
@@ -198,7 +198,7 @@ bool getInfo4(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *m
     return true;
 }
 
-af_FuncBody *testFunc9(CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
+af_FuncBody *testFunc9(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
     af_Object *obj;
     af_FuncBody *fb;
     obj = makeObject("obj", true, makeObjectAPI(), true, NULL, NULL, env);
@@ -222,7 +222,7 @@ bool getInfo9(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *m
     return true;
 }
 
-af_FuncBody *testFunc8(CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
+af_FuncBody *testFunc8(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
     af_Object *obj;
     obj = makeObject("obj", true, makeObjectAPI(), true, NULL, NULL, env);
     pushMessageDown(makeNORMALMessage(obj), env);
@@ -231,7 +231,7 @@ af_FuncBody *testFunc8(CallFuncInfo *cfi, af_Environment *env) {  // 测试用
     return NULL;
 }
 
-af_FuncBody *testFunc7(CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
+af_FuncBody *testFunc7(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
     af_Object *obj;
     obj = makeObject("func", true, makeObjectAPI(), true, NULL, NULL, env);
     pushMessageDown(makeNORMALMessage(obj), env);
@@ -248,7 +248,7 @@ bool getInfo7(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *m
     return true;
 }
 
-af_FuncBody *testFunc6(CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
+af_FuncBody *testFunc6(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
     af_Object *obj;
     af_Object *des;
     obj = makeObject("func", true, makeObjectAPI(), true, NULL, NULL, env);
@@ -300,7 +300,7 @@ bool getInfo6(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *m
     return true;
 }
 
-af_FuncBody *testFunc5(CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
+af_FuncBody *testFunc5(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
     af_Object *obj;
     af_Object *des;
     obj = makeObject("func", true, makeObjectAPI(), true, NULL, NULL, env);