run.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538
  1. #include "aFunCore.hpp"
  2. #include "__run.hpp"
  3. #include "__env.hpp"
  4. /* 工具函数: 初始化类型 */
  5. static bool iterCodeInit(af_Code *code, int mode, af_Environment *env);
  6. /* 工具函数: Message类函数 */
  7. static af_Message *getTopMsg(af_Environment *env);
  8. /* 工具函数: 检查类型 */
  9. static bool checkInMsgType(char *type, af_Environment *env);
  10. static bool checkLiteral(af_Message **msg, af_Environment *env);
  11. static int checkMacro(af_Message *msg, af_Environment *env);
  12. static int checkMsg(af_Message *msg, af_Environment *env);
  13. bool checkNormalEnd(af_Message *msg, af_Environment *env);
  14. static bool checkGetArgEnd(af_Message *msg, af_Environment *env);
  15. static bool checkStop(af_Environment *env);
  16. /* Code 执行函数 */
  17. static bool codeElement(af_Code *code, af_Environment *env);
  18. static bool codeBlock(af_Code *code, af_Environment *env);
  19. static bool runGuardian(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 == nullptr || env->activity->body_next->msg_type == nullptr)
  26. return false;
  27. for (char *msg_type_node = *env->activity->body_next->msg_type; msg_type_node != nullptr; 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) == nullptr || !EQ_STR((*msg)->type, "NORMAL")) // (*msg)非正常值
  41. return false;
  42. af_Object *obj = *(af_Object **)((*msg)->msg);
  43. auto func = (obj_literalSetting *)findAPI("obj_literalSetting", getObjectAPI(obj));
  44. if (func == nullptr) {
  45. gc_delObjectReference(obj, env);
  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 != nullptr; ld = ld->next)
  51. func(getObjectID(obj), obj, getObjectData(obj), ld->literal_data, env);
  52. freeAllLiteralData(env->activity->ld);
  53. env->activity->ld = nullptr;
  54. env->activity->is_literal = false;
  55. writeTrackLog(aFunCoreLogger, "Literal %p", 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 == nullptr || !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_delObjectReference(obj, env);
  74. freeMessage(msg);
  75. if (re)
  76. return 1;
  77. return 0;
  78. }
  79. /*
  80. * 函数名: iterCodeInit
  81. * 目标: 初始化activity和environment (若environment中未存在activity则通过code新增一个TopActivity, 否则沿用原activity)
  82. *
  83. * mode 标识运行模式
  84. * 0. 在top运行
  85. * 1. 在import运行
  86. * 2. 直接运行
  87. * 3. gc模式
  88. */
  89. static bool iterCodeInit(af_Code *code, int mode, af_Environment *env) {
  90. if (env == nullptr || pthread_mutex_trylock(&env->in_run) != 0)
  91. return false;
  92. if (env->activity == nullptr) {
  93. pthread_mutex_unlock(&env->in_run);
  94. return false;
  95. }
  96. switch (mode) {
  97. case 0:
  98. if (env->activity->type != act_top || !codeSemanticCheck(code))
  99. return false;
  100. setActivityBtTop(nullptr, env->activity); // 直接就在NORMAL期, bt_top不被设定
  101. setActivityBtStart(code, env->activity);
  102. break;
  103. case 1: {
  104. if (env->activity->type != act_top)
  105. return false;
  106. env->activity->file = strCopy("top.aun.sys");
  107. char *name = getFileName(code->path);
  108. pushImportActivity(code, nullptr, name, env);
  109. free(name);
  110. break;
  111. }
  112. case 2:
  113. if (env->activity->prev == nullptr || env->activity->prev->type != act_top)
  114. return false;
  115. env->activity->file = strCopy("top-gc.aun.sys");
  116. if (env->activity->type == act_guardian || !codeSemanticCheck(env->activity->bt_start) || env->activity->bt_next == nullptr || code != nullptr)
  117. return false;
  118. break;
  119. case 3:
  120. pthread_mutex_lock(&env->status_lock);
  121. env->status = core_normal_gc;
  122. pthread_mutex_unlock(&env->status_lock);
  123. if (env->activity->type != act_guardian || code != nullptr)
  124. return false;
  125. break;
  126. default:
  127. return false;
  128. }
  129. return true;
  130. }
  131. /*
  132. * 函数名: codeElement
  133. * 目标: 执行变量访问或字面量生成 (设置bt_next)
  134. * (1) 执行字面量生成代码 (设置bt_next)
  135. * 返回-false 表示执行错误 (msg_down中写入消息)
  136. * 返回-true 表示执行成功 (msg_down中无消息写入, 函数仅设置activity无实质性代码执行)
  137. * (2) 执行变量访问代码:
  138. * 返回-false 表示执行失败, 或执行成功得到一个变量值 (msg_down中写入消息)
  139. * 返回-true 表示执行成功, 得到一个对象函数, 并且隐式调用 (msg_down中无消息写入, 函数仅设置activity无实质性代码执行)
  140. */
  141. static bool codeElement(af_Code *code, af_Environment *env) {
  142. bool in_protect;
  143. char *func;
  144. af_Var *var;
  145. if (checkLiteralCode(code->element.data, &func, &in_protect, env)) {
  146. /* 字面量执行 */
  147. if (in_protect)
  148. var = findVarFromVarSpace(func, env->activity->belong, env->protect);
  149. else
  150. var = findVarFromVarList(func, env->activity->belong, env->activity->run_varlist);
  151. if (var == nullptr) {
  152. pushMessageDown(makeERRORMessageFormat(LITERAL_ERROR, env, "Literal not found: %s: %s.", code->element.data, func), env);
  153. return false;
  154. }
  155. af_Object *obj = findVarNode(var, nullptr, env);
  156. writeTrackLog(aFunCoreLogger, "Get literal %s : %p", code->element.data, obj);
  157. bool res = pushLiteralActivity(code, code->element.data, obj, env);
  158. gc_delObjectReference(obj, env);
  159. return res;
  160. }
  161. /* 变量执行 */
  162. var = findVarFromVarList(code->element.data, env->activity->belong, env->activity->run_varlist);
  163. if (var == nullptr) {
  164. pushMessageDown(makeERRORMessageFormat(VARIABLE_ERROR, env, "Variable not found: %s.", code->element.data), env);
  165. return false;
  166. }
  167. af_Object *obj = findVarNode(var, nullptr, env);
  168. obj_isObjFunc *is_obj;
  169. obj_isInfixFunc *is_infix;
  170. if (code->prefix != getPrefix(E_QUOTE, env)) {
  171. af_ObjectAPI *api = getObjectAPI(obj);
  172. const char *id = getObjectID(obj);
  173. if ((is_obj = (obj_isObjFunc *)findAPI("obj_isObjFunc", api)) != nullptr && is_obj(id, obj)) {
  174. bool res = pushVariableActivity(code, obj, env); // 对象函数
  175. gc_delObjectReference(obj, env);
  176. return res;
  177. } else if (env->activity->status != act_func_get && // 在act_func_get 模式下不检查是否为is_infix函数 因为本来就要将其作为函数调用
  178. (is_infix = (obj_isInfixFunc *)findAPI("obj_isInfixFunc", api)) != nullptr && is_infix(id, obj)) {
  179. pushMessageDown(makeERRORMessageFormat(INFIX_PROTECT, env,
  180. "Infix protect variable: %s.", code->element.data), env);
  181. gc_delObjectReference(obj, env);
  182. return false;
  183. }
  184. }
  185. pushMessageDown(makeNORMALMessage(obj, env), env);
  186. setActivityBtNext(env->activity->bt_next->next, env->activity);
  187. writeTrackLog(aFunCoreLogger, "Get variable %s : %p", code->element.data, obj);
  188. return false;
  189. }
  190. /*
  191. * 函数名: codeBlock
  192. * 目标: 执行括号语法 (顺序执行, 函数调用)
  193. * 返回-false 表示执行错误 (msg_down中写入消息)
  194. * 返回-true 表示执行成功 (msg_down中无消息写入, 函数仅设置activity无实质性代码执行)
  195. */
  196. static bool codeBlock(af_Code *code, af_Environment *env) {
  197. if (code->prefix == getPrefix(B_EXEC, env) && code->block.type == parentheses) // 顺序执行, 返回尾项
  198. return pushExecutionActivity(code, false, env);
  199. else if (code->prefix == getPrefix(B_EXEC_FIRST, env) && code->block.type == brackets) // 顺序执行, 返回首项
  200. return pushExecutionActivity(code, true, env);
  201. else
  202. return pushFuncActivity(env->activity->bt_next, env);
  203. }
  204. static bool runGuardian(af_Environment *env) {
  205. af_GuardianList *gl = nullptr;
  206. af_GuardianList **pgl = ≷
  207. for (af_Guardian *gd = env->guardian; gd != nullptr; gd = gd->next) {
  208. if (gd->always || !env->activity->is_guard) { // guardian被标记为一直执行, 或者非is_guard模式
  209. af_GuardianList *new_gl = GET_SYMBOL(gd->func)(gd->type, env->activity->is_guard, gd->data, env);
  210. if (new_gl != nullptr)
  211. pgl = contectGuardianList(new_gl, pgl);
  212. }
  213. }
  214. if (gl != nullptr) {
  215. env->activity->process_msg_first++; // guardian开始处理时, 已经在原activity中有msg了, 所以要先处理
  216. pushGuardianActivity(gl, pgl, env);
  217. return true;
  218. }
  219. return false;
  220. }
  221. /*
  222. * 函数名: getTopMsg
  223. * 目标: 获取msg_down顶层信息, 若没有则产生错误
  224. */
  225. static af_Message *getTopMsg(af_Environment *env) {
  226. if (env->activity->msg_down == nullptr) // 若未获得 msg
  227. return makeERRORMessage(RUN_ERROR, NOT_MSG_INFO, env);
  228. else
  229. return getFirstMessage(env);
  230. }
  231. /*
  232. * 函数名: checkMsg
  233. * 目标: 检查msg是否为NORMAL, 并且检查该信号是否可被处理
  234. * 返回- (1) 正常
  235. * 返回- (0) 不可处理的信号
  236. * 返回-(-1) 非正常但通过msg_type判断为可被处理的信号
  237. */
  238. static int checkMsg(af_Message *msg, af_Environment *env) {
  239. if (EQ_STR(msg->type, "NORMAL"))
  240. return 1; // 正常
  241. pushMessageDown(msg, env); // msg不弹出
  242. if (env->activity->status != act_func_normal || !checkInMsgType(msg->type, env)) { // 非normal模式, 或normal模式下msg_type不匹配该msg
  243. env->activity->return_first = false;
  244. pthread_mutex_lock(env->activity->gc_lock);
  245. env->activity->return_obj = nullptr;
  246. pthread_mutex_unlock(env->activity->gc_lock);
  247. return 0;
  248. }
  249. return -1; // 遇到非normal, 但继续运行
  250. }
  251. /*
  252. * 函数名: checkNormalEnd
  253. * 目标: 检查act_normal是否运行到结尾 (若运行到结尾则返回true, 否则返回false)
  254. */
  255. bool checkNormalEnd(af_Message *msg, af_Environment *env) {
  256. if (env->activity->bt_next == nullptr) {
  257. if (env->activity->type == act_top || env->activity->type == act_top_import) {
  258. pushMessageDown(msg, env);
  259. return true;
  260. } else if (setFuncActivityToNormal(env) == 0) { // 已经没有下一步了
  261. if (msg == nullptr) { // msg 得不到处理
  262. pushMessageDown(makeERRORMessage(RUN_ERROR, NOT_NORMAL_MSG_INFO, env), env);
  263. return true;
  264. }
  265. switch (checkMacro(msg, env)) {
  266. case 0:
  267. return true; // 错误
  268. case 1:
  269. return false; // 宏函数
  270. case -1:
  271. default:
  272. break; // 非宏函数
  273. }
  274. checkLiteral(&msg, env); // 检查是否字面量
  275. pushMessageDown(msg, env);
  276. return true;
  277. } else if (msg != nullptr) {
  278. gc_delObjectReference(*(af_Object **) (msg->msg), env); // msg->msg是一个指针, 这个指针的内容是一个af_Object *
  279. freeMessage(msg);
  280. }
  281. } else if (msg != nullptr) {
  282. if (env->activity->bt_next->type == code_block && env->activity->bt_next->block.type == parentheses &&
  283. env->activity->bt_next->prefix != getPrefix(B_EXEC, env)) {
  284. pthread_mutex_lock(env->activity->gc_lock);
  285. env->activity->parentheses_call = *(af_Object **) (msg->msg); // 类前缀调用
  286. pthread_mutex_unlock(env->activity->gc_lock);
  287. }
  288. gc_delObjectReference(*(af_Object **)(msg->msg), env); // msg->msg是一个指针, 这个指针的内容是一个af_Object *
  289. freeMessage(msg);
  290. }
  291. return false;
  292. }
  293. /*
  294. * 函数名: checkGetArgEnd
  295. * 目标: 检查act_arg是否运行到结尾 (若运行到结尾则返回true, 否则返回false)
  296. */
  297. static bool checkGetArgEnd(af_Message *msg, af_Environment *env) {
  298. env->activity->acl_done->result = *(af_Object **)(msg->msg); // 保持 gc 引用计数
  299. freeMessage(msg);
  300. if (env->activity->acl_done->next == nullptr) { // 参数设定结束
  301. setArgCodeListToActivity(nullptr, env);
  302. return true;
  303. }
  304. env->activity->acl_done = env->activity->acl_done->next;
  305. setArgCodeListToActivity(env->activity->acl_done, env);
  306. return false;
  307. }
  308. static bool checkStop(af_Environment *env) {
  309. enum af_CoreStatus status = getCoreStatus(env);
  310. if (status == core_stop || status == core_exit) {
  311. while (env->activity->type != act_top || env->activity->prev != nullptr)
  312. popActivity(false, nullptr, env); // is_normal=false, 非正常退出, 释放mark
  313. popActivity(false, nullptr, env); // 再释放 act_top
  314. return true;
  315. }
  316. return false;
  317. }
  318. /*
  319. * 函数名: iterCode
  320. * 目标: 运行代码 (代码可通过code参数传入, 或通过env->activity传入)
  321. * 注意: 曾为缩短改函数而将该函数的内容进行大量的封装
  322. * 但实际上, 这个函数各个部分的关联性是很强的
  323. * 因此, 取消了封装, 反而提高了代码的可读性
  324. *
  325. * 因为该函数的大部分内容运行在循环中, 因此使用continue表示不在运行后面的代码
  326. */
  327. bool iterCode(af_Code *code, int mode, af_Environment *env){
  328. if (!iterCodeInit(code, mode, env))
  329. return false;
  330. bool re = true;
  331. makeMonitor(env); // 启动监视线程
  332. /*
  333. * 问题: 如何确保循环跳出之前, top-Activity已经被pop。(即执行释放)
  334. * 为什么会有这个问题: top-Activity只有在bt_next=nullptr时被pop, 而循环也是在bt_next=nullptr时可能被退出
  335. * 如此以来就可能导致在pop之前循环就退出了
  336. * 实际上并不会发生。
  337. * bt_next设定后,会出现两种情况: 一是马上检查bt_next, 而是设定了pass
  338. * 设定了pass是意味着压入新的activity。当新的activity被返回时, 必定设置了process_msg_first
  339. * 而process_msg_first时, 也会检查bt_next
  340. *
  341. * 【run-code设置了bt_next】 -> 检查bt_next并可能做pop处理 -> while循环检查bt_next [例如变量访问语句]
  342. * 【run-code设置了bt_next】 -> 压入了新的activity -> while循环检查 和一系列运行
  343. * -> 新activity返回, 设定process_msg_first -> while循环检查 (因为process_msg_first, 所以不会跳出循环)
  344. * -> process_msg_first会处理msg, 检查bt_next.
  345. *
  346. * popActivity会是一定会设置process_msg_first, 除了gc机制。
  347. * 而gc机制前后, bt_next不会改变,这意味着如果gc之后while循环就会被跳出, 那么gc之前while循环早就跳出了
  348. */
  349. /* 必须位于act_top, 且无next, 并且无msg处理才退出执行 */
  350. while (env->activity->type != act_top || env->activity->bt_next != nullptr || env->activity->process_msg_first != 0) {
  351. /* 检查是否需要退出执行 */
  352. if (checkStop(env)) {
  353. re = false;
  354. goto RETURN;
  355. }
  356. if (env->activity->type == act_guardian) {
  357. if (env->activity->gl_next == nullptr) {
  358. popActivity(true, nullptr, env); // 结束运行
  359. if (mode == 3) // mode = 3, 表示只运行守护器
  360. break;
  361. } else
  362. pushGuadianFuncActivity(env->activity->gl_next, env);
  363. continue;
  364. }
  365. /* 切换执行的 var_list */
  366. pthread_mutex_lock(env->activity->gc_lock);
  367. if (env->activity->type == act_func && env->activity->status == act_func_arg) {
  368. if (env->activity->run_in_func && env->activity->func_varlist != nullptr)
  369. env->activity->run_varlist = env->activity->func_varlist;
  370. else
  371. env->activity->run_varlist = env->activity->out_varlist;
  372. env->activity->count_run_varlist = 0;
  373. } else if (env->activity->type == act_func && env->activity->status == act_func_get) {
  374. env->activity->run_varlist = env->activity->out_varlist;
  375. env->activity->count_run_varlist = 0;
  376. }
  377. pthread_mutex_unlock(env->activity->gc_lock);
  378. /* 无代码运行 */
  379. if (env->activity->bt_next == nullptr && env->activity->process_msg_first == 0) { // 无代码运行, 并且非msg_first
  380. switch (env->activity->status) {
  381. case act_func_get:
  382. case act_func_normal:
  383. popActivity(false, makeERRORMessage(RUN_ERROR, NOT_CODE_INFO, env), env);
  384. break;
  385. case act_func_arg: // 无参数设定
  386. if (!setFuncActivityAddVar(env))
  387. popActivity(false, nullptr, env);
  388. break;
  389. default:
  390. break;
  391. }
  392. continue; // 后面的代码不再运行
  393. }
  394. /* 有代码运行 */
  395. bool pass_msg = false; // 表示不处理msg
  396. if (env->activity->process_msg_first == 0) { /* 运行实际代码 */
  397. env->activity->bt_done = env->activity->bt_next;
  398. switch (env->activity->bt_done->type) {
  399. case code_element:
  400. if (codeElement(env->activity->bt_done, env))
  401. pass_msg = true;
  402. break;
  403. case code_block:
  404. if (codeBlock(env->activity->bt_done, env))
  405. pass_msg = true; // 若运行成功则跳转到下一次运行, 该步骤仅为设置Activity
  406. break;
  407. default:
  408. break;
  409. }
  410. } else
  411. env->activity->process_msg_first--;
  412. if (pass_msg)
  413. continue; // 后面的代码不再运行
  414. /* 执行守护器 */
  415. if (runGuardian(env))
  416. continue; // 需要执行守护器
  417. /* 处理msg */
  418. af_Message *msg = getTopMsg(env);
  419. switch (checkMsg(msg, env)) {
  420. case 0: // 不可处理的信号
  421. popActivity(false, nullptr, env); // 跳出当前activity
  422. continue; // 下面的代码不再执行
  423. case 1: // 正常信号
  424. if (env->activity->return_first && env->activity->return_obj == nullptr) { // 设置return_first
  425. pthread_mutex_lock(env->activity->gc_lock);
  426. env->activity->return_obj = *(af_Object **) msg->msg;
  427. pthread_mutex_unlock(env->activity->gc_lock);
  428. }
  429. break;
  430. case -1: // NORMAL模式下, 非正常但可处理 [已经放回]
  431. default:
  432. assertErrorLog(env->activity->status == act_func_normal, aFunCoreLogger, "");
  433. break;
  434. }
  435. switch (env->activity->status) {
  436. case act_func_normal: // 需要考虑 msg == nullptr
  437. if (checkNormalEnd(msg, env))
  438. popActivity(true, nullptr, env); // 正常退出
  439. break;
  440. case act_func_get: {
  441. af_Object *func = *(af_Object **) (msg->msg); // func仍保留了msg的gc计数
  442. if (!setFuncActivityToArg(func, env))
  443. popActivity(false, nullptr, env);
  444. gc_delObjectReference(func, env); // 释放计数 (setFuncActivityToArg 不需要计数)
  445. freeMessage(msg);
  446. break;
  447. }
  448. case act_func_arg: {
  449. if (checkGetArgEnd(msg, env)) { // 参数设定完成
  450. if (!setFuncActivityAddVar(env))
  451. popActivity(false, nullptr, env);
  452. }
  453. break;
  454. }
  455. default:
  456. break;
  457. }
  458. }
  459. RETURN:
  460. pthread_mutex_unlock(&env->in_run);
  461. freeMonitor(env);
  462. return re;
  463. }
  464. /*
  465. * 函数名: iterDestruct
  466. * 目标: 对所有ObjectData执行析构函数
  467. * 会循环不断检测是否有新增ObjectData并且需要析构
  468. * deep - 表示最大迭代深度 (设置为0表示不限制)
  469. */
  470. bool iterDestruct(int deep, af_Environment *env) {
  471. for (int count = 0; deep == 0 || deep > count; count++) {
  472. af_GuardianList *gl = nullptr;
  473. paf_GuardianList pdl = ≷
  474. pdl = checkAllDestruct(env, pdl);
  475. if (gl == nullptr)
  476. return true;
  477. pushGuardianActivity(gl, pdl, env);
  478. if (!iterCode(nullptr, 3, env))
  479. return false;
  480. }
  481. pthread_mutex_lock(&env->status_lock);
  482. env->status = core_exit;
  483. pthread_mutex_unlock(&env->status_lock);
  484. return false;
  485. }