瀏覽代碼

feat: 新增makeInheritFromList函数

SongZihuan 3 年之前
父節點
當前提交
0ee872cefe
共有 6 個文件被更改,包括 141 次插入62 次删除
  1. 1 1
      include/core/object.h
  2. 55 0
      include/runtime/aFun_tool.h
  3. 8 7
      include/tool/dlc.h
  4. 4 4
      src/core/object.c
  5. 0 43
      src/runtime/__aFun_tool.h
  6. 73 7
      src/runtime/aFun_tool.c

+ 1 - 1
include/core/object.h

@@ -38,7 +38,7 @@ AFUN_CORE_EXPORT int addAPI(DLC_SYMBOL(objectAPIFunc) func, char *api_name, af_O
 AFUN_CORE_EXPORT int addAPIToObject(DLC_SYMBOL(objectAPIFunc) func, char *api_name, af_Object *obj);
 
 /* 对象继承表 相关操作 */
-AFUN_CORE_EXPORT af_Inherit *pushInherit(af_Inherit **base, af_Inherit *new);
+AFUN_CORE_EXPORT af_Inherit **pushInherit(af_Inherit **base, af_Inherit *new);
 
 /* 对象 属性访问 */
 AFUN_CORE_EXPORT void *getObjectData(af_Object *obj);

+ 55 - 0
include/runtime/aFun_tool.h

@@ -1,6 +1,61 @@
 #ifndef AFUN_AFUN_TOOL_H
 #define AFUN_AFUN_TOOL_H
 
+typedef struct APIFunc APIFunc;
+struct APIFunc {
+    char *name;
+    objectAPIFunc *func;
+    DlcHandle *dlc;  // func 的 来源
+    DLC_SYMBOL(objectAPIFunc) func_;  // func_和func二选一, func_时dlc无效
+    bool free_func_;  // func_是否需要释放
+};
+
+typedef struct InheritDefine InheritDefine;
+struct InheritDefine {
+    af_Object *obj;
+};
+
+typedef struct ObjectDefine ObjectDefine;
+struct ObjectDefine {
+    char *id;
+
+    bool free_api;
+    af_ObjectAPI *api;
+    struct APIFunc *api_list;  // api和api_list只能二选一
+
+    bool allow_inherit;
+    af_Object *belong;
+    af_Inherit *inherit;
+
+    char *var_name;
+    char p_self, p_posterity, p_external;
+
+    af_Object **save;  // obj保存位置
+};
+
+typedef struct LiteralFunc LiteralFunc;
+struct LiteralFunc {
+    char *pattern;
+    char *func;
+    bool in_protect;
+};
+
+typedef struct TopMsgFunc TopMsgFunc;
+struct TopMsgFunc {
+    char *type;
+    TopMsgProcessFunc *func;
+    DlcHandle *dlc;  // func 的 来源
+    DLC_SYMBOL(TopMsgProcessFunc) func_;  // func_和func二选一, func_时dlc无效
+    bool free_func_;  // func_是否需要释放
+};
+
 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);
+
+AFUN_LANG_EXPORT af_ObjectAPI *makeAPIFromList(const APIFunc api_list[]);
+AFUN_LANG_EXPORT void makeObjectFromList(const ObjectDefine obj_def[], af_Object *visitor, af_VarSpace *vs, af_Environment *env);
+AFUN_LANG_EXPORT void makeLiteralRegexFromList(const LiteralFunc literal_list[], af_Environment *env);
+AFUN_LANG_EXPORT void makeTopMsgProcessFromList(const TopMsgFunc top_msg_list[], af_Environment *env);
+AFUN_LANG_EXPORT af_Inherit *makeInheritFromList(const InheritDefine inherit_list[], bool is_reverse);
+
 #endif //AFUN_AFUN_TOOL_H

+ 8 - 7
include/tool/dlc.h

@@ -27,7 +27,8 @@ struct DlcHandle *dlc; \
 
 #define DLC_SYMBOL(NAME) pDLC##NAME##SYMBOL
 #define GET_SYMBOL(SYMBOL) (*((SYMBOL)->symbol))
