runoperation.c 20 KB

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