runoperation.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. #include "__run.h"
  2. static bool getLeftRightValue(Result *left, Result *right, INTER_FUNCTIONSIG);
  3. static ResultType operationCore(INTER_FUNCTIONSIG, char *name);
  4. ResultType assOperation(INTER_FUNCTIONSIG);
  5. ResultType pointOperation(INTER_FUNCTIONSIG);
  6. ResultType blockOperation(INTER_FUNCTIONSIG);
  7. /**
  8. * operation的整体操作
  9. * @param st
  10. * @param inter
  11. * @param var_list
  12. * @return
  13. */
  14. ResultType operationStatement(INTER_FUNCTIONSIG) {
  15. setResultCore(result);
  16. switch (st->u.operation.OperationType) {
  17. case OPT_ADD:
  18. operationCore(CALL_INTER_FUNCTIONSIG(st, var_list, result, father), inter->data.object_add);
  19. break;
  20. case OPT_SUB:
  21. operationCore(CALL_INTER_FUNCTIONSIG(st, var_list, result, father), inter->data.object_sub);
  22. break;
  23. case OPT_MUL:
  24. operationCore(CALL_INTER_FUNCTIONSIG(st, var_list, result, father), inter->data.object_mul);
  25. break;
  26. case OPT_DIV:
  27. operationCore(CALL_INTER_FUNCTIONSIG(st, var_list, result, father), inter->data.object_div);
  28. break;
  29. case OPT_ASS:
  30. assOperation(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  31. break;
  32. case OPT_POINT:
  33. pointOperation(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  34. break;
  35. case OPT_BLOCK:
  36. blockOperation(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  37. break;
  38. default:
  39. setResult(result, inter, father);
  40. break;
  41. }
  42. return result->type;
  43. }
  44. ResultType blockOperation(INTER_FUNCTIONSIG) {
  45. Statement *info_st = st->u.operation.left;
  46. bool yield_run;
  47. if ((yield_run = popStatementVarList(st, &var_list, var_list, inter)))
  48. info_st = st->info.node;
  49. blockSafeInterStatement(CALL_INTER_FUNCTIONSIG(info_st, var_list, result, father));
  50. if (result->type == error_return)
  51. return result->type;
  52. else if (yield_run) {
  53. if (result->type == yield_return){
  54. updateFunctionYield(st, result->node);
  55. result->type = operation_return;
  56. }
  57. else
  58. freeFunctionYield(st, inter);
  59. }
  60. else {
  61. if (result->type == yield_return){
  62. newFunctionYield(st, result->node, var_list, inter);
  63. result->type = operation_return;
  64. }
  65. else
  66. popVarList(var_list);
  67. }
  68. if (run_continue(result) && st->aut != auto_aut)
  69. result->value->aut = st->aut;
  70. return result->type;
  71. }
  72. ResultType pointOperation(INTER_FUNCTIONSIG) {
  73. LinkValue *left;
  74. VarList *object = NULL;
  75. VarList *out_var = NULL;
  76. if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.operation.left, var_list, result, father)) || result->value->value->type == none)
  77. return result->type;
  78. left = result->value;
  79. setResultCore(result);
  80. object = left->value->object.var;
  81. for (out_var = object; out_var->next != NULL; out_var = out_var->next)
  82. PASS;
  83. out_var->next = left->value->object.out_var;
  84. gc_freeze(inter, var_list, object, true);
  85. operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.operation.right, object, result, left));
  86. if (!run_continue(result))
  87. goto return_;
  88. else if ((left->aut == public_aut || left->aut == auto_aut) && (result->value->aut != public_aut && result->value->aut != auto_aut))
  89. setResultErrorSt(result, inter, "PermissionsException", "Wrong Permissions: access variables as public", st,
  90. father, true);
  91. else if ((left->aut == protect_aut) && (result->value->aut == private_aut))
  92. setResultErrorSt(result, inter, "PermissionsException", "Wrong Permissions: access variables as protect", st,
  93. father, true);
  94. if (result->value->father->value != left->value && checkAttribution(left->value, result->value->father->value))
  95. result->value->father = left;
  96. return_:
  97. gc_freeze(inter, var_list, object, false);
  98. if (out_var != NULL)
  99. out_var->next = NULL;
  100. gc_freeTmpLink(&left->gc_status);
  101. return result->type;
  102. }
  103. ResultType assOperation(INTER_FUNCTIONSIG) {
  104. LinkValue *value = NULL;
  105. if (st->u.operation.left->type == call_function){
  106. VarList *function_var = NULL;
  107. Value *function_value = NULL;
  108. LinkValue *tmp = NULL;
  109. function_var = copyVarList(var_list, false, inter);
  110. function_value = makeVMFunctionValue(st->u.operation.right, st->u.operation.left->u.call_function.parameter,
  111. function_var, inter);
  112. tmp = makeLinkValue(function_value, father, inter);
  113. assCore(st->u.operation.left->u.call_function.function, tmp, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
  114. }
  115. else{
  116. if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.operation.right, var_list, result, father)))
  117. return result->type;
  118. value = result->value;
  119. freeResult(result);
  120. assCore(st->u.operation.left, value, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
  121. }
  122. return result->type;
  123. }
  124. ResultType assCore(Statement *name, LinkValue *value, INTER_FUNCTIONSIG_NOT_ST){
  125. setResultCore(result);
  126. gc_addTmpLink(&value->gc_status);
  127. if (name->type == base_list && name->u.base_list.type == value_tuple){
  128. Parameter *pt = NULL;
  129. Argument *call = NULL;
  130. Statement *tmp_st = makeBaseLinkValueStatement(value, name->line, name->code_file);
  131. pt = makeArgsParameter(tmp_st);
  132. call = getArgument(pt, false, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
  133. if (!run_continue(result)) {
  134. freeArgument(call, false);
  135. freeParameter(pt, true);
  136. goto return_;
  137. }
  138. freeResult(result);
  139. setParameterCore(name->line, name->code_file, call, name->u.base_list.list, var_list, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
  140. if (run_continue(result)){
  141. Argument *tmp = call;
  142. LinkValue *new_value = makeLinkValue(makeListValue(&tmp, inter, value_tuple), father, inter);
  143. freeResult(result);
  144. setResultOperation(result, new_value);
  145. }
  146. freeArgument(call, false);
  147. freeParameter(pt, true);
  148. }
  149. else if (name->type == operation && name->u.operation.OperationType == OPT_POINT)
  150. pointAss(name, value, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
  151. else{
  152. char *str_name = NULL;
  153. int int_times = 0;
  154. LinkValue *var_value = NULL;
  155. getVarInfo(&str_name, &int_times, CALL_INTER_FUNCTIONSIG(name, var_list, result, father));
  156. if (!run_continue(result)) {
  157. memFree(str_name);
  158. return result->type;
  159. }
  160. var_value = copyLinkValue(value, inter);
  161. if (var_value->aut == auto_aut)
  162. var_value->aut = name->aut;
  163. addFromVarList(str_name, result->value, int_times, var_value, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  164. memFree(str_name);
  165. freeResult(result);
  166. result->type = operation_return;
  167. result->value = value;
  168. gc_addTmpLink(&result->value->gc_status);
  169. }
  170. return_:
  171. gc_freeTmpLink(&value->gc_status);
  172. return result->type;
  173. }
  174. ResultType pointAss(Statement *name, LinkValue *value, INTER_FUNCTIONSIG_NOT_ST) {
  175. Result left;
  176. VarList *object = NULL;
  177. if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(name->u.operation.left, var_list, result, father)))
  178. return result->type;
  179. left = *result;
  180. setResultCore(result);
  181. object = left.value->value->object.var;
  182. gc_freeze(inter, var_list, object, true);
  183. if (name->u.operation.right->type == OPERATION && name->u.operation.right->u.operation.OperationType == OPT_POINT)
  184. pointAss(name->u.operation.right, value, CALL_INTER_FUNCTIONSIG_NOT_ST(object, result, father));
  185. else
  186. assCore(name->u.operation.right, value, CALL_INTER_FUNCTIONSIG_NOT_ST(object, result, father));
  187. gc_freeze(inter, var_list, object, false);
  188. freeResult(&left);
  189. return result->type;
  190. }
  191. ResultType getVar(INTER_FUNCTIONSIG, VarInfo var_info) {
  192. int int_times = 0;
  193. char *name = NULL;
  194. freeResult(result);
  195. var_info(&name, &int_times, CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  196. if (!run_continue(result)) {
  197. memFree(name);
  198. return result->type;
  199. }
  200. freeResult(result);
  201. result->type = operation_return;
  202. result->value = findFromVarList(name, int_times, false, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  203. if (result->value == NULL) {
  204. char *info = memStrcat("Name Not Found: ", name, false, false);
  205. setResultErrorSt(result, inter, "NameException", info, st, father, true);
  206. memFree(info);
  207. }
  208. else if ((st->aut == public_aut) && (result->value->aut != public_aut && result->value->aut != auto_aut)){
  209. setResultCore(result);
  210. char *info = memStrcat("Wrong Permissions: access variables as public ", name, false, false);
  211. setResultErrorSt(result, inter, "PermissionsException", info, st, father, true);
  212. memFree(info);
  213. }
  214. else if ((st->aut == protect_aut) && (result->value->aut == private_aut)){
  215. setResultCore(result);
  216. char *info = memStrcat("Wrong Permissions: access variables as protect ", name, false, false);
  217. setResultErrorSt(result, inter, "PermissionsException", info, st, father, true);
  218. memFree(info);
  219. }
  220. else
  221. setResultOperationBase(result, result->value);
  222. memFree(name);
  223. return result->type;
  224. }
  225. ResultType getBaseValue(INTER_FUNCTIONSIG) {
  226. setResultCore(result);
  227. if (st->u.base_value.type == link_value)
  228. result->value = st->u.base_value.value;
  229. else {
  230. Value *value = NULL;
  231. if (st->u.base_value.type == number_str) {
  232. char *stop = NULL;
  233. value = makeNumberValue(strtol(st->u.base_value.str, &stop, 10), inter);
  234. }
  235. else if (st->u.base_value.type == bool_true)
  236. value = makeBoolValue(true, inter);
  237. else if (st->u.base_value.type == bool_false)
  238. value = makeBoolValue(false, inter);
  239. else if (st->u.base_value.type == pass_value)
  240. value = makePassValue(inter);
  241. else if (st->u.base_value.type == null_value)
  242. value = makeNoneValue(inter);
  243. else
  244. value = makeStringValue(st->u.base_value.str, inter);
  245. result->value = makeLinkValue(value, father, inter);
  246. }
  247. result->type = operation_return;
  248. gc_addTmpLink(&result->value->gc_status);
  249. return result->type;
  250. }
  251. ResultType getList(INTER_FUNCTIONSIG) {
  252. Argument *at = NULL;
  253. Argument *at_tmp = NULL;
  254. setResultCore(result);
  255. at = getArgument(st->u.base_list.list, false, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
  256. at_tmp = at;
  257. if (!run_continue(result)){
  258. freeArgument(at_tmp, false);
  259. return result->type;
  260. }
  261. LinkValue *value = makeLinkValue(makeListValue(&at, inter, st->u.base_list.type), father, inter);
  262. setResultOperation(result, value);
  263. freeArgument(at_tmp, false);
  264. return result->type;
  265. }
  266. ResultType getDict(INTER_FUNCTIONSIG) {
  267. Argument *at = NULL;
  268. Argument *at_tmp = NULL;
  269. setResultCore(result);
  270. at = getArgument(st->u.base_dict.dict, true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
  271. at_tmp = at;
  272. if (!run_continue(result)){
  273. freeArgument(at_tmp, false);
  274. return result->type;
  275. }
  276. freeResult(result);
  277. Value *tmp_value = makeDictValue(&at, true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
  278. if (!run_continue(result)) {
  279. freeArgument(at_tmp, false);
  280. return result->type;
  281. }
  282. freeResult(result);
  283. LinkValue *value = makeLinkValue(tmp_value, father, inter);
  284. setResultOperation(result, value);
  285. freeArgument(at_tmp, false);
  286. return result->type;
  287. }
  288. ResultType setDefault(INTER_FUNCTIONSIG){
  289. enum DefaultType type = st->u.default_var.default_type;
  290. int base = 0; // 用于nonlocal和global
  291. setResultCore(result);
  292. if (type == global_)
  293. for (VarList *tmp = var_list; tmp->next != NULL; tmp = tmp->next)
  294. base++;
  295. else if (type == nonlocal_)
  296. base = 1;
  297. for (Parameter *pt = st->u.default_var.var; pt != NULL; pt = pt->next){
  298. char *name = NULL;
  299. int times = 0;
  300. freeResult(result);
  301. getVarInfo(&name, &times, CALL_INTER_FUNCTIONSIG(pt->data.value, var_list, result, father));
  302. if (!run_continue(result))
  303. break;
  304. if (type != default_)
  305. times = base;
  306. var_list->default_var = connectDefaultVar(var_list->default_var, name, times);
  307. memFree(name);
  308. }
  309. return result->type;
  310. }
  311. bool getLeftRightValue(Result *left, Result *right, INTER_FUNCTIONSIG){
  312. if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.operation.left, var_list, result, father)) || result->value->value->type == none)
  313. return true;
  314. *left = *result;
  315. setResultCore(result);
  316. if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.operation.right, var_list, result, father)) || result->value->value->type == none)
  317. return true;
  318. *right = *result;
  319. setResultCore(result);
  320. return false;
  321. }
  322. ResultType operationCore(INTER_FUNCTIONSIG, char *name) {
  323. Result left;
  324. Result right;
  325. LinkValue *_func_ = NULL;
  326. setResultCore(&left);
  327. setResultCore(&right);
  328. if (getLeftRightValue(&left, &right, CALL_INTER_FUNCTIONSIG(st, var_list, result, father)))
  329. return result->type;
  330. _func_ = findAttributes(name, false, left.value, inter);
  331. if (_func_ != NULL){
  332. Argument *arg = makeValueArgument(right.value);
  333. gc_addTmpLink(&_func_->gc_status);
  334. callBackCore(_func_, arg, st->line, st->code_file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
  335. gc_freeTmpLink(&_func_->gc_status);
  336. freeArgument(arg, true);
  337. }
  338. else {
  339. char *message = memStrcat("Don't find ", name, false, false);
  340. setResultErrorSt(result, inter, "TypeException", message, st, father, true);
  341. memFree(message);
  342. }
  343. freeResult(&left);
  344. freeResult(&right);
  345. return result->type;
  346. }