Ver Fonte

feat: tool添加运行内存中程序的函数

SongZihuan há 3 anos atrás
pai
commit
270242971a

+ 1 - 0
include/core/aFunCore.h

@@ -21,5 +21,6 @@
 #include "parser.h"
 #include "reader.h"
 #include "token.h"
+#include "global_obj.h"
 
 #endif //AFUN_AFUNCORE_H

+ 8 - 0
include/core/global_obj.h

@@ -0,0 +1,8 @@
+#ifndef AFUN_GLOBAL_OBJ_H
+#define AFUN_GLOBAL_OBJ_H
+#include "env.h"
+#include "object.h"
+
+AFUN_CORE_EXPORT af_Object *makeGlobalObject(af_Environment *env);
+
+#endif //AFUN_GLOBAL_OBJ_H

+ 1 - 1
include/runtime/aFun_tool.h

@@ -2,5 +2,5 @@
 #define AFUN_AFUN_TOOL_H
 
 AFUN_LANG_EXPORT int aFunTool(char *name, af_Code **code, af_Object *visitor, af_VarSpace *vs, af_Environment *env);
-
+AFUN_LANG_EXPORT int aFunToolImport(char *name, af_Object **obj, af_Code **code, af_Environment *env);
 #endif //AFUN_AFUN_TOOL_H

+ 2 - 1
include/runtime/aFunlang.h

@@ -14,5 +14,6 @@ AFUN_LANG_EXPORT void destructAFunEnvironment(af_Environment *env);
 AFUN_LANG_EXPORT int runCodeFromString(char *code, char *string_name, FILE *error_file, af_Environment *env);
 AFUN_LANG_EXPORT int runCodeFromFile(FilePath file, FILE *error_file, af_Environment *env);
 AFUN_LANG_EXPORT int runCodeFromStdin(char *name, FILE *error_file, af_Environment *env);
-
+AFUN_LANG_EXPORT int runCodeFromMemory(af_Code *code, af_Environment *env);
+AFUN_LANG_EXPORT int runCodeFromMemoryAsImport(af_Code *code, af_Environment *env);
 #endif //AFUN_AFUNLANG_H

+ 1 - 3
src/core/__global_obj.h

@@ -1,6 +1,4 @@
 #ifndef AFUN_GLOBAL_OBJ_H_
 #define AFUN_GLOBAL_OBJ_H_
-
-AFUN_CORE_NO_EXPORT af_Object *makeGlobalObject(af_Environment *env);
-
+#include "global_obj.h"
 #endif //AFUN_GLOBAL_OBJ_H_

+ 24 - 24
src/main.c

