value.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734
  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 = V_obj;
  7. tmp->gc_next = NULL;
  8. if (inter->data.object != NULL && inherit == NULL)
  9. inherit = makeInherit(inter->data.object);
  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 *useNoneValue(Inter *inter, Result *result) {
  28. LinkValue *tmp = inter->data.none;
  29. if (result != NULL) {
  30. setResultCore(result);
  31. result->type = R_opt;
  32. result->value = tmp;
  33. gc_addTmpLink(&result->value->gc_status);
  34. }
  35. return tmp->value;
  36. }
  37. Value *makeBoolValue(bool bool_num, fline line, char *file, FUNC_NT) {
  38. Value *tmp = NULL;
  39. setResultCore(result);
  40. callBackCore(inter->data.bool_, NULL, line, file, 0, CNEXT_NT);
  41. if (!CHECK_RESULT(result))
  42. return NULL;
  43. tmp = result->value->value;
  44. tmp->data.bool_.bool_ = bool_num;
  45. return tmp;
  46. }
  47. Value *makePassValue(fline line, char *file, FUNC_NT){ // TODO-szh 让切片支持该语法 检查语法解析器支持 a[::]的语法
  48. Value *tmp = NULL;
  49. setResultCore(result);
  50. callBackCore(inter->data.pass_, NULL, line, file, 0, CNEXT_NT);
  51. if (!CHECK_RESULT(result))
  52. return NULL;
  53. tmp = result->value->value;
  54. return tmp;
  55. }
  56. Value *makeNumberValue(vnum num, fline line, char *file, FUNC_NT) {
  57. Value *tmp = NULL;
  58. setResultCore(result);
  59. callBackCore(inter->data.num, NULL, line, file, 0, CNEXT_NT);
  60. if (!CHECK_RESULT(result))
  61. return NULL;
  62. tmp = result->value->value;
  63. tmp->data.num.num = num;
  64. return tmp;
  65. }
  66. Value *makeStringValue(wchar_t *str, fline line, char *file, FUNC_NT) {
  67. Value *tmp = NULL;
  68. setResultCore(result);
  69. callBackCore(inter->data.str, NULL, line, file, 0, CNEXT_NT);
  70. if (!CHECK_RESULT(result))
  71. return NULL;
  72. tmp = result->value->value;
  73. memFree(tmp->data.str.str);
  74. tmp->data.str.str = memWidecpy(str);
  75. return tmp;
  76. }
  77. Value *makeVMFunctionValue(Statement *st, Parameter *pt, FUNC_NT) {
  78. Value *tmp = NULL;
  79. callBackCore(inter->data.function, NULL, st->line, st->code_file, 0,
  80. CNEXT_NT);
  81. if (!CHECK_RESULT(result))
  82. return NULL;
  83. tmp = result->value->value;
  84. tmp->data.function.function = copyStatement(st);
  85. tmp->data.function.pt = copyParameter(pt);
  86. tmp->data.function.function_data.cls = belong;
  87. for (VarList *vl = tmp->object.out_var, *vl_next; vl != NULL; vl = vl_next) {
  88. vl_next = vl->next;
  89. freeVarList(vl);
  90. }
  91. tmp->object.out_var = copyVarList(var_list, false, inter);
  92. result->value->belong = belong;
  93. return tmp;
  94. }
  95. Value *makeCFunctionValue(OfficialFunction of, fline line, char *file, FUNC_NT) {
  96. Value *tmp = NULL;
  97. callBackCore(inter->data.function, NULL, line, file, 0,
  98. CNEXT_NT);
  99. if (!CHECK_RESULT(result))
  100. return NULL;
  101. tmp = result->value->value;
  102. tmp->data.function.type = c_func;
  103. tmp->data.function.of = of;
  104. tmp->data.function.function_data.pt_type = inter->data.default_pt_type;
  105. tmp->data.function.function_data.cls = belong;
  106. for (VarList *vl = tmp->object.out_var, *vl_next; vl != NULL; vl = vl_next) {
  107. vl_next = vl->next;
  108. freeVarList(vl);
  109. }
  110. tmp->object.out_var = copyVarList(var_list, false, inter);
  111. result->value->belong = belong;
  112. return tmp;
  113. }
  114. LinkValue *makeCFunctionFromOf(OfficialFunction of, LinkValue *func, OfficialFunction function_new, OfficialFunction function_init, LinkValue *belong, VarList *var_list, Inter *inter) {
  115. Argument *arg = makeValueArgument(func);
  116. Argument *init_arg = NULL;
  117. LinkValue *return_ = NULL;
  118. Result result;
  119. setResultCore(&result);
  120. function_new(CO_FUNC(arg, func->value->object.var, &result, func));
  121. return_ = result.value;
  122. result.value = NULL;
  123. freeResult(&result);
  124. init_arg = makeValueArgument(return_);
  125. function_init(CO_FUNC(init_arg, func->value->object.var, &result, func));
  126. freeResult(&result);
  127. freeArgument(init_arg, true);
  128. freeArgument(arg, true);
  129. return_->value->data.function.type = c_func;
  130. return_->value->data.function.of = of;
  131. return_->value->data.function.function_data.pt_type = inter->data.default_pt_type;
  132. return_->value->data.function.function_data.cls = belong;
  133. for (VarList *vl = return_->value->object.out_var; vl != NULL; vl = freeVarList(vl))
  134. PASS;
  135. return_->value->object.out_var = copyVarList(var_list, false, inter);
  136. return_->belong = belong;
  137. gc_freeTmpLink(&return_->gc_status);
  138. return return_;
  139. }
  140. Value *makeClassValue(VarList *var_list, Inter *inter, Inherit *father) {
  141. Value *tmp;
  142. VarList *new_var = copyVarList(var_list, false, inter);
  143. tmp = makeObject(inter, NULL, new_var, father);
  144. tmp->type = V_class;
  145. return tmp;
  146. }
  147. Value *makeListValue(Argument *arg, fline line, char *file, enum ListType type, FUNC_NT) {
  148. Value *tmp = NULL;
  149. setResultCore(result);
  150. if (type == L_list)
  151. callBackCore(inter->data.list, arg, line, file, 0,
  152. CNEXT_NT);
  153. else
  154. callBackCore(inter->data.tuple, arg, line, file, 0,
  155. CNEXT_NT);
  156. if (!CHECK_RESULT(result))
  157. return NULL;
  158. tmp = result->value->value;
  159. return tmp;
  160. }
  161. Value *makeDictValue(Argument *arg, bool new_hash, fline line, char *file, FUNC_NT) {
  162. Value *tmp = NULL;
  163. setResultCore(result);
  164. callBackCore(inter->data.dict, arg, line, file, 0, CNEXT_NT);
  165. if (!CHECK_RESULT(result))
  166. return NULL;
  167. tmp = result->value->value;
  168. if (!new_hash) {
  169. tmp->data.dict.dict = NULL;
  170. tmp->data.dict.size = 0;
  171. }
  172. return tmp;
  173. }
  174. void freeValue(Value **value) {
  175. Value *free_value = *value;
  176. FREE_BASE(free_value, return_);
  177. for (VarList *tmp = free_value->object.var; tmp != NULL; tmp = freeVarList(tmp))
  178. PASS;
  179. for (VarList *tmp = free_value->object.out_var; tmp != NULL; tmp = freeVarList(tmp))
  180. PASS;
  181. for (struct Inherit *tmp = free_value->object.inherit; tmp != NULL; tmp = freeInherit(tmp))
  182. PASS;
  183. switch (free_value->type) {
  184. case V_str:
  185. memFree(free_value->data.str.str);
  186. break;
  187. case V_func: {
  188. freeParameter(free_value->data.function.pt, true);
  189. freeStatement(free_value->data.function.function);
  190. break;
  191. }
  192. case V_list:
  193. memFree(free_value->data.list.list);
  194. break;
  195. default:
  196. break;
  197. }
  198. if ((*value)->gc_next != NULL)
  199. (*value)->gc_next->gc_last = (*value)->gc_last;
  200. *value = (*value)->gc_next;
  201. memFree(free_value);
  202. return_: return;
  203. }
  204. LinkValue *makeLinkValue(Value *value, LinkValue *belong, Inter *inter){
  205. LinkValue *tmp;
  206. LinkValue *list_tmp = inter->link_base;
  207. tmp = memCalloc(1, sizeof(Value));
  208. tmp->belong = belong;
  209. tmp->value = value;
  210. setGC(&tmp->gc_status);
  211. if (list_tmp == NULL){
  212. inter->link_base = tmp;
  213. tmp->gc_last = NULL;
  214. goto return_;
  215. }
  216. for (PASS; list_tmp->gc_next != NULL; list_tmp = list_tmp->gc_next)
  217. PASS;
  218. list_tmp->gc_next = tmp;
  219. tmp->gc_last = list_tmp;
  220. tmp->aut = auto_aut;
  221. return_:
  222. return tmp;
  223. }
  224. void freeLinkValue(LinkValue **value) {
  225. LinkValue *free_value = *value;
  226. FREE_BASE(free_value, return_);
  227. if ((*value)->gc_next != NULL)
  228. (*value)->gc_next->gc_last = (*value)->gc_last;
  229. *value = (*value)->gc_next;
  230. memFree(free_value);
  231. return_: return;
  232. }
  233. LinkValue *copyLinkValue(LinkValue *value, Inter *inter) {
  234. LinkValue *tmp = NULL;
  235. if (value == NULL)
  236. return NULL;
  237. tmp = makeLinkValue(value->value, value->belong, inter);
  238. tmp->aut = value->aut;
  239. return tmp;
  240. }
  241. void setResultCore(Result *ru) {
  242. ru->type = R_not;
  243. ru->times = 0;
  244. ru->is_yield = false;
  245. ru->error = NULL;
  246. ru->value = NULL;
  247. ru->label = NULL;
  248. ru->node = NULL;
  249. }
  250. void setResult(Result *ru, Inter *inter) {
  251. freeResult(ru);
  252. setResultBase(ru, inter);
  253. }
  254. void setResultBase(Result *ru, Inter *inter) {
  255. setResultCore(ru);
  256. useNoneValue(inter, ru);
  257. }
  258. void setResultErrorSt(BaseErrorType type, wchar_t *error_message, bool new, Statement *st, FUNC_NT) {
  259. setResultError(type, error_message, st->line, st->code_file, new, CNEXT_NT);
  260. }
  261. LinkValue *findBaseError(BaseErrorType type, Inter *inter){
  262. switch (type) {
  263. case E_BaseException:
  264. return inter->data.base_exc;
  265. case E_Exception:
  266. return inter->data.exc;
  267. case E_TypeException:
  268. return inter->data.type_exc;
  269. case E_ArgumentException:
  270. return inter->data.arg_exc;
  271. case E_PermissionsException:
  272. return inter->data.per_exc;
  273. case E_GotoException:
  274. return inter->data.goto_exc;
  275. case E_ResultException:
  276. return inter->data.result_exc;
  277. case E_NameExceptiom:
  278. return inter->data.name_exc;
  279. case E_AssertException:
  280. return inter->data.assert_exc;
  281. case E_IndexException:
  282. return inter->data.index_exc;
  283. case E_KeyException:
  284. return inter->data.key_exc;
  285. case E_StrideException:
  286. return inter->data.stride_exc;
  287. case E_StopIterException:
  288. return inter->data.iterstop_exc;
  289. case E_SuperException:
  290. return inter->data.super_exc;
  291. case E_ImportException:
  292. return inter->data.import_exc;
  293. case E_IncludeException:
  294. return inter->data.include_exp;
  295. case E_SystemException:
  296. return inter->data.sys_exc;
  297. case E_KeyInterrupt:
  298. return inter->data.keyInterrupt_exc;
  299. case E_QuitException:
  300. return inter->data.quit_exc;
  301. default:
  302. return NULL;
  303. }
  304. }
  305. static wchar_t *getErrorInfo(LinkValue *exc, int type, FUNC_NT){
  306. wchar_t *str_name = type == 1 ? inter->data.object_name : inter->data.object_message;
  307. LinkValue *_info_;
  308. setResultCore(result);
  309. gc_addTmpLink(&exc->gc_status);
  310. _info_ = findAttributes(str_name, false, LINEFILE, true, CFUNC_NT(var_list, result, exc));
  311. gc_freeTmpLink(&exc->gc_status);
  312. if (!CHECK_RESULT(result))
  313. return NULL;
  314. if (_info_ != NULL && _info_->value->type == V_str)
  315. return memWidecpy(_info_->value->data.str.str);
  316. else
  317. return type == 1 ? memWidecpy(L"Error Type: Unknown") : memWidecpy(L"Error Message: Unknown");
  318. }
  319. void callException(LinkValue *exc, wchar_t *message, fline line, char *file, FUNC_NT) {
  320. LinkValue *_new_;
  321. wchar_t *type = NULL;
  322. wchar_t *error_message = NULL;
  323. setResultCore(result);
  324. gc_addTmpLink(&exc->gc_status);
  325. _new_ = findAttributes(inter->data.object_new, false, LINEFILE, true, CFUNC_NT(var_list, result, exc));
  326. if (!CHECK_RESULT(result))
  327. goto return_;
  328. freeResult(result);
  329. if (_new_ != NULL){
  330. Argument *arg = NULL;
  331. LinkValue *error;
  332. makeStringValue(message, line, file, CNEXT_NT);
  333. if (!CHECK_RESULT(result))
  334. goto return_;
  335. arg = makeValueArgument(result->value);
  336. freeResult(result);
  337. gc_addTmpLink(&_new_->gc_status);
  338. callBackCore(_new_, arg, line, file, 0, CNEXT_NT);
  339. error = result->value;
  340. result->value = NULL;
  341. freeResult(result);
  342. gc_freeTmpLink(&_new_->gc_status);
  343. freeArgument(arg, true);
  344. type = getErrorInfo(error, 1, CNEXT_NT);
  345. if (!CHECK_RESULT(result))
  346. goto return_;
  347. freeResult(result);
  348. error_message = getErrorInfo(error, 2, CNEXT_NT);
  349. if (!CHECK_RESULT(result))
  350. goto return_;
  351. freeResult(result);
  352. }
  353. else {
  354. result->value = exc;
  355. gc_addTmpLink(&result->value->gc_status);
  356. }
  357. result->type = R_error;
  358. result->error = connectError(makeError(type, error_message, line, file), result->error);
  359. memFree(type);
  360. memFree(error_message);
  361. return_: gc_freeTmpLink(&exc->gc_status);
  362. }
  363. void setResultError(BaseErrorType type, wchar_t *error_message, fline line, char *file, bool new, FUNC_NT) {
  364. if (!new && result->type != R_error)
  365. return;
  366. if (new) {
  367. LinkValue *exc = findBaseError(type, inter);
  368. if (exc == NULL)
  369. exc = inter->data.base_exc;
  370. freeResult(result);
  371. callException(exc, error_message, line, file, CNEXT_NT);
  372. }
  373. else
  374. result->error = connectError(makeError(NULL, NULL, line, file), result->error);
  375. }
  376. void setResultOperationNone(Result *ru, Inter *inter, LinkValue *belong) {
  377. setResult(ru, inter);
  378. ru->type = R_opt;
  379. }
  380. void setResultOperation(Result *ru, LinkValue *value) {
  381. freeResult(ru);
  382. setResultOperationBase(ru, value);
  383. }
  384. void setResultOperationBase(Result *ru, LinkValue *value) {
  385. setResultCore(ru);
  386. ru->value = value;
  387. if (value != NULL)
  388. gc_addTmpLink(&ru->value->gc_status);
  389. ru->type = R_opt;
  390. }
  391. void freeResult(Result *ru){
  392. memFree(ru->label);
  393. ru->label = NULL;
  394. if (ru->error != NULL)
  395. freeError(ru);
  396. ru->error = NULL;
  397. if (ru->value != NULL) {
  398. gc_freeTmpLink(&ru->value->gc_status);
  399. ru->value = NULL;
  400. }
  401. setResultCore(ru);
  402. }
  403. Error *makeError(wchar_t *type, wchar_t *message, fline line, char *file) {
  404. Error *tmp = memCalloc(1, sizeof(Error));
  405. tmp->line = line;
  406. tmp->type = memWidecpy(type);
  407. tmp->messgae = memWidecpy(message);
  408. tmp->file = memStrcpy(file);
  409. tmp->next = NULL;
  410. return tmp;
  411. }
  412. Error *connectError(Error *new, Error *base){
  413. new->next = base;
  414. return new;
  415. }
  416. void freeError(Result *base){
  417. Error *error = base->error;
  418. for (Error *next = NULL; error != NULL; error = next){
  419. next = error->next;
  420. memFree(error->messgae);
  421. memFree(error->type);
  422. memFree(error->file);
  423. memFree(error);
  424. }
  425. base->error = NULL;
  426. }
  427. void printError(Result *result, Inter *inter, bool free) {
  428. for (Error *base = result->error; base != NULL; base = base->next){
  429. if (base->next != NULL)
  430. fprintf(inter->data.inter_stderr, "Error Backtracking: On Line: %lld In file: %s Error ID: %p\n", base->line, base->file, base);
  431. else
  432. fprintf(inter->data.inter_stderr, "%ls\n%ls\nOn Line: %lld\nIn File: %s\nError ID: %p\n", base->type, base->messgae, base->line, base->file, base);
  433. }
  434. if (free)
  435. freeError(result);
  436. fflush(inter->data.inter_stderr);
  437. }
  438. inline bool isType(Value *value, enum ValueType type){
  439. return value->type == type;
  440. }
  441. Inherit *makeInherit(LinkValue *value){
  442. Inherit *tmp;
  443. tmp = memCalloc(1, sizeof(Inherit));
  444. tmp->value = value;
  445. tmp->next = NULL;
  446. return tmp;
  447. }
  448. Inherit *copyInheritCore(Inherit *value){
  449. Inherit *tmp;
  450. if (value == NULL)
  451. return NULL;
  452. tmp = makeInherit(value->value);
  453. return tmp;
  454. }
  455. Inherit *copyInherit(Inherit *value){
  456. Inherit *base = NULL;
  457. Inherit **tmp = &base;
  458. for (PASS; value != NULL; value = value->next, tmp = &(*tmp)->next)
  459. *tmp = copyInheritCore(value);
  460. return base;
  461. }
  462. Inherit *freeInherit(Inherit *value){
  463. FREE_BASE(value, error_);
  464. Inherit *next = value->next;
  465. memFree(value);
  466. return next;
  467. error_: return NULL;
  468. }
  469. Inherit *connectInherit(Inherit *base, Inherit *back){
  470. Inherit **tmp = &base;
  471. for (PASS; *tmp != NULL; tmp = &(*tmp)->next)
  472. PASS;
  473. *tmp = back;
  474. return base;
  475. }
  476. Inherit *connectSafeInherit(Inherit *base, Inherit *back){
  477. Inherit **last_node = &base;
  478. if (back == NULL)
  479. goto return_;
  480. for (PASS; *last_node != NULL;)
  481. if ((*last_node)->value->value == back->value->value)
  482. *last_node = freeInherit(*last_node);
  483. else
  484. last_node = &(*last_node)->next;
  485. *last_node = back;
  486. return_: return base;
  487. }
  488. Inherit *getInheritFromValueCore(LinkValue *num_father) {
  489. Inherit *object_father;
  490. Argument *father_arg = makeValueArgument(num_father);
  491. gc_addTmpLink(&num_father->gc_status);
  492. object_father = setFather(father_arg);
  493. freeArgument(father_arg, true);
  494. gc_freeTmpLink(&num_father->gc_status);
  495. return object_father;
  496. }
  497. Package *makePackage(Value *value, char *md5, char *name, Package *base) {
  498. Package *tmp = memCalloc(1, sizeof(Package));
  499. Package *tmp_base = base;
  500. tmp->name = memStrcpy(name);
  501. tmp->md5 = memStrcpy(md5);
  502. tmp->package = value;
  503. gc_addStatementLink(&value->gc_status);
  504. tmp->next = NULL;
  505. if (base == NULL)
  506. return tmp;
  507. for (PASS; tmp_base->next != NULL; tmp_base = tmp_base->next)
  508. PASS;
  509. tmp_base->next = tmp;
  510. return base;
  511. }
  512. void freePackage(Package *base) {
  513. for (Package *next; base != NULL; base = next) {
  514. next = base->next;
  515. gc_freeStatementLink(&base->package->gc_status);
  516. memFree(base->name);
  517. memFree(base->md5);
  518. memFree(base);
  519. }
  520. }
  521. Value *checkPackage(Package *base, char *md5, char *name) {
  522. for (PASS; base != NULL; base = base->next) {
  523. if (eqString(name, base->name) && eqString(md5, base->md5))
  524. return base->package;
  525. }
  526. return NULL;
  527. }
  528. bool needDel(Value *object_value, Inter *inter) {
  529. LinkValue *_del_ = checkStrVar(inter->data.object_del, false, CFUNC_CORE(object_value->object.var));
  530. enum FunctionPtType type;
  531. if (_del_ == NULL)
  532. return false;
  533. type = _del_->value->data.function.function_data.pt_type;
  534. if ((type == object_free_ || type == object_static_) && object_value->type == V_class)
  535. return false;
  536. if (_del_->belong == NULL || _del_->belong->value == object_value || checkAttribution(object_value, _del_->belong->value))
  537. return true;
  538. return false;
  539. }
  540. bool callDel(Value *object_value, Result *result, Inter *inter, VarList *var_list) {
  541. LinkValue *_del_ = findStrVarOnly(inter->data.object_del, false, CFUNC_CORE(object_value->object.var));
  542. setResultCore(result);
  543. if (_del_ != NULL){
  544. gc_addTmpLink(&_del_->gc_status);
  545. if (_del_->belong == NULL || _del_->belong->value != object_value && checkAttribution(object_value, _del_->belong->value))
  546. _del_->belong = makeLinkValue(object_value, inter->base_belong, inter);
  547. callBackCore(_del_, NULL, LINEFILE, 0, CFUNC_NT(var_list, result, inter->base_belong));
  548. gc_freeTmpLink(&_del_->gc_status);
  549. return true;
  550. } else
  551. return false;
  552. }
  553. /**
  554. * 检查 father 是否为 self 的父亲
  555. * @param self
  556. * @param father
  557. * @return
  558. */
  559. bool checkAttribution(Value *self, Value *father){
  560. for (Inherit *self_father = self->object.inherit; self_father != NULL; self_father = self_father->next)
  561. if (self_father->value->value == father)
  562. return true;
  563. return false;
  564. }
  565. void printValue(Value *value, FILE *debug, bool print_father, bool print_in) {
  566. switch (value->type){
  567. case V_num:
  568. fprintf(debug, "(%lld)", value->data.num.num);
  569. break;
  570. case V_str:
  571. fprintf(debug, "'%ls'", value->data.str.str);
  572. break;
  573. case V_func:
  574. if (print_father)
  575. fprintf(debug, "func");
  576. else
  577. fprintf(debug, "(func on %p)", value);
  578. break;
  579. case V_list:
  580. if (print_in){
  581. fprintf(debug, "[");
  582. for (int i = 0; i < value->data.list.size; i++) {
  583. if (i > 0)
  584. fprintf(debug, ", ", NULL);
  585. printValue(value->data.list.list[i]->value, debug, false, false);
  586. }
  587. fprintf(debug, " ]", NULL);
  588. } else
  589. fprintf(debug, "[list]", NULL);
  590. break;
  591. case V_dict:
  592. if (print_in){
  593. Var *tmp = NULL;
  594. bool print_comma = false;
  595. fprintf(debug, "{");
  596. for (int i = 0; i < MAX_SIZE; i++) {
  597. for (tmp = value->data.dict.dict->hashtable[i]; tmp != NULL; tmp = tmp->next) {
  598. if (print_comma)
  599. fprintf(debug, ", ", NULL);
  600. else
  601. print_comma = true;
  602. printValue(tmp->name_->value, debug, false, false);
  603. fprintf(debug, " ['%ls'] : ", tmp->name);
  604. printValue(tmp->value->value, debug, false, false);
  605. }
  606. }
  607. fprintf(debug, " }", NULL);
  608. } else
  609. fprintf(debug, "[dict]", NULL);
  610. break;
  611. case V_none:
  612. fprintf(debug, "(null)", NULL);
  613. break;
  614. case V_class:
  615. if (print_father)
  616. fprintf(debug, "class");
  617. else
  618. fprintf(debug, "(class on %p)", value);
  619. break;
  620. case V_obj:
  621. if (print_father)
  622. fprintf(debug, "object");
  623. else
  624. fprintf(debug, "(object on %p)", value);
  625. break;
  626. case V_bool:
  627. if (value->data.bool_.bool_)
  628. fprintf(debug, "true");
  629. else
  630. fprintf(debug, "false");
  631. break;
  632. case V_ell:
  633. fprintf(debug, "...");
  634. break;
  635. default:
  636. fprintf(debug, "unknown");
  637. break;
  638. }
  639. if (print_father){
  640. fprintf(debug, "(");
  641. printf("<%p>", value);
  642. for (Inherit *fv = value->object.inherit; fv != NULL; fv = fv->next) {
  643. printf(" -> ");
  644. printValue(fv->value->value, debug, false, false);
  645. }
  646. fprintf(debug, ")");
  647. }
  648. }
  649. void printLinkValue(LinkValue *value, char *first, char *last, FILE *debug){
  650. if (value == NULL)
  651. return;
  652. fprintf(debug, "%s", first);
  653. if (value->belong != NULL) {
  654. printLinkValue(value->belong, "", "", debug);
  655. fprintf(debug, " . ", NULL);
  656. }
  657. if (value->value != NULL)
  658. printValue(value->value, debug, true, true);
  659. fprintf(debug, "%s", last);
  660. }