run.c 16 KB

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