2
0

run.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. #include <assert.h>
  2. #include "aFunCore.h"
  3. #include "__run.h"
  4. #include "__env.h"
  5. /* 工具函数: 初始化类型 */
  6. static bool iterCodeInit(af_Code *code, af_Environment *env);
  7. /* 工具函数: Message类函数 */
  8. static af_Message *getTopMsg(af_Environment *env);
  9. /* 工具函数: 检查类型 */
  10. static bool checkInMsgType(char *type, af_Environment *env);
  11. static bool checkLiteral(af_Message **msg, af_Environment *env);
  12. static int checkMacro(af_Message *msg, af_Environment *env);
  13. static bool checkRunGC(af_Environment *env);
  14. static int checkMsg(af_Message *msg, af_Environment *env);
  15. bool checkNormalEnd(af_Message *msg, af_Environment *env);
  16. static bool checkGetArgEnd(af_Message *msg, af_Environment *env);
  17. /* Code 执行函数 */
  18. static bool codeElement(af_Code *code, af_Environment *env);
  19. static bool codeBlock(af_Code *code, af_Environment *env);
  20. /*
  21. * 函数名: checkInMsgType
  22. * 目标: 检查type是否在对应的msg_type中 (检查该activity是否可以处理该信息)
  23. */
  24. static bool checkInMsgType(char *type, af_Environment *env) {
  25. if (env->activity->body_next == NULL || env->activity->body_next->msg_type == NULL)
  26. return false;
  27. for (char *msg_type_node = *env->activity->body_next->msg_type; msg_type_node != NULL; msg_type_node++) {
  28. if (EQ_STR(type, msg_type_node))
  29. return true;
  30. }
  31. return false;
  32. }
  33. /*
  34. * 函数名: checkLiteral
  35. * 目标: 检查是否字面量调用, 若是则返回true并调用API, 否则返回false不做修改
  36. */
  37. static bool checkLiteral(af_Message **msg, af_Environment *env) {
  38. if (!env->activity->is_literal) // 非字面量
  39. return true;
  40. if ((*msg) == NULL || !EQ_STR((*msg)->type, "NORMAL")) // (*msg)非正常值
  41. return false;
  42. af_Object *obj = *(af_Object **)((*msg)->msg);
  43. obj_literalSetting *func = findAPI("obj_literalSetting", obj->data->api);
  44. if (func == NULL) {
  45. gc_delReference(obj);
  46. freeMessage(*msg);
  47. *msg = makeERRORMessage(TYPE_ERROR, API_NOT_FOUND_INFO(obj_literalSetting), env);
  48. return false;
  49. }
  50. for (af_LiteralDataList *ld = env->activity->ld; ld != NULL; ld = ld->next)
  51. func(ld->literal_data, obj->data->data, obj, env);
  52. freeAllLiteralData(env->activity->ld);
  53. env->activity->ld = NULL;
  54. env->activity->is_literal = false;
  55. printf("Literal %p\n", obj);
  56. return true;
  57. }
  58. /*
  59. * 函数名: checkMacro
  60. * 目标: 检查是否宏函数调用, 若是则返回true并修改activity隐式调用(activity继续执行时则会执行该调用), 否则返回false不做修改
  61. * 返回值:
  62. * -1 非宏函数
  63. * 0 错误
  64. * 1 宏函数
  65. */
  66. static int checkMacro(af_Message *msg, af_Environment *env) {
  67. if (env->activity->fi == NULL || !env->activity->fi->is_macro) // 非宏函数
  68. return -1;
  69. if (!EQ_STR(msg->type, "NORMAL")) // msg非正常值
  70. return -1;
  71. af_Object *obj = *(af_Object **)(msg->msg);
  72. bool re = pushMacroFuncActivity(obj, env);
  73. gc_delReference(obj);
  74. freeMessage(msg);
  75. if (re)
  76. return 1;
  77. return 0;
  78. }
  79. /*
  80. * 函数名: checkRunGC
  81. * 目标: 检查是否该运行gc, 若是则返回true并运行gc, 否则返回false
  82. */
  83. static bool checkRunGC(af_Environment *env) {
  84. if (env->core->gc_run == grt_always ||
  85. env->core->gc_run == grt_count && env->core->gc_count >= env->core->gc_count_max) {
  86. gc_RunGC(env);
  87. return true;
  88. }
  89. return false;
  90. }
  91. /*
  92. * 函数名: iterCodeInit
  93. * 目标: 初始化activity和environment (若environment中未存在activity则通过code新增一个TopActivity, 否则沿用原activity)
  94. */
  95. static bool iterCodeInit(af_Code *code, af_Environment *env) {
  96. if (env == NULL || env->core == NULL || env->activity == NULL || env->core->status == core_exit)
  97. return false;
  98. if (env->core->status == core_stop)
  99. env->core->status = core_normal;
  100. setActivityBtTop(code, env->activity);
  101. setActivityBtStart(code, env->activity);
  102. return true;
  103. }
  104. /*
  105. * 函数名: codeElement
  106. * 目标: 执行变量访问或字面量生成 (设置bt_next)
  107. * (1) 执行字面量生成代码 (设置bt_next)
  108. * 返回-false 表示执行错误 (msg_down中写入消息)
  109. * 返回-true 表示执行成功 (msg_down中无消息写入, 函数仅设置activity无实质性代码执行)
  110. * (2) 执行变量访问代码:
  111. * 返回-false 表示执行失败, 或执行成功得到一个变量值 (msg_down中写入消息)
  112. * 返回-true 表示执行成功, 得到一个对象函数, 并且隐式调用 (msg_down中无消息写入, 函数仅设置activity无实质性代码执行)
  113. */
  114. static bool codeElement(af_Code *code, af_Environment *env) {
  115. bool in_protect;
  116. char *func;
  117. af_Var *var;
  118. if (checkLiteralCode(code->element.data, &func, &in_protect, env)) {
  119. /* 字面量执行 */
  120. if (in_protect)
  121. var = findVarFromVarSpace(func, env->activity->belong, env->core->protect);
  122. else
  123. var = findVarFromVarList(func, env->activity->belong, env->activity->vsl);
  124. if (var == NULL) {
  125. pushMessageDown(makeERRORMessageFormat(LITERAL_ERROR, env, "Literal not found: %s.", code->element.data), env);
  126. return false;
  127. }
  128. return pushLiteralActivity(code, code->element.data, var->vn->obj, env);
  129. }
  130. /* 变量执行 */
  131. var = findVarFromVarList(code->element.data, env->activity->belong, env->activity->vsl);
  132. if (var == NULL) {
  133. pushMessageDown(makeERRORMessageFormat(VARIABLE_ERROR, env, "Variable not found: %s.", code->element.data), env);
  134. return false;
  135. }
  136. af_Object *obj = var->vn->obj;
  137. obj_isObjFunc *is_obj;
  138. obj_isInfixFunc *is_infix;
  139. if (code->prefix != getPrefix(E_QUOTE, env)) {
  140. if ((is_obj = findAPI("obj_isObjFunc", obj->data->api)) != NULL && is_obj(obj))
  141. return pushVariableActivity(code, var->vn->obj, env); // 对象函数
  142. else if (env->activity->status != act_func_get && // 在act_func_get 模式下不检查是否为is_infix函数 因为本来就要将其作为函数调用
  143. (is_infix = findAPI("obj_isInfixFunc", obj->data->api)) != NULL && is_infix(obj)) {
  144. pushMessageDown(makeERRORMessageFormat(INFIX_PROTECT, env,
  145. "Infix protect variable: %s.", code->element.data), env);
  146. return false;
  147. }
  148. }
  149. pushMessageDown(makeNORMALMessage(obj), env);
  150. setActivityBtNext(env->activity->bt_next->next, env->activity);
  151. printf("Get Variable %s : %p\n", code->element.data, obj);
  152. return false;
  153. }
  154. /*
  155. * 函数名: codeBlock
  156. * 目标: 执行括号语法 (顺序执行, 函数调用)
  157. * 返回-false 表示执行错误 (msg_down中写入消息)
  158. * 返回-true 表示执行成功 (msg_down中无消息写入, 函数仅设置activity无实质性代码执行)
  159. */
  160. static bool codeBlock(af_Code *code, af_Environment *env) {
  161. if (code->prefix == getPrefix(B_EXEC, env) && code->block.type == parentheses) // 顺序执行, 返回尾项
  162. return pushExecutionActivity(code, false, env);
  163. else if (code->prefix == getPrefix(B_EXEC_FIRST, env) && code->block.type == brackets) // 顺序执行, 返回首项
  164. return pushExecutionActivity(code, true, env);
  165. else
  166. return pushFuncActivity(env->activity->bt_next, env);
  167. }
  168. /*
  169. * 函数名: getTopMsg
  170. * 目标: 获取msg_down顶层信息, 若没有则产生错误
  171. */
  172. static af_Message *getTopMsg(af_Environment *env) {
  173. if (env->activity->msg_down == NULL) // 若未获得 msg
  174. return makeERRORMessage(RUN_ERROR, NOT_MSG_INFO, env);
  175. else
  176. return getFirstMessage(env);
  177. }
  178. /*
  179. * 函数名: checkMsg
  180. * 目标: 检查msg是否为NORMAL, 并且检查该信号是否可被处理
  181. * 返回- (1) 正常
  182. * 返回- (0) 不可处理的信号
  183. * 返回-(-1) 非正常但通过msg_type判断为可被处理的信号
  184. */
  185. static int checkMsg(af_Message *msg, af_Environment *env) {
  186. if (EQ_STR(msg->type, "NORMAL"))
  187. return 1; // 正常
  188. pushMessageDown(msg, env); // msg不弹出
  189. if (env->activity->status != act_func_normal || !checkInMsgType(msg->type, env)) { // 非normal模式, 或normal模式下msg_type不匹配该msg
  190. env->activity->return_first = false;
  191. env->activity->return_obj = NULL;
  192. return 0;
  193. }
  194. return -1; // 遇到非normal, 但继续运行
  195. }
  196. /*
  197. * 函数名: checkNormalEnd
  198. * 目标: 检查act_normal是否运行到结尾 (若运行到结尾则返回true, 否则返回false)
  199. */
  200. bool checkNormalEnd(af_Message *msg, af_Environment *env) {
  201. if (env->activity->bt_next == NULL) {
  202. if (env->activity->type == act_top || env->activity->type == act_top_import) {
  203. pushMessageDown(msg, env);
  204. return true;
  205. } else if (setFuncActivityToNormal(env) == 0) { // 已经没有下一步了
  206. if (msg == NULL) { // msg 得不到处理
  207. pushMessageDown(makeERRORMessage(RUN_ERROR, NOT_NORMAL_MSG_INFO, env), env);
  208. return true;
  209. }
  210. switch (checkMacro(msg, env)) {
  211. case 0:
  212. return true; // 错误
  213. case 1:
  214. return false; // 宏函数
  215. case -1:
  216. default:
  217. break; // 非宏函数
  218. }
  219. checkLiteral(&msg, env); // 检查是否字面量
  220. pushMessageDown(msg, env);
  221. return true;
  222. } else if (msg != NULL) {
  223. gc_delReference(*(af_Object **) (msg->msg)); // msg->msg是一个指针, 这个指针的内容是一个af_Object *
  224. freeMessage(msg);
  225. }
  226. } else if (msg != NULL) {
  227. if (env->activity->bt_next->type == code_block && env->activity->bt_next->block.type == parentheses &&
  228. env->activity->bt_next->prefix != getPrefix(B_EXEC, env)) {
  229. env->activity->parentheses_call = *(af_Object **) (msg->msg); // 类前缀调用
  230. }
  231. gc_delReference(*(af_Object **)(msg->msg)); // msg->msg是一个指针, 这个指针的内容是一个af_Object *
  232. freeMessage(msg);
  233. }
  234. return false;
  235. }
  236. /*
  237. * 函数名: checkGetArgEnd
  238. * 目标: 检查act_arg是否运行到结尾 (若运行到结尾则返回true, 否则返回false)
  239. */
  240. static bool checkGetArgEnd(af_Message *msg, af_Environment *env) {
  241. env->activity->acl_done->result = *(af_Object **)(msg->msg);
  242. freeMessage(msg);
  243. if (env->activity->acl_done->next == NULL) { // 参数设定结束
  244. setArgCodeListToActivity(NULL, env);
  245. return true;
  246. }
  247. env->activity->acl_done = env->activity->acl_done->next;
  248. setArgCodeListToActivity(env->activity->acl_done, env);
  249. return false;
  250. }
  251. static bool checkStop(af_Environment *env) {
  252. if (env->core->status == core_stop || env->core->status == core_exit) {
  253. while (env->activity->type != act_top || env->activity->prev != NULL)
  254. popActivity(false, NULL, env); // is_normal=false, 非正常退出, 释放mark
  255. popActivity(false, NULL, env); // 再释放 act_top
  256. return true;
  257. }
  258. return false;
  259. }
  260. /*
  261. * 函数名: iterCode
  262. * 目标: 运行代码 (代码可通过code参数传入, 或通过env->activity传入)
  263. * 注意: 曾为缩短改函数而将该函数的内容进行大量的封装
  264. * 但实际上, 这个函数各个部分的关联性是很强的
  265. * 因此, 取消了封装, 反而提高了代码的可读性
  266. *
  267. * 因为该函数的大部分内容运行在循环中, 因此使用continue表示不在运行后面的代码
  268. */
  269. bool iterCode(af_Code *code, af_Environment *env){
  270. if (!iterCodeInit(code, env))
  271. return false;
  272. /*
  273. * 问题: 如何确保循环跳出之前, top-Activity已经被pop。(即执行释放)
  274. * 为什么会有这个问题: top-Activity只有在bt_next=NULL时被pop, 而循环也是在bt_next=NULL时可能被退出
  275. * 如此以来就可能导致在pop之前循环就退出了
  276. * 实际上并不会发生。
  277. * bt_next设定后,会出现两种情况: 一是马上检查bt_next, 而是设定了pass
  278. * 设定了pass是意味着压入新的activity。当新的activity被返回时, 必定设置了process_msg_first
  279. * 而process_msg_first时, 也会检查bt_next
  280. *
  281. * 【run-code设置了bt_next】 -> 检查bt_next并可能做pop处理 -> while循环检查bt_next [例如变量访问语句]
  282. * 【run-code设置了bt_next】 -> 压入了新的activity -> while循环检查 和一系列运行
  283. * -> 新activity返回, 设定process_msg_first -> while循环检查 (因为process_msg_first, 所以不会跳出循环)
  284. * -> process_msg_first会处理msg, 检查bt_next.
  285. *
  286. * popActivity会是一定会设置process_msg_first, 除了gc机制。
  287. * 而gc机制前后, bt_next不会改变,这意味着如果gc之后while循环就会被跳出, 那么gc之前while循环早就跳出了
  288. */
  289. /* 必须位于act_top, 且无next, 并且无msg处理才退出执行 */
  290. while (env->activity->type != act_top || env->activity->bt_next != NULL || env->activity->process_msg_first != 0) {
  291. /* 检查是否需要退出执行 */
  292. if (checkStop(env))
  293. return false;
  294. /* 检查gc机制 */
  295. checkRunGC(env);
  296. if (env->activity->type == act_gc) {
  297. if (env->activity->dl_next == NULL)
  298. popActivity(true, NULL, env); // 结束运行
  299. else
  300. pushDestructActivity(env->activity->dl_next, env);
  301. continue;
  302. }
  303. /* 切换执行的var_list */
  304. if (env->activity->type == act_func && env->activity->status == act_func_arg &&
  305. env->activity->run_in_func && env->activity->func_var_list != NULL)
  306. env->activity->vsl = env->activity->func_var_list;
  307. else
  308. env->activity->vsl = env->activity->var_list;
  309. /* 无代码运行 */
  310. if (env->activity->bt_next == NULL && env->activity->process_msg_first == 0) { // 无代码运行, 并且非msg_first
  311. switch (env->activity->status) {
  312. case act_func_get:
  313. case act_func_normal:
  314. popActivity(false, makeERRORMessage(RUN_ERROR, NOT_CODE_INFO, env), env);
  315. break;
  316. case act_func_arg: // 无参数设定
  317. if (!setFuncActivityAddVar(env))
  318. popActivity(false, NULL, env);
  319. break;
  320. default:
  321. break;
  322. }
  323. continue; // 后面的代码不再运行
  324. }
  325. /* 有代码运行 */
  326. bool pass_msg = false; // 表示不处理msg
  327. if (env->activity->process_msg_first == 0) { /* 运行实际代码 */
  328. switch (env->activity->bt_next->type) {
  329. case code_element:
  330. if (codeElement(env->activity->bt_next, env))
  331. pass_msg = true;
  332. break;
  333. case code_block:
  334. if (codeBlock(env->activity->bt_next, env))
  335. pass_msg = true; // 若运行成功则跳转到下一次运行, 该步骤仅为设置Activity
  336. break;
  337. default:
  338. break;
  339. }
  340. } else
  341. env->activity->process_msg_first--;
  342. if (pass_msg)
  343. continue; // 后面的代码不再运行
  344. /* 处理msg */
  345. af_Message *msg = getTopMsg(env);
  346. switch (checkMsg(msg, env)) {
  347. case 0: // 不可处理的信号
  348. popActivity(false, NULL, env); // 跳出当前activity
  349. continue; // 下面的代码不再执行
  350. case 1: // 正常信号
  351. if (env->activity->return_first && env->activity->return_obj == NULL) // 设置return_first
  352. env->activity->return_obj = *(af_Object **)msg->msg;
  353. break;
  354. case -1: // 非正常但可处理 [已经放回]
  355. default:
  356. assert(env->activity->status == act_func_normal);
  357. break;
  358. }
  359. switch (env->activity->status) {
  360. case act_func_normal: // 需要考虑 msg == NULL
  361. if (checkNormalEnd(msg, env))
  362. popActivity(true, NULL, env); // 正常退出
  363. break;
  364. case act_func_get: {
  365. af_Object *func = *(af_Object **) (msg->msg); // func仍保留了msg的gc计数
  366. gc_delReference(func); // 释放计数
  367. freeMessage(msg);
  368. if (!setFuncActivityToArg(func, env))
  369. popActivity(false, NULL, env);
  370. break;
  371. }
  372. case act_func_arg: {
  373. if (checkGetArgEnd(msg, env)) { // 参数设定完成
  374. if (!setFuncActivityAddVar(env))
  375. popActivity(false, NULL, env);
  376. }
  377. break;
  378. }
  379. default:
  380. break;
  381. }
  382. }
  383. return true;
  384. }
  385. /*
  386. * 函数名: iterDestruct
  387. * 目标: 对所有ObjectData执行析构函数
  388. * 会循环不断检测是否有新增ObjectData并且需要析构
  389. * deep - 表示最大迭代深度 (设置为0表示不限制)
  390. */
  391. bool iterDestruct(int deep, af_Environment *env) {
  392. for (int count = 0; deep == 0 || deep > count; count++) {
  393. gc_DestructList *dl = NULL;
  394. pgc_DestructList pdl = &dl;
  395. pdl = checkAllDestruct(env, pdl);
  396. if (dl == NULL)
  397. return true;
  398. pushGCActivity(dl, pdl, env);
  399. if (!iterCode(NULL, env))
  400. return false;
  401. }
  402. return false;
  403. }