Browse Source

feat: act_arg添加对run_in_func的支持

SongZihuan 3 years ago
parent
commit
3753fd6b8a
4 changed files with 20 additions and 8 deletions
  1. 1 0
      src/core/__env.h
  2. 13 4
      src/core/env.c
  3. 4 2
      src/core/run.c
  4. 2 2
      src/main.c

+ 1 - 0
src/core/__env.h

@@ -152,6 +152,7 @@ bool pushMacroFuncActivity(af_Object *func, af_Environment *env);
 bool setFuncActivityToArg(af_Object *func, af_Environment *env);
 bool setFuncActivityAddVar(af_Environment *env);
 int setFuncActivityToNormal(af_Environment *env);
+void setArgCodeListToActivity(af_ArgCodeList *acl, af_Environment *env);
 
 /* LiteralData 释放函数 */
 void freeAllLiteralData(af_LiteralDataList *ld);

+ 13 - 4
src/core/env.c

@@ -639,6 +639,18 @@ bool pushDestructActivity(gc_DestructList *dl, af_Environment *env) {
     return setFuncActivityToArg(dl->func, env);
 }
 
+void setArgCodeListToActivity(af_ArgCodeList *acl, af_Environment *env) {
+    if (acl != NULL) {
+        env->activity->bt_start = acl->code;
+        env->activity->bt_next = acl->code;
+        env->activity->run_in_func = acl->run_in_func;
+    } else {
+        env->activity->bt_start = NULL;
+        env->activity->bt_next = NULL;
+        env->activity->run_in_func = false;
+    }
+}
+
 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);
@@ -663,10 +675,7 @@ bool setFuncActivityToArg(af_Object *func, af_Environment *env) {
         return false;
 
     env->activity->acl_done = env->activity->acl_start;
-    if (env->activity->acl_done != NULL)
-        env->activity->bt_next = env->activity->acl_done->code;
-    else
-        env->activity->bt_next = NULL;
+    setArgCodeListToActivity(env->activity->acl_start, env);
     return true;
 }
 

+ 4 - 2
src/core/run.c

@@ -332,10 +332,12 @@ bool checkNormalEnd(af_Message *msg, af_Environment *env) {
 static bool checkGetArgEnd(af_Message *msg, af_Environment *env) {
     env->activity->acl_done->result = *(af_Object **)(msg->msg);
     freeMessage(msg);
-    if (env->activity->acl_done->next == NULL) // 参数设定结束
+    if (env->activity->acl_done->next == NULL) { // 参数设定结束
+        setArgCodeListToActivity(NULL, env);
         return true;
+    }
     env->activity->acl_done = env->activity->acl_done->next;
-    env->activity->bt_next = env->activity->acl_done->code;
+    setArgCodeListToActivity(env->activity->acl_done, env);
     return false;
 }
 

+ 2 - 2
src/main.c

@@ -902,8 +902,8 @@ int main() {
         printf("\n");
     }
 
-    {  // 函数调用
-        printf("TAG P:\n");
+    {  // gc测试
+        printf("TAG Q:\n");
 
         af_Code *bt2 = makeVariableCode("func5", 0, 1, NULL);
         af_Code *bt1 = makeBlockCode(curly, bt2, 0, 1, NULL, NULL);