value.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637
  1. #include "__run.h"
  2. Value *makeObject(Inter *inter, VarList *object, VarList *out_var, Inherit *inherit) {
  3. Value *tmp, *list_tmp = inter->base;
  4. tmp = memCalloc(1, sizeof(Value));
  5. setGC(&tmp->gc_status);
  6. tmp->type = object_;
  7. tmp->gc_next = NULL;
  8. if (inter->data.object != NULL && inherit == NULL)
  9. inherit = makeInherit(makeLinkValue(inter->data.object, NULL, inter));
  10. if (out_var == NULL && inherit != NULL)
  11. out_var = copyVarList(inherit->value->value->object.out_var, false, inter);
  12. tmp->object.var = makeObjectVarList(inherit, inter, object);
  13. tmp->object.out_var = out_var;
  14. tmp->object.inherit = inherit;
  15. if (list_tmp == NULL){
  16. inter->base = tmp;
  17. tmp->gc_last = NULL;
  18. goto return_;
  19. }
  20. for (PASS; list_tmp->gc_next != NULL; list_tmp = list_tmp->gc_next)
  21. PASS;
  22. list_tmp->gc_next = tmp;
  23. tmp->gc_last = list_tmp;
  24. return_:
  25. return tmp;
  26. }
  27. Value *makeNoneValue(Inter *inter) {
  28. Value *tmp;
  29. if (inter->data.none == NULL) {
  30. tmp = makeObject(inter, NULL, NULL, NULL);
  31. tmp->type = none;
  32. }
  33. else
  34. tmp = inter->data.none;
  35. return tmp;
  36. }
  37. Value *makeBoolValue(bool bool_num, Inter *inter) {
  38. Inherit *object_father = getInheritFromValue(inter->data.bool_, inter);
  39. VarList *new_var = copyVarList(inter->data.bool_->object.out_var, false, inter);
  40. Value *tmp;
  41. tmp = makeObject(inter, NULL, new_var, object_father);
  42. tmp->type = bool_;
  43. tmp->data.bool_.bool_ = bool_num;
  44. return tmp;
  45. }
  46. Value *makePassValue(Inter *inter){
  47. Inherit *object_father = getInheritFromValue(inter->data.pass_, inter);
  48. VarList *new_var = copyVarList(inter->data.pass_->object.out_var, false, inter);
  49. Value *tmp;
  50. tmp = makeObject(inter, NULL, new_var, object_father);
  51. tmp->type = pass_;
  52. return tmp;
  53. }
  54. Value *makeNumberValue(vnum num, Inter *inter) {
  55. Inherit *object_father = getInheritFromValue(inter->data.num, inter);
  56. VarList *new_var = copyVarList(inter->data.num->object.out_var, false, inter);
  57. Value *tmp;
  58. tmp = makeObject(inter, NULL, new_var, object_father);
  59. tmp->type = number;
  60. tmp->data.num.num = num;
  61. return tmp;
  62. }
  63. Value *makeStringValue(char *str, Inter *inter) {
  64. Inherit *object_father = getInheritFromValue(inter->data.str, inter);
  65. VarList *new_var = copyVarList(inter->data.str->object.out_var, false, inter);
  66. Value *tmp;
  67. tmp = makeObject(inter, NULL, new_var, object_father);
  68. tmp->type = string;
  69. tmp->data.str.str = memStrcpy(str);
  70. return tmp;
  71. }
  72. static void setFunctionData(Value *value, Inter *inter) {
  73. value->data.function.function_data.pt_type = inter->data.default_pt_type;
  74. }
  75. Value *makeVMFunctionValue(Statement *st, Parameter *pt, VarList *var_list, Inter *inter) {
  76. Inherit *object_father = getInheritFromValue(inter->data.function, inter);
  77. Value *tmp;
  78. tmp = makeObject(inter, NULL, var_list, object_father);
  79. tmp->type = function;
  80. tmp->data.function.type = vm_function;
  81. tmp->data.function.function = copyStatement(st);
  82. tmp->data.function.pt = copyParameter(pt);
  83. tmp->data.function.of = NULL;
  84. setFunctionData(tmp, inter);
  85. return tmp;
  86. }
  87. Value *makeCFunctionValue(OfficialFunction of, VarList *var_list, Inter *inter) {
  88. Inherit *object_father = getInheritFromValue(inter->data.function, inter);
  89. Value *tmp;
  90. tmp = makeObject(inter, NULL, copyVarList(var_list, false, inter), object_father);
  91. tmp->type = function;
  92. tmp->data.function.type = c_function;
  93. tmp->data.function.function = NULL;
  94. tmp->data.function.pt = NULL;
  95. tmp->data.function.of = of;
  96. setFunctionData(tmp, inter);
  97. return tmp;
  98. }
  99. Value *makeClassValue(VarList *var_list, Inter *inter, Inherit *father) {
  100. Value *tmp;
  101. tmp = makeObject(inter, NULL, var_list, father);
  102. tmp->type = class;
  103. return tmp;
  104. }
  105. Value *makeListValue(Argument **arg_ad, Inter *inter, enum ListType type) {
  106. Inherit *object_father = NULL;
  107. VarList *new_var = NULL;
  108. Value *tmp;
  109. Argument *at = *arg_ad;
  110. if (type == value_list) {
  111. object_father = getInheritFromValue(inter->data.list, inter);
  112. new_var = copyVarList(inter->data.list->object.out_var, false, inter);
  113. }
  114. else {
  115. object_father = getInheritFromValue(inter->data.tuple, inter);
  116. new_var = copyVarList(inter->data.tuple->object.out_var, false, inter);
  117. }
  118. tmp = makeObject(inter, NULL, new_var, object_father);
  119. tmp->type = list;
  120. tmp->data.list.type = type;
  121. tmp->data.list.list = NULL;
  122. tmp->data.list.size = 0;
  123. for (PASS; at != NULL && at->type == value_arg; at = at->next) {
  124. tmp->data.list.size++;
  125. tmp->data.list.list = memRealloc(tmp->data.list.list, tmp->data.list.size * sizeof(LinkValue *));
  126. tmp->data.list.list[tmp->data.list.size - 1] = at->data.value;
  127. }
  128. *arg_ad = at;
  129. return tmp;
  130. }
  131. Value *makeDictValue(Argument **arg_ad, bool new_hash, INTER_FUNCTIONSIG_NOT_ST) {
  132. Inherit *object_father = getInheritFromValue(inter->data.dict, inter);
  133. VarList *new_var = copyVarList(inter->data.dict->object.out_var, false, inter);
  134. Value *tmp;
  135. tmp = makeObject(inter, NULL, new_var, object_father);
  136. tmp->data.dict.size = 0;
  137. tmp->type = dict;
  138. if (new_hash) {
  139. VarList *hash = pushVarList(var_list, inter);
  140. gc_addTmpLink(&tmp->gc_status);
  141. tmp->data.dict.dict = hash->hashtable;
  142. freeResult(result);
  143. argumentToVar(arg_ad, &tmp->data.dict.size, CALL_INTER_FUNCTIONSIG_NOT_ST(hash, result, belong));
  144. popVarList(hash);
  145. gc_freeTmpLink(&tmp->gc_status);
  146. }
  147. else
  148. tmp->data.dict.dict = NULL;
  149. return tmp;
  150. }
  151. void freeValue(Value **value) {
  152. Value *free_value = *value;
  153. FREE_BASE(free_value, return_);
  154. for (VarList *tmp = free_value->object.var; tmp != NULL; tmp = freeVarList(tmp))
  155. PASS;
  156. for (VarList *tmp = free_value->object.out_var; tmp != NULL; tmp = freeVarList(tmp))
  157. PASS;
  158. for (struct Inherit *tmp = free_value->object.inherit; tmp != NULL; tmp = freeInherit(tmp))
  159. PASS;
  160. switch (free_value->type) {
  161. case string:
  162. memFree(free_value->data.str.str);
  163. break;
  164. case function: {
  165. freeParameter(free_value->data.function.pt, true);
  166. freeStatement(free_value->data.function.function);
  167. break;
  168. }
  169. case list:
  170. memFree(free_value->data.list.list);
  171. break;
  172. default:
  173. break;
  174. }
  175. if ((*value)->gc_next != NULL)
  176. (*value)->gc_next->gc_last = (*value)->gc_last;
  177. *value = (*value)->gc_next;
  178. memFree(free_value);
  179. return_: return;
  180. }
  181. LinkValue *makeLinkValue(Value *value, LinkValue *belong, Inter *inter){
  182. LinkValue *tmp;
  183. LinkValue *list_tmp = inter->link_base;
  184. tmp = memCalloc(1, sizeof(Value));
  185. tmp->belong = belong;
  186. tmp->value = value;
  187. setGC(&tmp->gc_status);
  188. if (list_tmp == NULL){
  189. inter->link_base = tmp;
  190. tmp->gc_last = NULL;
  191. goto return_;
  192. }
  193. for (PASS; list_tmp->gc_next != NULL; list_tmp = list_tmp->gc_next)
  194. PASS;
  195. list_tmp->gc_next = tmp;
  196. tmp->gc_last = list_tmp;
  197. tmp->aut = auto_aut;
  198. return_:
  199. return tmp;
  200. }
  201. void freeLinkValue(LinkValue **value) {
  202. LinkValue *free_value = *value;
  203. FREE_BASE(free_value, return_);
  204. if ((*value)->gc_next != NULL)
  205. (*value)->gc_next->gc_last = (*value)->gc_last;
  206. *value = (*value)->gc_next;
  207. memFree(free_value);
  208. return_: return;
  209. }
  210. LinkValue *copyLinkValue(LinkValue *value, Inter *inter) {
  211. LinkValue *tmp = NULL;
  212. if (value == NULL)
  213. return NULL;
  214. tmp = makeLinkValue(value->value, value->belong, inter);
  215. tmp->aut = value->aut;
  216. return tmp;
  217. }
  218. void setResultCore(Result *ru) {
  219. ru->type = not_return;
  220. ru->times = 0;
  221. ru->error = NULL;
  222. ru->value = NULL;
  223. ru->label = NULL;
  224. ru->node = NULL;
  225. }
  226. void setResult(Result *ru, Inter *inter, LinkValue *belong) {
  227. freeResult(ru);
  228. setResultBase(ru, inter, belong);
  229. }
  230. void setResultBase(Result *ru, Inter *inter, LinkValue *belong) {
  231. setResultCore(ru);
  232. ru->value = makeLinkValue(makeNoneValue(inter), belong, inter);
  233. gc_addTmpLink(&ru->value->gc_status);
  234. }
  235. void setResultErrorSt(BaseErrorType type, char *error_message, bool new, Statement *st, INTER_FUNCTIONSIG_NOT_ST) {
  236. setResultError(type, error_message, st->line, st->code_file, new, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  237. }
  238. Value *findBaseError(BaseErrorType type, Inter *inter){
  239. switch (type) {
  240. case E_BaseException:
  241. return inter->data.base_exc;
  242. case E_Exception:
  243. return inter->data.exc;
  244. case E_TypeException:
  245. return inter->data.type_exc;
  246. case E_ArgumentException:
  247. return inter->data.arg_exc;
  248. case E_PermissionsException:
  249. return inter->data.per_exc;
  250. case E_GotoException:
  251. return inter->data.goto_exc;
  252. case E_ResultException:
  253. return inter->data.result_exc;
  254. case E_NameExceptiom:
  255. return inter->data.name_exc;
  256. case E_AssertException:
  257. return inter->data.assert_exc;
  258. case E_IndexException:
  259. return inter->data.index_exc;
  260. case E_KeyException:
  261. return inter->data.key_exc;
  262. case E_StrideException:
  263. return inter->data.stride_exc;
  264. case E_StopIterException:
  265. return inter->data.iterstop_exc;
  266. case E_SuperException:
  267. return inter->data.super_exc;
  268. case E_ImportException:
  269. return inter->data.import_exc;
  270. case E_IncludeException:
  271. return inter->data.include_exp;
  272. default:
  273. return NULL;
  274. }
  275. }
  276. char *getErrorInfo(LinkValue *exc, int type, Inter *inter){
  277. char *str_name = type == 1 ? "__name__" : "__message__";
  278. LinkValue *_info_ = findAttributes(str_name, false, exc, inter);
  279. if (_info_ != NULL && _info_->value->type == string)
  280. return memStrcpy(_info_->value->data.str.str);
  281. else
  282. return type == 1 ? memStrcpy("Error Type: Unknown") : memStrcpy("Error Message: Unknown");
  283. }
  284. void callException(LinkValue *exc, char *message, fline line, char *file, INTER_FUNCTIONSIG_NOT_ST) {
  285. LinkValue *_new_ = findAttributes(inter->data.object_new, false, exc, inter);
  286. char *type = NULL;
  287. char *error_message = NULL;
  288. setResultCore(result);
  289. gc_addTmpLink(&exc->gc_status);
  290. if (_new_ != NULL){
  291. Argument *arg = makeValueArgument(makeLinkValue(makeStringValue(message, inter), belong, inter));
  292. gc_addTmpLink(&_new_->gc_status);
  293. callBackCore(_new_, arg, line, file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  294. gc_freeTmpLink(&_new_->gc_status);
  295. freeArgument(arg, true);
  296. type = getErrorInfo(result->value, 1, inter);
  297. error_message = getErrorInfo(result->value, 2, inter);
  298. }
  299. else {
  300. result->value = exc;
  301. gc_addTmpLink(&result->value->gc_status);
  302. }
  303. result->type = error_return;
  304. result->error = connectError(makeError(type, error_message, line, file), result->error);
  305. memFree(type);
  306. memFree(error_message);
  307. gc_freeTmpLink(&exc->gc_status);
  308. }
  309. void setResultError(BaseErrorType type, char *error_message, fline line, char *file, bool new, INTER_FUNCTIONSIG_NOT_ST) {
  310. if (!new && result->type != error_return)
  311. return;
  312. if (new) {
  313. Value *exc = findBaseError(type, inter);
  314. if (exc == NULL)
  315. exc = inter->data.base_exc;
  316. freeResult(result);
  317. callException(makeLinkValue(exc, belong, inter), error_message, line, file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  318. }
  319. else
  320. result->error = connectError(makeError(NULL, NULL, line, file), result->error);
  321. }
  322. void setResultOperationNone(Result *ru, Inter *inter, LinkValue *belong) {
  323. setResult(ru, inter, belong);
  324. ru->type = operation_return;
  325. }
  326. void setResultOperation(Result *ru, LinkValue *value) {
  327. freeResult(ru);
  328. setResultOperationBase(ru, value);
  329. }
  330. void setResultOperationBase(Result *ru, LinkValue *value) {
  331. setResultCore(ru);
  332. ru->value = value;
  333. if (value != NULL)
  334. gc_addTmpLink(&ru->value->gc_status);
  335. ru->type = operation_return;
  336. }
  337. void freeResult(Result *ru){
  338. memFree(ru->label);
  339. ru->label = NULL;
  340. freeResultSafe(ru);
  341. if (ru->value != NULL) {
  342. gc_freeTmpLink(&ru->value->gc_status);
  343. ru->value = NULL;
  344. }
  345. }
  346. void freeResultSafe(Result *ru){
  347. if (ru->error != NULL)
  348. freeError(ru);
  349. ru->error = NULL;
  350. }
  351. void printValue(Value *value, FILE *debug, bool print_father) {
  352. switch (value->type){
  353. case number:
  354. fprintf(debug, "%lld", value->data.num.num);
  355. break;
  356. case string:
  357. fprintf(debug, "%s", value->data.str.str);
  358. break;
  359. case function:
  360. if (print_father)
  361. fprintf(debug, "function");
  362. else
  363. fprintf(debug, "(function on %p)", value);
  364. break;
  365. case list:
  366. fprintf(debug, "[");
  367. for (int i=0;i < value->data.list.size;i++){
  368. if (i > 0)
  369. fprintf(debug, ", ", NULL);
  370. printValue(value->data.list.list[i]->value, debug, false);
  371. }
  372. fprintf(debug, " ]", NULL);
  373. break;
  374. case dict: {
  375. Var *tmp = NULL;
  376. bool print_comma = false;
  377. fprintf(debug, "{");
  378. for (int i = 0; i < MAX_SIZE; i++) {
  379. for (tmp = value->data.dict.dict->hashtable[i]; tmp != NULL; tmp = tmp->next) {
  380. if (print_comma)
  381. fprintf(debug, ", ", NULL);
  382. else
  383. print_comma = true;
  384. printValue(tmp->name_->value, debug, false);
  385. fprintf(debug, " ['%s'] : ", tmp->name);
  386. printValue(tmp->value->value, debug, false);
  387. }
  388. }
  389. fprintf(debug, " }", NULL);
  390. break;
  391. }
  392. case none:
  393. fprintf(debug, "(null)", NULL);
  394. break;
  395. case class:
  396. if (print_father)
  397. fprintf(debug, "class");
  398. else
  399. fprintf(debug, "(class on %p)", value);
  400. break;
  401. case object_:
  402. if (print_father)
  403. fprintf(debug, "object");
  404. else
  405. fprintf(debug, "(object on %p)", value);
  406. break;
  407. case bool_:
  408. if (value->data.bool_.bool_)
  409. fprintf(debug, "true");
  410. else
  411. fprintf(debug, "false");
  412. break;
  413. case pass_:
  414. fprintf(debug, "...");
  415. break;
  416. default:
  417. fprintf(debug, "unknown");
  418. break;
  419. }
  420. if (print_father){
  421. fprintf(debug, "(");
  422. printf("<%p>", value);
  423. for (Inherit *fv = value->object.inherit; fv != NULL; fv = fv->next) {
  424. printf(" -> ");
  425. printValue(fv->value->value, debug, false);
  426. }
  427. fprintf(debug, ")");
  428. }
  429. }
  430. void printLinkValue(LinkValue *value, char *first, char *last, FILE *debug){
  431. if (value == NULL)
  432. return;
  433. fprintf(debug, "%s", first);
  434. if (value->belong != NULL) {
  435. printLinkValue(value->belong, "", "", debug);
  436. fprintf(debug, " . ", NULL);
  437. }
  438. if (value->value != NULL)
  439. printValue(value->value, debug, true);
  440. fprintf(debug, "%s", last);
  441. }
  442. Error *makeError(char *type, char *message, fline line, char *file) {
  443. Error *tmp = memCalloc(1, sizeof(Error));
  444. tmp->line = line;
  445. tmp->type = memStrcpy(type);
  446. tmp->messgae = memStrcpy(message);
  447. tmp->file = memStrcpy(file);
  448. tmp->next = NULL;
  449. return tmp;
  450. }
  451. Error *connectError(Error *new, Error *base){
  452. new->next = base;
  453. return new;
  454. }
  455. void freeError(Result *base){
  456. Error *error = base->error;
  457. for (Error *next = NULL; error != NULL; error = next){
  458. next = error->next;
  459. memFree(error->messgae);
  460. memFree(error->type);
  461. memFree(error->file);
  462. memFree(error);
  463. }
  464. base->error = NULL;
  465. }
  466. void printError(Result *result, Inter *inter, bool free) {
  467. for (Error *base = result->error; base != NULL; base = base->next){
  468. if (base->next != NULL)
  469. fprintf(inter->data.inter_stderr, "Error Backtracking: On Line: %lld In file: %s Error ID: %p\n", base->line, base->file, base);
  470. else
  471. fprintf(inter->data.inter_stderr, "%s\n%s\nOn Line: %lld\nIn File: %s\nError ID: %p\n", base->type, base->messgae, base->line, base->file, base);
  472. }
  473. if (free)
  474. freeError(result);
  475. }
  476. inline bool isType(Value *value, enum ValueType type){
  477. return value->type == type;
  478. }
  479. Inherit *makeInherit(LinkValue *value){
  480. Inherit *tmp;
  481. tmp = memCalloc(1, sizeof(Inherit));
  482. tmp->value = value;
  483. tmp->next = NULL;
  484. return tmp;
  485. }
  486. Inherit *copyInheritCore(Inherit *value){
  487. Inherit *tmp;
  488. if (value == NULL)
  489. return NULL;
  490. tmp = makeInherit(value->value);
  491. return tmp;
  492. }
  493. Inherit *copyInherit(Inherit *value){
  494. Inherit *base = NULL;
  495. Inherit **tmp = &base;
  496. for (PASS; value != NULL; value = value->next, tmp = &(*tmp)->next)
  497. *tmp = copyInheritCore(value);
  498. return base;
  499. }
  500. Inherit *freeInherit(Inherit *value){
  501. FREE_BASE(value, error_);
  502. Inherit *next = value->next;
  503. memFree(value);
  504. return next;
  505. error_: return NULL;
  506. }
  507. Inherit *connectInherit(Inherit *base, Inherit *back){
  508. Inherit **tmp = &base;
  509. for (PASS; *tmp != NULL; tmp = &(*tmp)->next)
  510. PASS;
  511. *tmp = back;
  512. return base;
  513. }
  514. Inherit *connectSafeInherit(Inherit *base, Inherit *back){
  515. Inherit **last_node = &base;
  516. if (back == NULL)
  517. goto reutrn_;
  518. for (PASS; *last_node != NULL;)
  519. if ((*last_node)->value->value == back->value->value)
  520. *last_node = freeInherit(*last_node);
  521. else
  522. last_node = &(*last_node)->next;
  523. *last_node = back;
  524. reutrn_: return base;
  525. }
  526. Inherit *getInheritFromValue(Value *value, Inter *inter){
  527. LinkValue *num_father = makeLinkValue(value, inter->base_father, inter);
  528. return getInheritFromValueCore(num_father);
  529. }
  530. Inherit *getInheritFromValueCore(LinkValue *num_father) {
  531. Inherit *object_father;
  532. Argument *father_arg = makeValueArgument(num_father);
  533. gc_addTmpLink(&num_father->gc_status);
  534. object_father = setFather(father_arg);
  535. freeArgument(father_arg, true);
  536. gc_freeTmpLink(&num_father->gc_status);
  537. return object_father;
  538. }
  539. bool needDel(Value *object_value, Inter *inter) {
  540. LinkValue *_del_ = checkStrVar(inter->data.object_del, false, CALL_INTER_FUNCTIONSIG_CORE(object_value->object.var));
  541. enum FunctionPtType type;
  542. if (_del_ == NULL)
  543. return false;
  544. type = _del_->value->data.function.function_data.pt_type;
  545. if ((type == object_free_ || type == object_static_) && object_value->type == class)
  546. return false;
  547. if (_del_->belong == NULL || _del_->belong->value == object_value || checkAttribution(object_value, _del_->belong->value))
  548. return true;
  549. return false;
  550. }
  551. bool callDel(Value *object_value, Result *result, Inter *inter, VarList *var_list) {
  552. LinkValue *_del_ = findStrVar(inter->data.object_del, false, CALL_INTER_FUNCTIONSIG_CORE(object_value->object.var));
  553. setResultCore(result);
  554. if (_del_ != NULL){
  555. gc_addTmpLink(&_del_->gc_status);
  556. if (_del_->belong == NULL || _del_->belong->value != object_value && checkAttribution(object_value, _del_->belong->value))
  557. _del_->belong = makeLinkValue(object_value, inter->base_father, inter);
  558. callBackCore(_del_, NULL, 0, "sys", CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, inter->base_father));
  559. gc_freeTmpLink(&_del_->gc_status);
  560. return true;
  561. } else
  562. return false;
  563. }
  564. /**
  565. * 检查 father 是否为 self 的父亲
  566. * @param self
  567. * @param father
  568. * @return
  569. */
  570. bool checkAttribution(Value *self, Value *father){
  571. for (Inherit *self_father = self->object.inherit; self_father != NULL; self_father = self_father->next)
  572. if (self_father->value->value == father)
  573. return true;
  574. return false;
  575. }