-#define MAKE_SYMBOL(symbol, TYPE) ((pDLC##TYPE##SYMBOL) (makeSymbol_(symbol)))
+#define MAKE_SYMBOL(symbol, TYPE) ((pDLC##TYPE##SYMBOL) (makeSymbol_(NULL, symbol)))
+#define MAKE_SYMBOL_FROM_HANDLE(symbol, handle, TYPE) ((pDLC##TYPE##SYMBOL) (makeSymbol_((handle), symbol)))
 #define COPY_SYMBOL(ds, TYPE) ((pDLC##TYPE##SYMBOL) (copySymbol_((DlcSymbol_ *)(ds))))
 #define READ_SYMBOL(dlc, name, TYPE) ((pDLC##TYPE##SYMBOL) (getSymbol_((dlc), (name))))
 #define FREE_SYMBOL(symbol) ((symbol) != NULL ? (freeSymbol_((DlcSymbol_ *)(symbol)), NULL) : NULL)
@@ -35,13 +36,13 @@ struct DlcHandle *dlc; \
 typedef struct DlcSymbol_ DlcSymbol_;
 typedef struct DlcHandle DlcHandle;
 
-AFUN_TOOL_EXPORT struct DlcHandle *openLibary(const char *file, int mode);
-AFUN_TOOL_EXPORT struct DlcSymbol_ *makeSymbol_(void *symbol);
-AFUN_TOOL_EXPORT struct DlcSymbol_ *copySymbol_(struct DlcSymbol_ *ds);
-AFUN_TOOL_EXPORT struct DlcSymbol_ *getSymbol_(struct DlcHandle *dlc, const char *name);
+AFUN_TOOL_EXPORT DlcHandle *openLibary(const char *file, int mode);
+AFUN_TOOL_EXPORT DlcSymbol_ *makeSymbol_(DlcHandle *dlc, void *symbol);
+AFUN_TOOL_EXPORT DlcSymbol_ *copySymbol_(DlcSymbol_ *ds);
+AFUN_TOOL_EXPORT DlcSymbol_ *getSymbol_(DlcHandle *dlc, const char *name);
 
-AFUN_TOOL_EXPORT void freeSymbol_(struct DlcSymbol_ *symbol);
-AFUN_TOOL_EXPORT bool freeLibary(struct DlcHandle *dlc);
+AFUN_TOOL_EXPORT void freeSymbol_(DlcSymbol_ *symbol);
+AFUN_TOOL_EXPORT bool freeLibary(DlcHandle *dlc);
 AFUN_TOOL_EXPORT void dlcExit(void);
 
 

+ 4 - 4
src/core/object.c

@@ -151,13 +151,13 @@ af_Inherit *makeInherit(af_Object *obj) {
     return ih;
 }
 
