run.c 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. #include "__run.h"
  2. /**
  3. * 运行单个statement
  4. * @param st
  5. * @param inter
  6. * @param var_list
  7. * @return
  8. */
  9. ResultType runStatement(INTER_FUNCTIONSIG) {
  10. setResultCore(result);
  11. ResultType type = not_return;
  12. switch (st->type) {
  13. case base_value:
  14. type = getBaseValue(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  15. break;
  16. case base_var:
  17. type = getVar(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong), getBaseVarInfo);
  18. break;
  19. case base_svar:
  20. type = getVar(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong), getBaseSVarInfo);
  21. break;
  22. case base_list:
  23. type = getList(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  24. break;
  25. case base_dict:
  26. type = getDict(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  27. break;
  28. case base_lambda:
  29. type = setLambda(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  30. break;
  31. case operation:
  32. type = operationStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  33. break;
  34. case set_class:
  35. type = setClass(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  36. break;
  37. case set_function:
  38. type = setFunction(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  39. break;
  40. case slice_:
  41. type = elementSlice(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  42. break;
  43. case call_function:
  44. type = callBack(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  45. break;
  46. case if_branch:
  47. type = ifBranch(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  48. break;
  49. case while_branch:
  50. type = whileBranch(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  51. break;
  52. case for_branch:
  53. type = forBranch(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  54. break;
  55. case with_branch:
  56. type = withBranch(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  57. break;
  58. case try_branch:
  59. type = tryBranch(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  60. break;
  61. case break_cycle:
  62. type = breakCycle(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  63. break;
  64. case continue_cycle:
  65. type = continueCycle(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  66. break;
  67. case rego_if:
  68. type = regoIf(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  69. break;
  70. case restart:
  71. type = restartCode(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  72. break;
  73. case return_code:
  74. type = returnCode(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  75. break;
  76. case yield_code:
  77. type = yieldCode(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  78. break;
  79. case raise_code:
  80. type = raiseCode(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  81. break;
  82. case include_file:
  83. type = includeFile(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  84. break;
  85. case import_file:
  86. type = importFile(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  87. break;
  88. case from_import_file:
  89. type = fromImportFile(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  90. break;
  91. case default_var:
  92. type = setDefault(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  93. break;
  94. case assert:
  95. type = assertCode(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  96. break;
  97. case goto_:
  98. type = gotoLabel(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  99. break;
  100. default:
  101. setResult(result, inter, belong);
  102. break;
  103. }
  104. if (run_continue_type(type) && result->value->aut == auto_aut)
  105. result->value->aut = st->aut;
  106. result->node = st;
  107. gc_run(inter, var_list, 1, 0, 0, var_list);
  108. return type;
  109. }
  110. /**
  111. * 局部程序运行statement
  112. * @param st
  113. * @param inter
  114. * @param var_list
  115. * @return
  116. */
  117. ResultType iterStatement(INTER_FUNCTIONSIG) {
  118. Statement *base_st = NULL;
  119. ResultType type;
  120. setResultCore(result);
  121. if (st == NULL){
  122. setResult(result, inter, belong);
  123. return result->type;
  124. }
  125. do {
  126. for (base_st = st; base_st != NULL; PASS) {
  127. freeResult(result);
  128. type = runStatement(CALL_INTER_FUNCTIONSIG(base_st, var_list, result, belong));
  129. if (type == goto_return && result->times == 0){
  130. Statement *label_st = checkLabel(st, result->label);
  131. if (label_st == NULL){
  132. setResultErrorSt(result, inter, "GotoException", "Don't find label", st, belong, true);
  133. type = error_return;
  134. break;
  135. }
  136. type = runLabel(CALL_INTER_FUNCTIONSIG(label_st, var_list, result, belong));
  137. if (!run_continue_type(type))
  138. break;
  139. base_st = label_st->next;
  140. }
  141. else if (!run_continue_type(type))
  142. break;
  143. else
  144. base_st = base_st->next;
  145. }
  146. } while (type == restart_return && result->times == 0);
  147. if (type == not_return || type == restart_return)
  148. setResultOperationNone(result, inter, belong);
  149. result->node = base_st;
  150. gc_run(inter, var_list, 1, 0, 0, var_list);
  151. return result->type;
  152. }
  153. /**
  154. * 全局程序运行statement
  155. * @param inter
  156. * @return
  157. */
  158. ResultType globalIterStatement(Result *result, Inter *inter, Statement *st) {
  159. LinkValue *belong = inter->base_father;
  160. gc_addTmpLink(&belong->gc_status);
  161. Statement *base_st = NULL;
  162. VarList *var_list = NULL;
  163. enum ResultType type;
  164. do {
  165. for (base_st = st, var_list = inter->var_list; base_st != NULL; PASS) {
  166. freeResult(result);
  167. type = runStatement(CALL_INTER_FUNCTIONSIG(base_st, var_list, result, belong));
  168. if (type == goto_return){
  169. Statement *label_st = checkLabel(st, result->label);
  170. if (label_st == NULL){
  171. setResultErrorSt(result, inter, "GotoException", "Don't find label", st, belong, true);
  172. type = error_return;
  173. break;
  174. }
  175. type = runLabel(CALL_INTER_FUNCTIONSIG(label_st, var_list, result, belong));
  176. if (!run_continue_type(type))
  177. break;
  178. base_st = label_st->next;
  179. }
  180. else if (!run_continue_type(type))
  181. break;
  182. else
  183. base_st = base_st->next;
  184. }
  185. } while (type == restart_return && result->times == 0);
  186. if (type != error_return && type != function_return)
  187. setResultOperationNone(result, inter, belong);
  188. result->node = base_st;
  189. gc_freeTmpLink(&belong->gc_status);
  190. gc_run(inter, var_list, 1, 0, 0, var_list);
  191. return result->type;
  192. }
  193. // 若需要中断执行, 则返回true
  194. bool operationSafeInterStatement(INTER_FUNCTIONSIG){
  195. ResultType type;
  196. type = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  197. if (run_continue_type(type))
  198. return false;
  199. else if (type != return_code && type != error_return)
  200. setResultErrorSt(result, inter, "ResultException", "Get Not Support Result", st, belong, true);
  201. return true;
  202. }
  203. bool ifBranchSafeInterStatement(INTER_FUNCTIONSIG){
  204. ResultType type;
  205. type = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  206. if (run_continue_type(type))
  207. return false;
  208. if (type == rego_return){
  209. result->times--;
  210. if (result->times < 0)
  211. return false;
  212. }
  213. if (type == restart_return || type == goto_return)
  214. result->times--;
  215. return true;
  216. }
  217. bool cycleBranchSafeInterStatement(INTER_FUNCTIONSIG){
  218. ResultType type;
  219. type = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  220. if (run_continue_type(type))
  221. return false;
  222. if (type == break_return || type == continue_return){
  223. result->times--;
  224. if (result->times < 0)
  225. return false;
  226. }
  227. if (type == restart_return || type == goto_return)
  228. result->times--;
  229. return true;
  230. }
  231. bool tryBranchSafeInterStatement(INTER_FUNCTIONSIG){
  232. ResultType type;
  233. type = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  234. if (run_continue_type(type))
  235. return false;
  236. if (type == restart_return || type == goto_return)
  237. result->times--;
  238. return true;
  239. }
  240. bool functionSafeInterStatement(INTER_FUNCTIONSIG){
  241. ResultType type;
  242. type = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  243. if (type == error_return || result->type == yield_return)
  244. return true;
  245. else if (type == function_return)
  246. result->type = operation_return;
  247. else
  248. result->type = not_return;
  249. return false;
  250. }
  251. bool blockSafeInterStatement(INTER_FUNCTIONSIG){
  252. ResultType type;
  253. type = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  254. if (type == error_return || type == yield_return)
  255. return true;
  256. result->type = operation_return;
  257. return false;
  258. }
  259. Statement *checkLabel(Statement *base, char *label){
  260. for (PASS; base != NULL; base = base->next)
  261. if (base->type == label_ && eqString(base->u.label_.label, label))
  262. return base;
  263. return NULL;
  264. }