run.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #include "__run.h"
  2. /**
  3. * 运行单个statement
  4. * @param st
  5. * @param inter
  6. * @param var_list
  7. * @return
  8. */
  9. Result runStatement(INTER_FUNCTIONSIG) {
  10. Result result;
  11. switch (st->type) {
  12. case base_value:
  13. result = getBaseValue(CALL_INTER_FUNCTIONSIG(st, var_list));
  14. break;
  15. case base_var:
  16. result = getBaseVar(CALL_INTER_FUNCTIONSIG(st, var_list));
  17. break;
  18. case base_list:
  19. result = getList(CALL_INTER_FUNCTIONSIG(st, var_list));
  20. break;
  21. case operation:
  22. result = operationStatement(CALL_INTER_FUNCTIONSIG(st, var_list));
  23. printLinkValue(result.value, "operation result = ", "\n", inter->debug);
  24. break;
  25. case set_function:
  26. result = setFunction(CALL_INTER_FUNCTIONSIG(st, var_list));
  27. break;
  28. case call_function:
  29. result = callFunction(CALL_INTER_FUNCTIONSIG(st, var_list));
  30. break;
  31. case if_branch:
  32. result = ifBranch(CALL_INTER_FUNCTIONSIG(st, var_list));
  33. break;
  34. case while_branch:
  35. result = whileBranch(CALL_INTER_FUNCTIONSIG(st, var_list));
  36. break;
  37. case try_branch:
  38. result = tryBranch(CALL_INTER_FUNCTIONSIG(st, var_list));
  39. break;
  40. case break_cycle:
  41. result = breakCycle(CALL_INTER_FUNCTIONSIG(st, var_list));
  42. break;
  43. case continue_cycle:
  44. result = continueCycle(CALL_INTER_FUNCTIONSIG(st, var_list));
  45. break;
  46. case rego_if:
  47. result = regoIf(CALL_INTER_FUNCTIONSIG(st, var_list));
  48. break;
  49. case restart:
  50. result = restartCode(CALL_INTER_FUNCTIONSIG(st, var_list));
  51. break;
  52. case return_code:
  53. result = returnCode(CALL_INTER_FUNCTIONSIG(st, var_list));
  54. break;
  55. case raise_code:
  56. result = raiseCode(CALL_INTER_FUNCTIONSIG(st, var_list));
  57. break;
  58. default:
  59. setResult(&result, true, inter);
  60. break;
  61. }
  62. return result;
  63. }
  64. /**
  65. * 局部程序运行statement
  66. * @param st
  67. * @param inter
  68. * @param var_list
  69. * @return
  70. */
  71. Result iterStatement(INTER_FUNCTIONSIG) {
  72. Result result;
  73. Statement *base_st = NULL;
  74. while (true) {
  75. base_st = st;
  76. while (base_st != NULL) {
  77. result = runStatement(CALL_INTER_FUNCTIONSIG(base_st, var_list));
  78. if (!run_continue(result))
  79. break;
  80. base_st = base_st->next;
  81. }
  82. if (result.type != restart_return || result.times > 0)
  83. break;
  84. }
  85. if (result.type == not_return)
  86. setResult(&result, true, inter);
  87. return result;
  88. }
  89. /**
  90. * 全局程序运行statement
  91. * @param inter
  92. * @return
  93. */
  94. Result globalIterStatement(Inter *inter) {
  95. Result result;
  96. Statement *base_st = NULL;
  97. VarList *var_list = NULL;
  98. while (true) {
  99. base_st = inter->statement;
  100. var_list = inter->var_list;
  101. while (base_st != NULL) {
  102. result = runStatement(CALL_INTER_FUNCTIONSIG(base_st, var_list));
  103. if (!run_continue(result))
  104. break;
  105. base_st = base_st->next;
  106. }
  107. if (result.type != restart_return || result.times > 0)
  108. break;
  109. }
  110. if (result.type != error_return && result.type != function_return)
  111. setResult(&result, true, inter);
  112. return result;
  113. }
  114. // 若需要中断执行, 则返回true
  115. bool operationSafeInterStatement(Result *result, INTER_FUNCTIONSIG){
  116. *result = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list));
  117. if (run_continue_(result))
  118. return false;
  119. return true;
  120. }
  121. bool ifBranchSafeInterStatement(Result *result, INTER_FUNCTIONSIG){
  122. *result = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list));
  123. if (run_continue_(result)){
  124. return false;
  125. }
  126. if (result->type == rego_return){
  127. result->times--;
  128. if (result->times < 0)
  129. return false;
  130. }
  131. if (result->type == restart_return)
  132. result->times--;
  133. return true;
  134. }
  135. bool cycleBranchSafeInterStatement(Result *result, INTER_FUNCTIONSIG){
  136. *result = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list));
  137. if (run_continue_(result)){
  138. return false;
  139. }
  140. if (result->type == break_return || result->type == continue_return){
  141. result->times--;
  142. if (result->times < 0)
  143. return false;
  144. }
  145. if (result->type == restart_return)
  146. result->times--;
  147. return true;
  148. }
  149. bool tryBranchSafeInterStatement(Result *result, INTER_FUNCTIONSIG){
  150. *result = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list));
  151. if (run_continue_(result)){
  152. return false;
  153. }
  154. if (result->type == restart_return)
  155. result->times--;
  156. return true;
  157. }
  158. bool functionSafeInterStatement(Result *result, INTER_FUNCTIONSIG){
  159. *result = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list));
  160. if (result->type == error_return){
  161. return true;
  162. }
  163. else if (result->type == function_return){
  164. result->type = operation_return;
  165. return true;
  166. }
  167. result->type = not_return;
  168. return false;
  169. }