runoperation.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581
  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, belong), inter->data.object_add);
  19. break;
  20. case OPT_SUB:
  21. operationCore(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong), inter->data.object_sub);
  22. break;
  23. case OPT_MUL:
  24. operationCore(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong), inter->data.object_mul);
  25. break;
  26. case OPT_DIV:
  27. operationCore(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong), inter->data.object_div);
  28. break;
  29. case OPT_ASS:
  30. assOperation(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  31. break;
  32. case OPT_POINT:
  33. pointOperation(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  34. break;
  35. case OPT_BLOCK:
  36. blockOperation(CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  37. break;
  38. default:
  39. setResult(result, inter, belong);
  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, belong));
  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. freeRunInfo(st);
  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 (CHECK_RESULT(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. if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.operation.left, var_list, result, belong)) || result->value->value->type == none)
  76. return result->type;
  77. left = result->value;
  78. setResultCore(result);
  79. object = left->value->object.var;
  80. gc_freeze(inter, var_list, object, true);
  81. operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.operation.right, object, result, left));
  82. if (!CHECK_RESULT(result))
  83. goto return_;
  84. else if ((left->aut == public_aut || left->aut == auto_aut) && (result->value->aut != public_aut && result->value->aut != auto_aut))
  85. setResultErrorSt(E_PermissionsException, "Wrong Permissions: access variables as public", true, st, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  86. else if ((left->aut == protect_aut) && (result->value->aut == private_aut))
  87. setResultErrorSt(E_PermissionsException, "Wrong Permissions: access variables as protect", true, st, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  88. if (result->value->belong == NULL || result->value->belong->value != left->value && checkAttribution(left->value, result->value->belong->value))
  89. result->value->belong = left;
  90. return_:
  91. gc_freeze(inter, var_list, object, false);
  92. gc_freeTmpLink(&left->gc_status);
  93. return result->type;
  94. }
  95. ResultType delOperation(INTER_FUNCTIONSIG) {
  96. Statement *var;
  97. setResultCore(result);
  98. var = st->u.del_.var;
  99. delCore(var, false, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  100. return result->type;
  101. }
  102. ResultType delCore(Statement *name, bool check_aut, INTER_FUNCTIONSIG_NOT_ST) {
  103. setResultCore(result);
  104. if (name->type == base_list && name->u.base_list.type == value_tuple)
  105. listDel(name, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  106. else if (name->type == slice_)
  107. downDel(name, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  108. else if (name->type == operation && name->u.operation.OperationType == OPT_POINT)
  109. pointDel(name, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  110. else
  111. varDel(name, check_aut, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  112. return result->type;
  113. }
  114. ResultType listDel(Statement *name, INTER_FUNCTIONSIG_NOT_ST) {
  115. setResultCore(result);
  116. for (Parameter *pt = name->u.base_list.list; pt != NULL; pt = pt->next){
  117. delCore(pt->data.value, false, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  118. freeResult(result);
  119. }
  120. setResultBase(result, inter, belong);
  121. return result->type;
  122. }
  123. ResultType varDel(Statement *name, bool check_aut, INTER_FUNCTIONSIG_NOT_ST) {
  124. char *str_name = NULL;
  125. int int_times = 0;
  126. setResultCore(result);
  127. getVarInfo(&str_name, &int_times, CALL_INTER_FUNCTIONSIG(name, var_list, result, belong));
  128. if (!CHECK_RESULT(result)) {
  129. memFree(str_name);
  130. return result->type;
  131. }
  132. if (check_aut) {
  133. LinkValue *tmp = findFromVarList(str_name, int_times, read_var, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  134. if (tmp != NULL) {
  135. if ((name->aut == public_aut || name->aut == auto_aut) && (tmp->aut != public_aut && tmp->aut != auto_aut)) { // TODO-szh 封装位函数
  136. setResultErrorSt(E_PermissionsException, "Wrong Permissions: access variables as public", true, name, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  137. goto return_;
  138. }
  139. else if ((name->aut == protect_aut) && (tmp->aut == private_aut)) {
  140. setResultErrorSt(E_PermissionsException, "Wrong Permissions: access variables as protect", true, name, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  141. goto return_;
  142. }
  143. }
  144. }
  145. findFromVarList(str_name, int_times, del_var, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  146. setResult(result, inter, belong);
  147. return_:
  148. memFree(str_name);
  149. return result->type;
  150. }
  151. ResultType pointDel(Statement *name, INTER_FUNCTIONSIG_NOT_ST) {
  152. Result left;
  153. VarList *object = NULL;
  154. setResultCore(result);
  155. if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(name->u.operation.left, var_list, result, belong)))
  156. return result->type;
  157. left = *result;
  158. setResultCore(result);
  159. object = left.value->value->object.var;
  160. gc_freeze(inter, var_list, object, true);
  161. if (name->u.operation.right->type == OPERATION && name->u.operation.right->u.operation.OperationType == OPT_POINT)
  162. pointDel(name->u.operation.right, CALL_INTER_FUNCTIONSIG_NOT_ST(object, result, belong));
  163. else
  164. delCore(name->u.operation.right, true, CALL_INTER_FUNCTIONSIG_NOT_ST(object, result, belong));
  165. gc_freeze(inter, var_list, object, false);
  166. freeResult(&left);
  167. return result->type;
  168. }
  169. ResultType downDel(Statement *name, INTER_FUNCTIONSIG_NOT_ST) {
  170. LinkValue *iter = NULL;
  171. LinkValue *_func_ = NULL;
  172. Parameter *pt = name->u.slice_.index;
  173. setResultCore(result);
  174. if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(name->u.slice_.element, var_list, result, belong)))
  175. return result->type;
  176. iter = result->value;
  177. result->value = NULL;
  178. freeResult(result);
  179. if (name->u.slice_.type == SliceType_down_)
  180. _func_ = findAttributes(inter->data.object_down_del, false, iter, inter);
  181. else
  182. _func_ = findAttributes(inter->data.object_slice_del, false, iter, inter);
  183. if (_func_ != NULL){
  184. Argument *arg = NULL;
  185. gc_addTmpLink(&_func_->gc_status);
  186. arg = getArgument(pt, false, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  187. if (!CHECK_RESULT(result))
  188. goto dderror_;
  189. freeResult(result);
  190. callBackCore(_func_, arg, name->line, name->code_file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  191. dderror_:
  192. gc_freeTmpLink(&_func_->gc_status);
  193. freeArgument(arg, true);
  194. }
  195. else
  196. setResultErrorSt(E_TypeException, "Don't find __down_del__/__slice_del__", true, name, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  197. gc_freeTmpLink(&iter->gc_status);
  198. return result->type;
  199. }
  200. ResultType assOperation(INTER_FUNCTIONSIG) {
  201. LinkValue *value = NULL;
  202. if (st->u.operation.left->type == call_function){
  203. VarList *function_var = NULL;
  204. Value *function_value = NULL;
  205. LinkValue *tmp = NULL;
  206. function_var = copyVarList(var_list, false, inter);
  207. {
  208. Statement *return_st = makeReturnStatement(st->u.operation.right, st->line, st->code_file);
  209. function_value = makeVMFunctionValue(return_st, st->u.operation.left->u.call_function.parameter, function_var, inter);
  210. return_st->u.return_code.value = NULL;
  211. freeStatement(return_st);
  212. }
  213. tmp = makeLinkValue(function_value, belong, inter);
  214. assCore(st->u.operation.left->u.call_function.function, tmp, false, true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  215. }
  216. else{
  217. if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.operation.right, var_list, result, belong)))
  218. return result->type;
  219. value = result->value;
  220. freeResult(result);
  221. assCore(st->u.operation.left, value, false, false,
  222. CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  223. }
  224. return result->type;
  225. }
  226. ResultType assCore(Statement *name, LinkValue *value, bool check_aut, bool setting, INTER_FUNCTIONSIG_NOT_ST) {
  227. setResultCore(result);
  228. gc_addTmpLink(&value->gc_status);
  229. if (name->type == base_list && name->u.base_list.type == value_tuple)
  230. listAss(name, value, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  231. else if (name->type == slice_)
  232. downAss(name, value, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  233. else if (name->type == operation && name->u.operation.OperationType == OPT_POINT)
  234. pointAss(name, value, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  235. else
  236. varAss(name, value, check_aut, setting, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  237. gc_freeTmpLink(&value->gc_status);
  238. return result->type;
  239. }
  240. void varAssCore(char *name, LinkValue *name_, vnum times, LinkValue *value, bool setting, INTER_FUNCTIONSIG_CORE) {
  241. addFromVarList(name, name_, times, value, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  242. if (setting)
  243. newObjectSetting(name_, value, inter);
  244. }
  245. ResultType varAss(Statement *name, LinkValue *value, bool check_aut, bool setting, INTER_FUNCTIONSIG_NOT_ST) {
  246. char *str_name = NULL;
  247. int int_times = 0;
  248. LinkValue *var_value = NULL;
  249. setResultCore(result);
  250. getVarInfo(&str_name, &int_times, CALL_INTER_FUNCTIONSIG(name, var_list, result, belong));
  251. if (!CHECK_RESULT(result)) {
  252. memFree(str_name);
  253. return result->type;
  254. }
  255. var_value = copyLinkValue(value, inter);
  256. if (name->aut != auto_aut)
  257. var_value->aut = name->aut;
  258. if (check_aut) {
  259. LinkValue *tmp = findFromVarList(str_name, int_times, read_var, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  260. if (tmp != NULL) {
  261. if ((value->aut == public_aut || value->aut == auto_aut) && (tmp->aut != public_aut && tmp->aut != auto_aut)) {
  262. setResultErrorSt(E_PermissionsException, "Wrong Permissions: access variables as public", true, name, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  263. goto return_;
  264. }
  265. else if ((value->aut == protect_aut) && (tmp->aut == private_aut)) {
  266. setResultErrorSt(E_PermissionsException, "Wrong Permissions: access variables as protect", true, name, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  267. goto return_;
  268. }
  269. else
  270. varAssCore(str_name, result->value, int_times, var_value, setting, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  271. } else
  272. varAssCore(str_name, result->value, int_times, var_value, setting, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  273. } else {
  274. if (name->aut != auto_aut) {
  275. LinkValue *tmp = findFromVarList(str_name, int_times, read_var, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  276. if (tmp != NULL)
  277. tmp->aut = name->aut;
  278. }
  279. varAssCore(str_name, result->value, int_times, var_value, setting, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  280. }
  281. freeResult(result);
  282. result->type = operation_return;
  283. result->value = value;
  284. gc_addTmpLink(&result->value->gc_status);
  285. return_:
  286. memFree(str_name);
  287. return result->type;
  288. }
  289. ResultType listAss(Statement *name, LinkValue *value, INTER_FUNCTIONSIG_NOT_ST) {
  290. Parameter *pt = NULL;
  291. Argument *call = NULL;
  292. Statement *tmp_st = makeBaseLinkValueStatement(value, name->line, name->code_file);
  293. setResultCore(result);
  294. pt = makeArgsParameter(tmp_st);
  295. call = getArgument(pt, false, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  296. if (!CHECK_RESULT(result))
  297. goto return_;
  298. freeResult(result);
  299. setParameterCore(name->line, name->code_file, call, name->u.base_list.list, var_list, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  300. if (CHECK_RESULT(result)){
  301. Argument *tmp = call;
  302. LinkValue *new_value = makeLinkValue(makeListValue(&tmp, inter, value_tuple), belong, inter);
  303. freeResult(result);
  304. setResultOperation(result, new_value);
  305. }
  306. return_:
  307. freeArgument(call, false);
  308. freeParameter(pt, true);
  309. return result->type;
  310. }
  311. ResultType downAss(Statement *name, LinkValue *value, INTER_FUNCTIONSIG_NOT_ST) {
  312. LinkValue *iter = NULL;
  313. LinkValue *_func_ = NULL;
  314. Parameter *pt = name->u.slice_.index;
  315. setResultCore(result);
  316. if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(name->u.slice_.element, var_list, result, belong)))
  317. return result->type;
  318. iter = result->value;
  319. result->value = NULL;
  320. freeResult(result);
  321. if (name->u.slice_.type == SliceType_down_)
  322. _func_ = findAttributes(inter->data.object_down_assignment, false, iter, inter);
  323. else
  324. _func_ = findAttributes(inter->data.object_slice_assignment, false, iter, inter);
  325. if (_func_ != NULL){
  326. Argument *arg = makeValueArgument(value);
  327. gc_addTmpLink(&_func_->gc_status);
  328. arg->next = getArgument(pt, false, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  329. if (!CHECK_RESULT(result))
  330. goto daerror_;
  331. freeResult(result);
  332. callBackCore(_func_, arg, name->line, name->code_file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  333. daerror_:
  334. freeArgument(arg, true);
  335. gc_freeTmpLink(&_func_->gc_status);
  336. }
  337. else
  338. setResultErrorSt(E_TypeException, "Don't find __down_assignment__/__slice_assignment__", true, name, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  339. gc_freeTmpLink(&iter->gc_status);
  340. return result->type;
  341. }
  342. ResultType pointAss(Statement *name, LinkValue *value, INTER_FUNCTIONSIG_NOT_ST) {
  343. Result left;
  344. VarList *object = NULL;
  345. setResultCore(result);
  346. if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(name->u.operation.left, var_list, result, belong)))
  347. return result->type;
  348. left = *result;
  349. setResultCore(result);
  350. object = left.value->value->object.var;
  351. gc_freeze(inter, var_list, object, true);
  352. if (name->u.operation.right->type == OPERATION && name->u.operation.right->u.operation.OperationType == OPT_POINT)
  353. pointAss(name->u.operation.right, value, CALL_INTER_FUNCTIONSIG_NOT_ST(object, result, belong));
  354. else
  355. assCore(name->u.operation.right, value, true, false, CALL_INTER_FUNCTIONSIG_NOT_ST(object, result, belong));
  356. gc_freeze(inter, var_list, object, false);
  357. freeResult(&left);
  358. return result->type;
  359. }
  360. ResultType getVar(INTER_FUNCTIONSIG, VarInfo var_info) {
  361. int int_times = 0;
  362. char *name = NULL;
  363. setResultCore(result);
  364. var_info(&name, &int_times, CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
  365. if (!CHECK_RESULT(result)) {
  366. memFree(name);
  367. return result->type;
  368. }
  369. freeResult(result);
  370. result->type = operation_return;
  371. result->value = findFromVarList(name, int_times, get_var, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  372. if (result->value == NULL) {
  373. char *info = memStrcat("Name Not Found: ", name, false, false);
  374. setResultErrorSt(E_NameExceptiom, info, true, st, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  375. memFree(info);
  376. }
  377. else if ((st->aut == public_aut) && (result->value->aut != public_aut && result->value->aut != auto_aut)){
  378. setResultCore(result);
  379. char *info = memStrcat("Wrong Permissions: access variables as public ", name, false, false);
  380. setResultErrorSt(E_PermissionsException, info, true, st, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  381. memFree(info);
  382. }
  383. else if ((st->aut == protect_aut) && (result->value->aut == private_aut)){
  384. setResultCore(result);
  385. char *info = memStrcat("Wrong Permissions: access variables as protect ", name, false, false);
  386. setResultErrorSt(E_PermissionsException, info, true, st, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  387. memFree(info);
  388. }
  389. else
  390. setResultOperationBase(result, result->value);
  391. memFree(name);
  392. return result->type;
  393. }
  394. ResultType getBaseValue(INTER_FUNCTIONSIG) {
  395. setResultCore(result);
  396. if (st->u.base_value.type == link_value)
  397. result->value = st->u.base_value.value;
  398. else {
  399. Value *value = NULL;
  400. switch (st->u.base_value.type){
  401. case number_str:
  402. value = makeNumberValue(strtol(st->u.base_value.str, NULL, 10), inter);
  403. break;
  404. case bool_true:
  405. value = makeBoolValue(true, inter);
  406. break;
  407. case bool_false:
  408. value = makeBoolValue(false, inter);
  409. break;
  410. case pass_value:
  411. value = makePassValue(inter);
  412. break;
  413. case null_value:
  414. value = makeNoneValue(inter);
  415. break;
  416. default:
  417. value = makeStringValue(st->u.base_value.str, inter);
  418. break;
  419. }
  420. result->value = makeLinkValue(value, belong, inter);
  421. }
  422. result->type = operation_return;
  423. gc_addTmpLink(&result->value->gc_status);
  424. return result->type;
  425. }
  426. ResultType getList(INTER_FUNCTIONSIG) {
  427. Argument *at = NULL;
  428. Argument *at_tmp = NULL;
  429. setResultCore(result);
  430. at = getArgument(st->u.base_list.list, false, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  431. at_tmp = at;
  432. if (!CHECK_RESULT(result)){
  433. freeArgument(at_tmp, false);
  434. return result->type;
  435. }
  436. LinkValue *value = makeLinkValue(makeListValue(&at, inter, st->u.base_list.type), belong, inter);
  437. setResultOperation(result, value);
  438. freeArgument(at_tmp, false);
  439. return result->type;
  440. }
  441. ResultType getDict(INTER_FUNCTIONSIG) {
  442. Argument *at = NULL;
  443. Argument *at_tmp = NULL;
  444. setResultCore(result);
  445. at = getArgument(st->u.base_dict.dict, true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  446. at_tmp = at;
  447. if (!CHECK_RESULT(result)){
  448. freeArgument(at_tmp, false);
  449. return result->type;
  450. }
  451. freeResult(result);
  452. Value *tmp_value = makeDictValue(&at, true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  453. if (!CHECK_RESULT(result)) {
  454. freeArgument(at_tmp, false);
  455. return result->type;
  456. }
  457. freeResult(result);
  458. LinkValue *value = makeLinkValue(tmp_value, belong, inter);
  459. setResultOperation(result, value);
  460. freeArgument(at_tmp, false);
  461. return result->type;
  462. }
  463. ResultType setDefault(INTER_FUNCTIONSIG){
  464. enum DefaultType type = st->u.default_var.default_type;
  465. int base = 0; // 用于nonlocal和global
  466. setResultCore(result);
  467. if (type == global_)
  468. for (VarList *tmp = var_list; tmp->next != NULL; tmp = tmp->next)
  469. base++;
  470. else if (type == nonlocal_)
  471. base = 1;
  472. for (Parameter *pt = st->u.default_var.var; pt != NULL; pt = pt->next){
  473. char *name = NULL;
  474. int times = 0;
  475. freeResult(result);
  476. getVarInfo(&name, &times, CALL_INTER_FUNCTIONSIG(pt->data.value, var_list, result, belong));
  477. if (!CHECK_RESULT(result))
  478. break;
  479. if (type != default_)
  480. times = base;
  481. var_list->default_var = connectDefaultVar(var_list->default_var, name, times);
  482. memFree(name);
  483. }
  484. return result->type;
  485. }
  486. bool getLeftRightValue(Result *left, Result *right, INTER_FUNCTIONSIG){
  487. if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.operation.left, var_list, result, belong)) || result->value->value->type == none)
  488. return true;
  489. *left = *result;
  490. setResultCore(result);
  491. if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.operation.right, var_list, result, belong)) || result->value->value->type == none)
  492. return true;
  493. *right = *result;
  494. setResultCore(result);
  495. return false;
  496. }
  497. ResultType operationCore(INTER_FUNCTIONSIG, char *name) {
  498. Result left;
  499. Result right;
  500. LinkValue *_func_ = NULL;
  501. setResultCore(&left);
  502. setResultCore(&right);
  503. if (getLeftRightValue(&left, &right, CALL_INTER_FUNCTIONSIG(st, var_list, result, belong)))
  504. return result->type;
  505. _func_ = findAttributes(name, false, left.value, inter);
  506. if (_func_ != NULL){
  507. Argument *arg = makeValueArgument(right.value);
  508. gc_addTmpLink(&_func_->gc_status);
  509. callBackCore(_func_, arg, st->line, st->code_file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  510. gc_freeTmpLink(&_func_->gc_status);
  511. freeArgument(arg, true);
  512. }
  513. else {
  514. char *message = memStrcat("Don't find ", name, false, false);
  515. setResultErrorSt(E_TypeException, message, true, st, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  516. memFree(message);
  517. }
  518. freeResult(&left);
  519. freeResult(&right);
  520. return result->type;
  521. }