run.c 6.4 KB

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