@@ -885,7 +885,7 @@ int main() {
         af_Code *bt6 = makeElementCode("global", 0, 1, NULL);
         pushCode(&bt5, bt6);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -901,7 +901,7 @@ int main() {
         af_Code *bt6 = makeElementCode("global", 0, 1, NULL);
         pushCode(&bt5, bt6);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -917,7 +917,7 @@ int main() {
         af_Code *bt5 = makeBlockCode(curly, bt3, 0, 1, NULL, NULL);
         pushCode(&bt2, bt5);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -926,7 +926,7 @@ int main() {
         printf("TAG C:\n");
         af_Code *bt1 = makeElementCode("data", ',', 0, "tagc.af");
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -944,7 +944,7 @@ int main() {
         af_Code *bt6 = makeElementCode("global", 0, 1, NULL);
         pushCode(&bt5, bt6);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -961,7 +961,7 @@ int main() {
         af_Code *bt6 = makeElementCode("global", 0, 1, NULL);
         pushCode(&bt5, bt6);
 
-        iterCode(bt5, 0, env);
+        runCodeFromMemory(bt5, env);
         freeAllCode(bt5);
         printf("\n");
     }
@@ -978,7 +978,7 @@ int main() {
         af_Code *bt6 = makeElementCode("global", 0, 1, NULL);
         pushCode(&bt5, bt6);
 
-        iterCode(bt5, 0, env);
+        runCodeFromMemory(bt5, env);
         freeAllCode(bt5);
         printf("\n");
     }
@@ -992,7 +992,7 @@ int main() {
 
         af_Code *bt5 = makeBlockCode(parentheses, bt3, '\'', 1, "tagg.af", NULL);
 
-        iterCode(bt5, 0, env);
+        runCodeFromMemory(bt5, env);
         freeAllCode(bt5);
         printf("\n");
     }
@@ -1006,7 +1006,7 @@ int main() {
 
         af_Code *bt5 = makeBlockCode(brackets, bt3, ',', 1, "tagh.af", NULL);
 
-        iterCode(bt5, 0, env);
+        runCodeFromMemory(bt5, env);
         freeAllCode(bt5);
         printf("\n");
     }
@@ -1023,7 +1023,7 @@ int main() {
         af_Code *bt6 = makeElementCode("global", 0, 1, NULL);
         pushCode(&bt5, bt6);
 
-        iterCode(bt3, 0, env);
+        runCodeFromMemory(bt3, env);
         freeAllCode(bt3);
         printf("\n");
     }
@@ -1034,7 +1034,7 @@ int main() {
         af_Code *bt2 = makeElementCode("global", 0, 1, NULL);
         pushCode(&bt1, bt2);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1045,7 +1045,7 @@ int main() {
         af_Code *bt2 = makeElementCode("global", 0, 1, NULL);
         pushCode(&bt1, bt2);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1054,7 +1054,7 @@ int main() {
         printf("TAG L:\n");
         af_Code *bt1 = makeElementCode("func4", 0, 1, "tagl.af");
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1065,7 +1065,7 @@ int main() {
         af_Code *bt2 = makeElementCode("func", 0, 1, NULL);
         af_Code *bt1 = makeBlockCode(curly, bt2, 0, 1, "Tagm.af", NULL);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1081,7 +1081,7 @@ int main() {
         pushCode(&bt1, bt3);
         pushCode(&bt3, bt4);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1095,7 +1095,7 @@ int main() {
 
         pushCode(&bt1, bt3);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1109,7 +1109,7 @@ int main() {
 
         pushCode(&bt1, bt3);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1123,7 +1123,7 @@ int main() {
 
         pushCode(&bt1, bt3);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1141,7 +1141,7 @@ int main() {
         af_Code *bt6 = makeElementCode("global", 0, 1, NULL);
         pushCode(&bt5, bt6);
 
-        iterCode(bt1, 1, env);
+        runCodeFromMemoryAsImport(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1172,7 +1172,7 @@ int main() {
 
         pushCode(&bt1, bt3);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1187,7 +1187,7 @@ int main() {
         af_Code *bt6 = makeElementCode("global", 0, 1, NULL);
         pushCode(&bt5, bt6);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1199,7 +1199,7 @@ int main() {
 
         pushCode(&bt1, bt2);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1212,7 +1212,7 @@ int main() {
 
         pushCode(&bt1, bt2);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }
@@ -1226,7 +1226,7 @@ int main() {
         af_Code *bt3 = makeElementCode("global", 0, 1, NULL);
         pushCode(&bt1, bt3);
 
-        iterCode(bt1, 0, env);
+        runCodeFromMemory(bt1, env);
         freeAllCode(bt1);
         printf("\n");
     }

+ 15 - 3
src/runtime/aFun_tool.c

@@ -1,4 +1,5 @@
 #include "__aFun_tool.h"
+#include "__global_obj.h"
 #include "__rt_tool.h"
 
 /* 数组为只读的内容 */
@@ -8,13 +9,13 @@ static const ToolFunc global_tool_list[] = {
 };
 
 /*
+ * 函数名: aFunTool
+ * 目标: 调用指定内置包(tool)
  * 返回 (0)   执行正常
  * 返回 (1)  库不存在
- *
- * 必须传入: code
  */
 int aFunTool(char *name, af_Code **code, af_Object *visitor, af_VarSpace *vs, af_Environment *env) {
-    if (code == NULL || env == NULL || vs == NULL)
+    if (name == NULL || code == NULL || env == NULL || vs == NULL)
         return 1;
     *code = NULL;
     for (const ToolFunc *tf = global_tool_list; global_tool_list->name != NULL; tf++) {
@@ -28,6 +29,17 @@ int aFunTool(char *name, af_Code **code, af_Object *visitor, af_VarSpace *vs, af
     return 1;
 }
 
+/*
+ * 函数名: aFunTool
+ * 目标: 生成vs, 调用指定内置包(tool)
+ */
+int aFunToolImport(char *name, af_Object **obj, af_Code **code, af_Environment *env) {
+    if (name == NULL || code == NULL || env == NULL || obj == NULL)
+        return 1;
+    *obj = makeGlobalObject(env);
+    return aFunTool(name, code, *obj, (*obj)->data->var_space, env);
+}
+
 /*
  * 函数名: makeAPIFromList
  * 目标: 根据APIFunc生成api表并写入数据

+ 36 - 0
src/runtime/aFunlang.c

@@ -2,6 +2,8 @@
 #include "aFunCore.h"
 #include "__env.h"
 
+static int runCode_(FilePath name, af_Parser *parser, int mode, af_Environment *env);
+
 void aFunInit() {
     aFunCoreInit();
 }
@@ -43,6 +45,10 @@ static int runCode_(FilePath name, af_Parser *parser, int mode, af_Environment *
 }
 
 
+/*
+ * 函数名: runCodeFromString
+ * 目标: 运行字符串中的程序 (源码形式)
+ */
 int runCodeFromString(char *code, char *string_name, FILE *error_file, af_Environment *env) {
     if (env == NULL || code == NULL)
         return -1;
@@ -56,6 +62,10 @@ int runCodeFromString(char *code, char *string_name, FILE *error_file, af_Enviro
     return runCode_(string_name, parser, 1, env);
 }
 
+/*
+ * 函数名: runCodeFromString
+ * 目标: 运行文件中的程序 (源码形式)
+ */
 int runCodeFromFile(FilePath file, FILE *error_file, af_Environment *env) {
     if (env == NULL || file == NULL)
         return -1;
@@ -66,6 +76,10 @@ int runCodeFromFile(FilePath file, FILE *error_file, af_Environment *env) {
     return runCode_(file, parser, 1, env);
 }
 
+/*
+ * 函数名: runCodeFromString
+ * 目标: 运行stdin的程序 (源码形式)
+ */
 int runCodeFromStdin(char *name, FILE *error_file, af_Environment *env) {
     if (env == NULL || feof(stdin) || ferror(stdin))
         return -1;
@@ -78,3 +92,25 @@ int runCodeFromStdin(char *name, FILE *error_file, af_Environment *env) {
     af_Parser *parser = makeParserByStdin(error_file);
     return runCode_(name, parser, 0, env);
 }
+
+/*
+ * 函数名: runCodeFromString
+ * 目标: 运行内存中的程序 (字节码形式)
+ */
+int runCodeFromMemory(af_Code *code, af_Environment *env) {
+    bool res = iterCode(code, 0, env);
+    if (!res)
+        return env->core->exit_code;
+    return 0;
+}
+
+/*
+ * 函数名: runCodeFromMemoryAsImport
+ * 目标: 采用import的方式运行内存中程序 (字节码形式)
+ */
+int runCodeFromMemoryAsImport(af_Code *code, af_Environment *env) {
+    bool res = iterCode(code, 1, env);
+    if (!res)
+        return env->core->exit_code;
+    return 0;
+}