run.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  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, father));
  15. break;
  16. case base_var:
  17. type = getVar(CALL_INTER_FUNCTIONSIG(st, var_list, result, father), getBaseVarInfo);
  18. break;
  19. case base_svar:
  20. type = getVar(CALL_INTER_FUNCTIONSIG(st, var_list, result, father), getBaseSVarInfo);
  21. break;
  22. case base_list:
  23. type = getList(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  24. break;
  25. case base_dict:
  26. type = getDict(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  27. break;
  28. case base_lambda:
  29. type = setLambda(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  30. break;
  31. case operation:
  32. type = operationStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  33. if (run_continue_type(type))
  34. printLinkValue(result->value, "operation result = ", "\n", inter->data.debug);
  35. break;
  36. case set_class:
  37. type = setClass(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  38. break;
  39. case set_function:
  40. type = setFunction(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  41. break;
  42. case call_function:
  43. type = callBack(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  44. break;
  45. case if_branch:
  46. type = ifBranch(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  47. break;
  48. case while_branch:
  49. type = whileBranch(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  50. break;
  51. case try_branch:
  52. type = tryBranch(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  53. break;
  54. case break_cycle:
  55. type = breakCycle(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  56. break;
  57. case continue_cycle:
  58. type = continueCycle(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  59. break;
  60. case rego_if:
  61. type = regoIf(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  62. break;
  63. case restart:
  64. type = restartCode(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  65. break;
  66. case return_code:
  67. type = returnCode(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  68. break;
  69. case raise_code:
  70. type = raiseCode(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  71. break;
  72. case include_file:
  73. type = includeFile(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  74. break;
  75. case import_file:
  76. type = importFile(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  77. break;
  78. case from_import_file:
  79. type = fromImportFile(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  80. break;
  81. case default_var:
  82. type = setDefault(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  83. break;
  84. case assert:
  85. type = assertCode(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  86. break;
  87. default:
  88. setResult(result, inter, father);
  89. break;
  90. }
  91. if (run_continue_type(type) && result->value->aut == auto_aut)
  92. result->value->aut = st->aut;
  93. gc_run(inter, 1, 0, 0, var_list);
  94. return type;
  95. }
  96. /**
  97. * 局部程序运行statement
  98. * @param st
  99. * @param inter
  100. * @param var_list
  101. * @return
  102. */
  103. ResultType iterStatement(INTER_FUNCTIONSIG) {
  104. Statement *base_st = NULL;
  105. ResultType type;
  106. setResultCore(result);
  107. if (st == NULL){
  108. setResult(result, inter, father);
  109. return result->type;
  110. }
  111. do {
  112. for (base_st = st; base_st != NULL; base_st = base_st->next) {
  113. freeResult(result);
  114. type = runStatement(CALL_INTER_FUNCTIONSIG(base_st, var_list, result, father));
  115. if (!run_continue_type(type))
  116. break;
  117. }
  118. } while (type == restart_return && result->times == 0);
  119. if (type == not_return || type == restart_return)
  120. setResultOperationNone(result, inter, father);
  121. gc_run(inter, 1, 0, 0, var_list);
  122. return result->type;
  123. }
  124. /**
  125. * 全局程序运行statement
  126. * @param inter
  127. * @return
  128. */
  129. ResultType globalIterStatement(Result *result, LinkValue *base_father, Inter *inter, Statement *st) {
  130. LinkValue *father = makeLinkValue(makeObject(inter, copyVarList(inter->var_list, false, inter), NULL, NULL), base_father, inter);
  131. Statement *base_st = NULL;
  132. VarList *var_list = NULL;
  133. enum ResultType type;
  134. do {
  135. for (base_st = st, var_list = inter->var_list; base_st != NULL; base_st = base_st->next) {
  136. freeResult(result);
  137. type = runStatement(CALL_INTER_FUNCTIONSIG(base_st, var_list, result, father));
  138. if (!run_continue_type(type))
  139. break;
  140. }
  141. } while (type == restart_return && result->times == 0);
  142. if (type != error_return && type != function_return)
  143. setResultOperationNone(result, inter, father);
  144. gc_run(inter, 1, 0, 0, var_list);
  145. return result->type;
  146. }
  147. // 若需要中断执行, 则返回true
  148. bool operationSafeInterStatement(INTER_FUNCTIONSIG){
  149. ResultType type;
  150. type = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  151. if (run_continue_type(type))
  152. return false;
  153. return true;
  154. }
  155. bool ifBranchSafeInterStatement(INTER_FUNCTIONSIG){
  156. ResultType type;
  157. type = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  158. if (run_continue_type(type))
  159. return false;
  160. if (type == rego_return){
  161. result->times--;
  162. if (result->times < 0)
  163. return false;
  164. }
  165. if (type == restart_return)
  166. result->times--;
  167. return true;
  168. }
  169. bool cycleBranchSafeInterStatement(INTER_FUNCTIONSIG){
  170. ResultType type;
  171. type = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  172. if (run_continue_type(type)){
  173. return false;
  174. }
  175. if (type == break_return || type == continue_return){
  176. result->times--;
  177. if (result->times < 0)
  178. return false;
  179. }
  180. if (type == restart_return)
  181. result->times--;
  182. return true;
  183. }
  184. bool tryBranchSafeInterStatement(INTER_FUNCTIONSIG){
  185. ResultType type;
  186. type = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  187. if (run_continue_type(type)){
  188. return false;
  189. }
  190. if (type == restart_return)
  191. result->times--;
  192. return true;
  193. }
  194. bool functionSafeInterStatement(INTER_FUNCTIONSIG){
  195. ResultType type;
  196. type = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  197. if (type == error_return)
  198. return true;
  199. else if (type == function_return){
  200. result->type = operation_return;
  201. return true;
  202. }
  203. result->type = not_return;
  204. return false;
  205. }