run.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  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_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. bool checkSignal(ResultType *type, fline line, char *file, INTER_FUNCTIONSIG_NOT_ST) {
  111. extern volatile bool is_KeyInterrupt;
  112. if (is_KeyInterrupt){
  113. is_KeyInterrupt = false;
  114. if (type != NULL)
  115. *type = error_return;
  116. setResultError(E_KeyInterrupt, "KeyInterrupt", line, file, true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  117. return true;
  118. }
  119. return false;
  120. }
  121. /**
  122. * 局部程序运行statement
  123. * @param st
  124. * @param inter
  125. * @param var_list
  126. * @return
  127. */
  128. ResultType iterStatement(INTER_FUNCTIONSIG) {
  129. Statement *base;
  130. ResultType type;
  131. setResultCore(result);
  132. if (st == NULL){
  133. setResult(result, inter, belong);
  134. return result->type;
  135. }
  136. do {
  137. base = st;
  138. if (checkSignal(&type, base->line, base->code_file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong)))
  139. break;
  140. while (base != NULL) {
  141. freeResult(result);
  142. type = runStatement(CALL_INTER_FUNCTIONSIG(base, var_list, result, belong));
  143. if (checkSignal(&type, base->line, base->code_file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong)))
  144. break;
  145. if (type == goto_return && result->times == 0){
  146. Statement *label_st = checkLabel(st, result->label);
  147. if (label_st == NULL){
  148. setResultErrorSt(E_GotoException, "Don't find label", true, st, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  149. type = error_return;
  150. break;
  151. }
  152. type = runLabel(CALL_INTER_FUNCTIONSIG(label_st, var_list, result, belong));
  153. if (!RUN_TYPE(type))
  154. break;
  155. base = label_st->next;
  156. }
  157. else if (!RUN_TYPE(type))
  158. break;
  159. else
  160. base = base->next;
  161. }
  162. } while (type == restart_return && result->times == 0);
  163. if (type == not_return || type == restart_return)
  164. setResultOperationNone(result, inter, belong);
  165. result->node = base;
  166. gc_run(inter, var_list, 1, 0, 0, var_list);
  167. return result->type;
  168. }
  169. /**
  170. * 全局程序运行statement
  171. * @param inter
  172. * @return
  173. */
  174. ResultType globalIterStatement(Result *result, Inter *inter, Statement *st) {
  175. ResultType type;
  176. VarList *var_list = NULL;
  177. Statement *base;
  178. LinkValue *belong = inter->base_father;
  179. if (st == NULL){
  180. setResult(result, inter, belong);
  181. return result->type;
  182. }
  183. gc_addTmpLink(&belong->gc_status);
  184. do {
  185. base = st;
  186. var_list = inter->var_list;
  187. if (checkSignal(&type, base->line, base->code_file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong)))
  188. break;
  189. while (base != NULL) {
  190. freeResult(result);
  191. type = runStatement(CALL_INTER_FUNCTIONSIG(base, var_list, result, belong));
  192. if (checkSignal(&type, base->line, base->code_file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong)))
  193. break;
  194. if (type == goto_return){
  195. Statement *label_st = checkLabel(st, result->label);
  196. if (label_st == NULL){
  197. setResultErrorSt(E_GotoException, "Don't find label", true, st, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  198. type = error_return;
  199. break;
  200. }
  201. type = runLabel(CALL_INTER_FUNCTIONSIG(label_st, var_list, result, belong));
  202. if (!RUN_TYPE(type))
  203. break;
  204. base = label_st->next;
  205. }
  206. else if (!RUN_TYPE(type))
  207. break;
  208. else
  209. base = base->next;
  210. }
  211. } while (type == restart_return && result->times == 0);
  212. if (type != error_return && type != function_return)
  213. setResultOperationNone(result, inter, belong);
  214. result->node = base;
  215. gc_freeTmpLink(&belong->gc_status);
  216. gc_run(inter, var_list, 1, 0, 0, var_list);
  217. return result->type;
  218. }
  219. // 若需要中断执行, 则返回true
  220. bool operationSafeInterStatement(INTER_FUNCTIONSIG){
  221. ResultType type;
  222. type = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  223. if (RUN_TYPE(type))
  224. return false;
  225. else if (type != return_code && type != error_return)
  226. setResultErrorSt(E_ResultException, "Get Not Support Result", true, st, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  227. return true;
  228. }
  229. bool ifBranchSafeInterStatement(INTER_FUNCTIONSIG){
  230. ResultType type;
  231. type = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  232. if (RUN_TYPE(type))
  233. return false;
  234. if (type == rego_return){
  235. result->times--;
  236. if (result->times < 0)
  237. return false;
  238. }
  239. if (type == restart_return || type == goto_return)
  240. result->times--;
  241. return true;
  242. }
  243. bool cycleBranchSafeInterStatement(INTER_FUNCTIONSIG){
  244. ResultType type;
  245. type = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  246. if (RUN_TYPE(type))
  247. return false;
  248. if (type == break_return || type == continue_return){
  249. result->times--;
  250. if (result->times < 0)
  251. return false;
  252. }
  253. if (type == restart_return || type == goto_return)
  254. result->times--;
  255. return true;
  256. }
  257. bool tryBranchSafeInterStatement(INTER_FUNCTIONSIG){
  258. ResultType type;
  259. type = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  260. if (RUN_TYPE(type))
  261. return false;
  262. if (type == restart_return || type == goto_return)
  263. result->times--;
  264. return true;
  265. }
  266. bool functionSafeInterStatement(INTER_FUNCTIONSIG){
  267. ResultType type;
  268. type = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  269. if (type == error_return || result->type == yield_return)
  270. return true;
  271. else if (type == function_return)
  272. result->type = operation_return;
  273. else
  274. result->type = not_return;
  275. return false;
  276. }
  277. bool blockSafeInterStatement(INTER_FUNCTIONSIG){
  278. ResultType type;
  279. type = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  280. if (type == error_return || type == yield_return)
  281. return true;
  282. result->type = operation_return;
  283. return false;
  284. }
  285. Statement *checkLabel(Statement *base, char *label){
  286. for (PASS; base != NULL; base = base->next)
  287. if (base->type == label_ && eqString(base->u.label_.label, label))
  288. return base;
  289. return NULL;
  290. }