2
0

runtime.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #include "__runtime.h"
  2. #include "__global_obj.h"
  3. #include "runtime_tool.h"
  4. /* 数组为只读的内容 */
  5. static const ToolFunc global_tool_list[] = {
  6. {.name="base", .func=aFunTool_base},
  7. {.name=NULL, .func=NULL},
  8. };
  9. /*
  10. * 函数名: runtimeTool
  11. * 目标: 调用指定内置包(tool)
  12. * 返回 (0) 执行正常
  13. * 返回 (1) 库不存在
  14. */
  15. int runtimeTool(char *name, af_Code **code, af_Object *visitor, af_VarSpace *vs, af_Environment *env) {
  16. if (name == NULL || code == NULL || env == NULL || vs == NULL)
  17. return 1;
  18. *code = NULL;
  19. for (const ToolFunc *tf = global_tool_list; global_tool_list->name != NULL; tf++) {
  20. if (EQ_STR(tf->name, name)) {
  21. int exit_code = tf->func(code, visitor, vs, env);
  22. if (exit_code == 1) // 将 exit_code 映射到0
  23. return 0;
  24. return exit_code;
  25. }
  26. }
  27. return 1;
  28. }
  29. /*
  30. * 函数名: runtimeToolImport
  31. * 目标: 生成vs, 调用指定内置包(tool)
  32. */
  33. int runtimeToolImport(char *name, af_Object **obj, af_Code **code, af_Environment *env) {
  34. if (name == NULL || code == NULL || env == NULL || obj == NULL)
  35. return 1;
  36. *obj = makeGlobalObject(env);
  37. return runtimeTool(name, code, *obj, (*obj)->data->var_space, env);
  38. }
  39. /*
  40. * 函数名: makeAPIFromList
  41. * 目标: 根据APIFuncList生成api表并写入数据
  42. */
  43. af_ObjectAPI *makeAPIFromList(const APIFuncList api_list[]) {
  44. af_ObjectAPI *api = makeObjectAPI();
  45. for (const APIFuncList *af = api_list; af->name != NULL; af++) {
  46. if (af->func != NULL) {
  47. DLC_SYMBOL(objectAPIFunc) func = MAKE_SYMBOL_FROM_HANDLE(af->func, af->dlc, objectAPIFunc);
  48. addAPI(func, af->name, api);
  49. FREE_SYMBOL(func);
  50. continue;
  51. } else if (af->func_ == NULL)
  52. continue; // 遇到错误
  53. addAPI(af->func_, af->name, api);
  54. if (af->free_func_)
  55. FREE_SYMBOL(af->func_);
  56. }
  57. return api;
  58. }
  59. /*
  60. * 函数名: makeObjectFromList
  61. * 目标: 根据ObjectDefineList生成Object, 并保存到对应位置和变量空间中
  62. */
  63. void makeObjectFromList(const ObjectDefineList obj_def[], af_Object *visitor, af_VarSpace *vs, af_Environment *env) {
  64. for (const ObjectDefineList *od = obj_def; od->id != NULL; od++) {
  65. af_ObjectAPI *api = od->api;
  66. if (api == NULL)
  67. api = makeAPIFromList(od->api_list);
  68. af_Object *obj = makeObject(od->id, od->free_api, api, od->allow_inherit, od->belong, od->inherit, env);
  69. if (od->save != NULL)
  70. *(od->save) = obj;
  71. if (vs != NULL && od->var_name != NULL) {
  72. if (!makeVarToVarSpace(od->var_name, od->p_self, od->p_posterity, od->p_external, obj, vs, visitor, env))
  73. setVarToVarSpace(od->var_name, obj, visitor, vs); // 若失败则尝试直接设定变量
  74. }
  75. }
  76. }
  77. /*
  78. * 函数名: makeLiteralRegexFromList
  79. * 目标: 根据LiteralFuncList压入新的字面量处理器
  80. */
  81. void makeLiteralRegexFromList(const LiteralFuncList literal_list[], af_Environment *env) {
  82. for (const LiteralFuncList *lt = literal_list; lt->pattern != NULL; lt++)
  83. pushLiteralRegex(lt->pattern, lt->func, lt->in_protect, env);
  84. }
  85. /*
  86. * 函数名: makeTopMsgProcessFromList
  87. * 目标: 根据TopMsgFuncList压入新的字面量处理器
  88. */
  89. void makeTopMsgProcessFromList(const TopMsgFuncList top_msg_list[], af_Environment *env) {
  90. for (const TopMsgFuncList *tml = top_msg_list; tml->type != NULL; tml++) {
  91. if (tml->func != NULL) {
  92. DLC_SYMBOL(TopMsgProcessFunc) func = MAKE_SYMBOL_FROM_HANDLE(tml->func, tml->dlc, TopMsgProcessFunc);
  93. addTopMsgProcess(tml->type, func, env);
  94. FREE_SYMBOL(func);
  95. continue;
  96. } else if (tml->func_ == NULL)
  97. continue; // 遇到错误
  98. addTopMsgProcess(tml->type, tml->func_, env);
  99. if (tml->free_func_)
  100. FREE_SYMBOL(tml->func_);
  101. }
  102. }
  103. /*
  104. * 函数名: makeInheritFromListReverse
  105. * 目标: 以InheritDefineList的顺序反向压入Inherit
  106. * 注意: pushInherit是反向压入, 因此InheritDefine得正向读取, 最后Inherit反向压入
  107. */
  108. static af_Inherit *makeInheritFromListReverse(const InheritDefineList inherit_list[]) {
  109. af_Inherit *inherit = NULL;
  110. af_Inherit **pinherit = &inherit;
  111. for (const InheritDefineList *ind = inherit_list; ind->obj != NULL; ind++) {
  112. af_Inherit *ih = makeInherit(ind->obj);
  113. pinherit = pushInherit(pinherit, ih);
  114. }
  115. return inherit;
  116. }
  117. /*
  118. * 函数名: makeInheritFromListForward
  119. * 目标: 以InheritDefineList的顺序压入Inherit
  120. * 注意: pushInherit是反向压入, 因此InheritDefine也得反向读取, 最后Inherit正向压入
  121. */
  122. static af_Inherit *makeInheritFromListForward(const InheritDefineList inherit_list[]) {
  123. af_Inherit *inherit = NULL;
  124. af_Inherit **pinherit = &inherit;
  125. const InheritDefineList *ind = inherit_list;
  126. /* 找到最后一个元素 */
  127. while (ind->obj != NULL)
  128. ind++;
  129. ind--; // 最后一个元素的前一个元素为最后一个有效元素
  130. for (NULL; ind != inherit_list; ind++) {
  131. af_Inherit *ih = makeInherit(ind->obj);
  132. pinherit = pushInherit(pinherit, ih);
  133. }
  134. return inherit;
  135. }
  136. /*
  137. * 函数名: makeInheritFromList
  138. * 目标: 根据InheritDefineList生成新的Inherit
  139. */
  140. af_Inherit *makeInheritFromList(const InheritDefineList inherit_list[], bool is_reverse) {
  141. if (is_reverse)
  142. return makeInheritFromListReverse(inherit_list);
  143. else
  144. return makeInheritFromListForward(inherit_list);
  145. }
  146. /*
  147. * 函数名: makeGuardianFromList
  148. * 目标: 根据GuardianFuncList压入新的字面量处理器
  149. */
  150. void makeGuardianFromList(const GuardianFuncList gd_list[], af_Environment *env) {
  151. for (const GuardianFuncList *gdl = gd_list; gdl->type != NULL; gdl++) {
  152. DLC_SYMBOL(GuardianFunc) func = gdl->func_;
  153. bool free_func_ = gdl->free_func_;
  154. DLC_SYMBOL(GuardianDestruct) destruct = gdl->destruct_;
  155. bool free_destruct_ = gdl->free_destruct_;
  156. if (func == NULL) {
  157. if (gdl->func == NULL)
  158. continue; // 遇到错误
  159. func = MAKE_SYMBOL_FROM_HANDLE(gdl->func, gdl->dlc, GuardianFunc);
  160. free_func_ = true;
  161. }
  162. if (destruct == NULL) {
  163. if (gdl->destruct == NULL)
  164. continue; // 遇到错误
  165. destruct = MAKE_SYMBOL_FROM_HANDLE(gdl->destruct, gdl->dlc, GuardianDestruct);
  166. free_destruct_ = true;
  167. }
  168. void *tmp = NULL;
  169. void **pdata = gdl->data;
  170. if (pdata == NULL)
  171. pdata = &tmp;
  172. if (addGuardian(gdl->type, gdl->always, gdl->size, func, destruct, pdata, env))
  173. gdl->initData(*pdata, env);
  174. if (free_func_)
  175. FREE_SYMBOL(func);
  176. if (free_destruct_)
  177. FREE_SYMBOL(destruct);
  178. }
  179. }