|
@@ -1,5 +1,15 @@
|
|
|
#include "__func.h"
|
|
|
|
|
|
+/* FuncBody 创建与释放 */
|
|
|
+static af_FuncBody *makeFuncBody(enum af_FuncBodyType type);
|
|
|
+static af_FuncBody *makeCodeFuncBody(af_Code *code, bool free_code);
|
|
|
+static af_FuncBody *makeCFuncBody(DLC_SYMBOL(callFuncBody) c_func);
|
|
|
+static af_FuncBody *freeFuncBody(af_FuncBody *fb);
|
|
|
+static void freeAllFuncBody(af_FuncBody *fb);
|
|
|
+
|
|
|
+/* FuncBody 操作函数 */
|
|
|
+static void pushFuncBody(af_FuncBody **base, af_FuncBody *body);
|
|
|
+
|
|
|
ArgCodeList *makeArgCodeList(af_Code *code, size_t size, bool free_code, bool run_in_func) {
|
|
|
ArgCodeList *acl = calloc(sizeof(ArgCodeList), 1);
|
|
|
acl->info = calloc(size, 1);
|
|
@@ -90,3 +100,66 @@ bool runArgList(ArgList *al, af_VarSpaceListNode *vsl) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+static af_FuncBody *makeFuncBody(enum af_FuncBodyType type) {
|
|
|
+ af_FuncBody *fb = calloc(sizeof(af_FuncBody), 1);
|
|
|
+ fb->type = type;
|
|
|
+ return fb;
|
|
|
+}
|
|
|
+
|
|
|
+static af_FuncBody *makeCodeFuncBody(af_Code *code, bool free_code) {
|
|
|
+ af_FuncBody *fb = makeFuncBody(func_body_code);
|
|
|
+ fb->code = code;
|
|
|
+ fb->free_code = free_code;
|
|
|
+ return fb;
|
|
|
+}
|
|
|
+
|
|
|
+static af_FuncBody *makeCFuncBody(DLC_SYMBOL(callFuncBody) c_func) {
|
|
|
+ af_FuncBody *fb = makeFuncBody(func_body_c);
|
|
|
+ fb->c_func = COPY_SYMBOL(c_func, callFuncBody);
|
|
|
+ return fb;
|
|
|
+}
|
|
|
+
|
|
|
+static af_FuncBody *freeFuncBody(af_FuncBody *fb) {
|
|
|
+ af_FuncBody *next = fb->next;
|
|
|
+ if (fb->type == func_body_code && fb->free_code)
|
|
|
+ freeAllCode(fb->code);
|
|
|
+ else if (fb->type == func_body_c)
|
|
|
+ FREE_SYMBOL(fb->c_func);
|
|
|
+ free(fb);
|
|
|
+ return next;
|
|
|
+}
|
|
|
+
|
|
|
+static void freeAllFuncBody(af_FuncBody *fb) {
|
|
|
+ while (fb != NULL)
|
|
|
+ fb = freeFuncBody(fb);
|
|
|
+}
|
|
|
+
|
|
|
+static void pushFuncBody(af_FuncBody **base, af_FuncBody *body) {
|
|
|
+ while (*base != NULL)
|
|
|
+ base = &((*base)->next);
|
|
|
+ *base = body;
|
|
|
+}
|
|
|
+
|
|
|
+af_FuncInfo *makeFuncInfo(enum af_FuncInfoScope scope, enum af_FuncInfoEmbedded embedded, bool is_macro,
|
|
|
+ bool is_object, af_VarSpaceListNode *vsl) {
|
|
|
+ af_FuncInfo *fi = calloc(sizeof(af_FuncInfo), 1);
|
|
|
+ fi->scope = scope;
|
|
|
+ fi->embedded = embedded;
|
|
|
+ fi->is_macro = is_macro;
|
|
|
+ fi->is_object = is_object;
|
|
|
+ fi->vsl = vsl;
|
|
|
+ return fi;
|
|
|
+}
|
|
|
+
|
|
|
+void freeFuncInfo(af_FuncInfo *fi) { // vsl是不释放的
|
|
|
+ freeAllFuncBody(fi->body);
|
|
|
+ free(fi);
|
|
|
+}
|
|
|
+
|
|
|
+void makeCFuncBodyToFuncInfo(DLC_SYMBOL(callFuncBody) c_func, af_FuncInfo *fi) {
|
|
|
+ pushFuncBody(&fi->body, makeCFuncBody(c_func));
|
|
|
+}
|
|
|
+
|
|
|
+void makeCodeFuncBodyToFuncInfo(af_Code *code, bool free_code, af_FuncInfo *fi) {
|
|
|
+ pushFuncBody(&fi->body, makeCodeFuncBody(code, free_code));
|
|
|
+}
|