Преглед на файлове

feat: 函数调用添加隐式参数(this和func)

SongZihuan преди 3 години
родител
ревизия
bcdec95dbe
променени са 5 файла, в които са добавени 29 реда и са изтрити 8 реда
  1. 1 1
      include/func.h
  2. 3 1
      src/core/__func.h
  3. 18 1
      src/core/env.c
  4. 3 1
      src/core/func.c
  5. 4 4
      src/main.c

+ 1 - 1
include/func.h

@@ -46,7 +46,7 @@ af_ArgList **pushNewArgList(af_ArgList **base, char *name, af_Object *obj);
 bool runArgList(af_ArgList *al, af_VarSpaceListNode *vsl, af_Environment *env);
 
 /* FuncInfo 创建与释放 */
-af_FuncInfo *makeFuncInfo(enum af_FuncInfoScope scope, enum af_FuncInfoEmbedded embedded, bool is_macro);
+af_FuncInfo *makeFuncInfo(enum af_FuncInfoScope scope, enum af_FuncInfoEmbedded embedded, bool is_macro, bool var_this, bool var_func);
 
 void freeFuncInfo(af_FuncInfo *fi);
 

+ 3 - 1
src/core/__func.h

@@ -51,9 +51,11 @@ struct af_FuncInfo {
     // 函数属性
     enum af_FuncInfoScope scope;  // 定义在 func.h
     enum af_FuncInfoEmbedded embedded;  // 定义在 func.h
-
     bool is_macro;  // 宏函数
 
+    bool var_this;  // 是否写入self参数
+    bool var_func;  // 是否写入func参数
+
     // 函数信息
     struct af_FuncBody *body;
 };

+ 18 - 1
src/core/env.c

@@ -678,8 +678,25 @@ bool setFuncActivityAddVar(af_Environment *env){
     }
 
     env->activity->func_var_list = NULL;
-    if (!get_arg_list(&al, env->activity->func, env->activity->acl_start, env->activity->mark, env))
+
+    if (env->activity->fi->var_this && env->activity->belong != NULL) {
+        if (!makeVarToVarSpaceList("this", 3, 3, env->activity->belong, env->activity->var_list, env)) {
+            pushMessageDown(makeMessage("ERROR-STR", 0), env);
+            return false;
+        }
+    }
+
+    if (env->activity->fi->var_func && env->activity->func != NULL) {
+        if (!makeVarToVarSpaceList("func", 3, 3, env->activity->func, env->activity->var_list, env)) {
+            pushMessageDown(makeMessage("ERROR-STR", 0), env);
+            return false;
+        }
+    }
+
+    if (!get_arg_list(&al, env->activity->func, env->activity->acl_start, env->activity->mark, env)) {
+        pushMessageDown(makeMessage("ERROR-STR", 0), env);
         return false;
+    }
     runArgList(al, env->activity->var_list, env);
     freeAllArgList(al);
 

+ 3 - 1
src/core/func.c

@@ -161,11 +161,13 @@ 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){
+af_FuncInfo *makeFuncInfo(enum af_FuncInfoScope scope, enum af_FuncInfoEmbedded embedded, bool is_macro, bool var_this, bool var_func){
     af_FuncInfo *fi = calloc(sizeof(af_FuncInfo), 1);
     fi->scope = scope;
     fi->embedded = embedded;
     fi->is_macro = is_macro;
+    fi->var_this = var_this;
+    fi->var_func = var_func;
     return fi;
 }
 

+ 4 - 4
src/main.c

@@ -80,7 +80,7 @@ void testFunc(int *mark, af_Environment *env) {  // 测试用函数
 }
 
 bool getInfo(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
-    *fi = makeFuncInfo(normal_scope, not_embedded, false);  // 获取FuncInfo [桩]
+    *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
     makeCodeFuncBodyToFuncInfo(makeVariableCode("test", NUL, 0, "Unknow"), true, NULL, *fi);
 
     DLC_SYMBOL(callFuncBody) func = MAKE_SYMBOL(testFunc, callFuncBody);
@@ -144,7 +144,7 @@ void testFunc2(int *mark, af_Environment *env) {  // 测试用函数
 }
 
 bool getInfo2(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
-    *fi = makeFuncInfo(normal_scope, not_embedded, true);  // 获取FuncInfo [桩]
+    *fi = makeFuncInfo(normal_scope, not_embedded, true, true, true);
     makeCodeFuncBodyToFuncInfo(makeVariableCode("test", NUL, 0, "Unknow"), true, NULL, *fi);
     DLC_SYMBOL(callFuncBody) func = MAKE_SYMBOL(testFunc2, callFuncBody);
     makeCFuncBodyToFuncInfo(func, NULL, *fi);
@@ -153,7 +153,7 @@ bool getInfo2(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_En
 }
 
 bool getInfo3(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
-    *fi = makeFuncInfo(normal_scope, not_embedded, false);  // 获取FuncInfo [桩]
+    *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
     makeCodeFuncBodyToFuncInfo(makeLiteralCode("data3", "func", true, NUL, 0, "Unknow"), true, NULL, *fi);
     return true;
 }
@@ -175,7 +175,7 @@ void testFunc4(int *mark, af_Environment *env) {  // 测试用函数
 }
 
 bool getInfo4(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
-    *fi = makeFuncInfo(normal_scope, not_embedded, false);  // 获取FuncInfo [桩]
+    *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
     DLC_SYMBOL(callFuncBody) func = MAKE_SYMBOL(testFunc4, callFuncBody);
     makeCFuncBodyToFuncInfo(func, NULL, *fi);
     FREE_SYMBOL(func);