-af_Inherit *pushInherit(af_Inherit **base, af_Inherit *new) {
+af_Inherit **pushInherit(af_Inherit **base, af_Inherit *new) {
     while ((*base) != NULL)
         base = &((*base)->next);
     *base = new;
-    while (new != NULL && new->next != NULL)
-        new = new->next;
-    return new;
+    while ((*base) != NULL)
+        base = &((*base)->next);
+    return base;
 }
 
 static af_Inherit *freeInherit(af_Inherit *ih) {

+ 0 - 43
src/runtime/__aFun_tool.h

@@ -9,53 +9,10 @@
  * 返回 其他执行错误
  */
 typedef int aFunToolFunction(af_Code **code, af_Object *visitor, af_VarSpace *vs, af_Environment *env);
-
 typedef struct ToolFunc ToolFunc;
 struct ToolFunc {
     char *name;
     aFunToolFunction *func;
 };
 
-typedef struct APIFunc APIFunc;
-struct APIFunc {
-    char *name;
-    objectAPIFunc *func;
-};
-
-typedef struct ObjectDefine ObjectDefine;
-struct ObjectDefine {
-    char *id;
-
-    bool free_api;
-    af_ObjectAPI *api;
-    struct APIFunc *api_list;  // api和api_list只能二选一
-
-    bool allow_inherit;
-    af_Object *belong;
-    af_Inherit *inherit;  // TODO-szh 继承表生成工具
-
-    char *var_name;
-    char p_self, p_posterity, p_external;
-
-    af_Object **save;  // obj保存位置
-};
-
-typedef struct LiteralFunc LiteralFunc;
-struct LiteralFunc {
-    char *pattern;
-    char *func;
-    bool in_protect;
-};
-
-typedef struct TopMsgFunc TopMsgFunc;
-struct TopMsgFunc {
-    char *type;
-    TopMsgProcessFunc *func;
-};
-
-AFUN_LANG_NO_EXPORT af_ObjectAPI *makeAPIFromList(const APIFunc api_list[]);
-AFUN_LANG_NO_EXPORT void makeObjectFromList(const ObjectDefine obj_def[], af_Object *visitor, af_VarSpace *vs, af_Environment *env);
-AFUN_LANG_NO_EXPORT void makeLiteralRegexFromList(const LiteralFunc literal_list[], af_Environment *env);
-AFUN_LANG_NO_EXPORT void makeTopMsgProcessFromList(const TopMsgFunc top_msg_list[], af_Environment *env);
-
 #endif //AFUN_AFUN_TOOL_H_

+ 73 - 7
src/runtime/aFun_tool.c

@@ -48,9 +48,17 @@ af_ObjectAPI *makeAPIFromList(const APIFunc api_list[]) {
     af_ObjectAPI *api = makeObjectAPI();
 
     for (const APIFunc *af = api_list; af->name != NULL; af++) {
-        DLC_SYMBOL(objectAPIFunc) func = MAKE_SYMBOL(af->func, objectAPIFunc);
-        addAPI(func, af->name, api);
-        FREE_SYMBOL(func);
+        if (af->func != NULL) {
+            DLC_SYMBOL(objectAPIFunc) func = MAKE_SYMBOL_FROM_HANDLE(af->func, af->dlc, objectAPIFunc);
+            addAPI(func, af->name, api);
+            FREE_SYMBOL(func);
+            continue;
+        } else if (af->func_ == NULL)
+            continue;  // 遇到错误
+
+        addAPI(af->func_, af->name, api);
+        if (af->free_func_)
+            FREE_SYMBOL(af->func_);
     }
 
     return api;
@@ -91,8 +99,66 @@ void makeLiteralRegexFromList(const LiteralFunc literal_list[], af_Environment *
  */
 void makeTopMsgProcessFromList(const TopMsgFunc top_msg_list[], af_Environment *env) {
     for (const TopMsgFunc *tml = top_msg_list; tml->type != NULL; tml++) {
-        DLC_SYMBOL(TopMsgProcessFunc) func = MAKE_SYMBOL(tml->func, TopMsgProcessFunc);
-        addTopMsgProcess(tml->type, func, env);
-        FREE_SYMBOL(func);
+        if (tml->func != NULL) {
+            DLC_SYMBOL(TopMsgProcessFunc) func = MAKE_SYMBOL(tml->func, TopMsgProcessFunc);
+            addTopMsgProcess(tml->type, func, env);
+            FREE_SYMBOL(func);
+            continue;
+        } else if (tml->func_ == NULL)
+            continue;  // 遇到错误
+
+        addTopMsgProcess(tml->type, tml->func_, env);
+        if (tml->free_func_)
+            FREE_SYMBOL(tml->func_);
     }
-}
+}
+
+/*
+ * 函数名: makeInheritFromListReverse
+ * 目标: 以InheritDefine的顺序反向压入Inherit
+ * 注意: pushInherit是反向压入, 因此InheritDefine得正向读取, 最后Inherit反向压入
+ */
+static af_Inherit *makeInheritFromListReverse(const InheritDefine inherit_list[]) {
+    af_Inherit *inherit = NULL;
+    af_Inherit **pinherit = &inherit;
+    for (const InheritDefine *ind = inherit_list; ind->obj != NULL; ind++) {
+        af_Inherit *ih = makeInherit(ind->obj);
+        pinherit = pushInherit(pinherit, ih);
+    }
+
+    return inherit;
+}
+
+/*
+ * 函数名: makeInheritFromListForward
+ * 目标: 以InheritDefine的顺序压入Inherit
+ * 注意: pushInherit是反向压入, 因此InheritDefine也得反向读取, 最后Inherit正向压入
+ */
+static af_Inherit *makeInheritFromListForward(const InheritDefine inherit_list[]) {
+    af_Inherit *inherit = NULL;
+    af_Inherit **pinherit = &inherit;
+    const InheritDefine *ind = inherit_list;
+
+    /* 找到最后一个元素 */
+    while (ind->obj != NULL)
+        ind++;
+    ind--;  // 最后一个元素的前一个元素为最后一个有效元素
+
+    for (NULL; ind != inherit_list; ind++) {
+        af_Inherit *ih = makeInherit(ind->obj);
+        pinherit = pushInherit(pinherit, ih);
+    }
+
+    return inherit;
+}
+
+/*
+ * 函数名: makeInheritFromList
+ * 目标: 根据InheritDefine生成新的Inherit
+ */
+af_Inherit *makeInheritFromList(const InheritDefine inherit_list[], bool is_reverse) {
+    if (is_reverse)
+        return makeInheritFromListReverse(inherit_list);
+    else
+        return makeInheritFromListForward(inherit_list);
+}