value.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754
  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_file:
  188. memFree(free_value->data.file.mode);
  189. memFree(free_value->data.file.path);
  190. // file在__del__中释放
  191. break;
  192. case V_func: {
  193. freeParameter(free_value->data.function.pt, true);
  194. freeStatement(free_value->data.function.function);
  195. break;
  196. }
  197. case V_list:
  198. memFree(free_value->data.list.list);
  199. break;
  200. default:
  201. break;
  202. }
  203. if ((*value)->gc_next != NULL)
  204. (*value)->gc_next->gc_last = (*value)->gc_last;
  205. *value = (*value)->gc_next;
  206. memFree(free_value);
  207. return_: return;
  208. }
  209. LinkValue *makeLinkValue(Value *value, LinkValue *belong, Inter *inter){
  210. LinkValue *tmp;
  211. LinkValue *list_tmp = inter->link_base;
  212. tmp = memCalloc(1, sizeof(Value));
  213. tmp->belong = belong;
  214. tmp->value = value;
  215. setGC(&tmp->gc_status);
  216. if (list_tmp == NULL){
  217. inter->link_base = tmp;
  218. tmp->gc_last = NULL;
  219. goto return_;
  220. }
  221. for (PASS; list_tmp->gc_next != NULL; list_tmp = list_tmp->gc_next)
  222. PASS;
  223. list_tmp->gc_next = tmp;
  224. tmp->gc_last = list_tmp;
  225. tmp->aut = auto_aut;
  226. return_:
  227. return tmp;
  228. }
  229. void freeLinkValue(LinkValue **value) {
  230. LinkValue *free_value = *value;
  231. FREE_BASE(free_value, return_);
  232. if ((*value)->gc_next != NULL)
  233. (*value)->gc_next->gc_last = (*value)->gc_last;
  234. *value = (*value)->gc_next;
  235. memFree(free_value);
  236. return_: return;
  237. }
  238. LinkValue *copyLinkValue(LinkValue *value, Inter *inter) {
  239. LinkValue *tmp = NULL;
  240. if (value == NULL)
  241. return NULL;
  242. tmp = makeLinkValue(value->value, value->belong, inter);
  243. tmp->aut = value->aut;
  244. return tmp;
  245. }
  246. void setResultCore(Result *ru) {
  247. ru->type = R_not;
  248. ru->times = 0;
  249. ru->is_yield = false;
  250. ru->error = NULL;
  251. ru->value = NULL;
  252. ru->label = NULL;
  253. ru->node = NULL;
  254. }
  255. void setResult(Result *ru, Inter *inter) {
  256. freeResult(ru);
  257. setResultBase(ru, inter);
  258. }
  259. void setResultBase(Result *ru, Inter *inter) {
  260. setResultCore(ru);
  261. useNoneValue(inter, ru);
  262. }
  263. void setResultErrorSt(BaseErrorType type, wchar_t *error_message, bool new, Statement *st, FUNC_NT) {
  264. setResultError(type, error_message, st->line, st->code_file, new, CNEXT_NT);
  265. }
  266. LinkValue *findBaseError(BaseErrorType type, Inter *inter){
  267. switch (type) {
  268. case E_BaseException:
  269. return inter->data.base_exc;
  270. case E_Exception:
  271. return inter->data.exc;
  272. case E_TypeException:
  273. return inter->data.type_exc;
  274. case E_ArgumentException:
  275. return inter->data.arg_exc;
  276. case E_PermissionsException:
  277. return inter->data.per_exc;
  278. case E_GotoException:
  279. return inter->data.goto_exc;
  280. case E_ResultException:
  281. return inter->data.result_exc;
  282. case E_NameExceptiom:
  283. return inter->data.name_exc;
  284. case E_AssertException:
  285. return inter->data.assert_exc;
  286. case E_IndexException:
  287. return inter->data.index_exc;
  288. case E_KeyException:
  289. return inter->data.key_exc;
  290. case E_StrideException:
  291. return inter->data.stride_exc;
  292. case E_StopIterException:
  293. return inter->data.iterstop_exc;
  294. case E_SuperException:
  295. return inter->data.super_exc;
  296. case E_ImportException:
  297. return inter->data.import_exc;
  298. case E_IncludeException:
  299. return inter->data.include_exp;
  300. case E_SystemException:
  301. return inter->data.sys_exc;
  302. case E_KeyInterrupt:
  303. return inter->data.keyInterrupt_exc;
  304. case E_QuitException:
  305. return inter->data.quit_exc;
  306. default:
  307. return NULL;
  308. }
  309. }
  310. static wchar_t *getErrorInfo(LinkValue *exc, int type, FUNC_NT){
  311. wchar_t *str_name = type == 1 ? inter->data.object_name : inter->data.object_message;
  312. LinkValue *_info_;
  313. setResultCore(result);
  314. gc_addTmpLink(&exc->gc_status);
  315. _info_ = findAttributes(str_name, false, LINEFILE, true, CFUNC_NT(var_list, result, exc));
  316. gc_freeTmpLink(&exc->gc_status);
  317. if (!CHECK_RESULT(result))
  318. return NULL;
  319. if (_info_ != NULL && _info_->value->type == V_str)
  320. return memWidecpy(_info_->value->data.str.str);
  321. else
  322. return type == 1 ? memWidecpy(L"Error Type: Unknown") : memWidecpy(L"Error Message: Unknown");
  323. }
  324. void callException(LinkValue *exc, wchar_t *message, fline line, char *file, FUNC_NT) {
  325. LinkValue *_new_;
  326. wchar_t *type = NULL;
  327. wchar_t *error_message = NULL;
  328. setResultCore(result);
  329. gc_addTmpLink(&exc->gc_status);
  330. _new_ = findAttributes(inter->data.object_new, false, LINEFILE, true, CFUNC_NT(var_list, result, exc));
  331. if (!CHECK_RESULT(result))
  332. goto return_;
  333. freeResult(result);
  334. if (_new_ != NULL){
  335. Argument *arg = NULL;
  336. LinkValue *error;
  337. makeStringValue(message, line, file, CNEXT_NT);
  338. if (!CHECK_RESULT(result))
  339. goto return_;
  340. arg = makeValueArgument(result->value);
  341. freeResult(result);
  342. gc_addTmpLink(&_new_->gc_status);
  343. callBackCore(_new_, arg, line, file, 0, CNEXT_NT);
  344. error = result->value;
  345. result->value = NULL;
  346. freeResult(result); // 没有释放error的tmp link, 等于error的tmp link添加了两次
  347. gc_freeTmpLink(&_new_->gc_status);
  348. freeArgument(arg, true);
  349. type = getErrorInfo(error, 1, CNEXT_NT);
  350. if (!CHECK_RESULT(result))
  351. goto return_;
  352. freeResult(result);
  353. error_message = getErrorInfo(error, 2, CNEXT_NT);
  354. if (!CHECK_RESULT(result))
  355. goto return_;
  356. freeResult(result);
  357. setResultOperation(result, error); // 自动再次添加error的tmp link, error目前tmp link被添加了两次
  358. gc_freeTmpLink(&error->gc_status); // 释放error的tmp link
  359. }
  360. else {
  361. result->value = exc;
  362. gc_addTmpLink(&result->value->gc_status);
  363. }
  364. result->type = R_error;
  365. result->error = connectError(makeError(type, error_message, line, file), result->error);
  366. memFree(type);
  367. memFree(error_message);
  368. return_: gc_freeTmpLink(&exc->gc_status);
  369. }
  370. void setResultError(BaseErrorType type, wchar_t *error_message, fline line, char *file, bool new, FUNC_NT) {
  371. if (!new && result->type != R_error)
  372. return;
  373. if (new) {
  374. LinkValue *exc = findBaseError(type, inter);
  375. if (exc == NULL)
  376. exc = inter->data.base_exc;
  377. freeResult(result);
  378. callException(exc, error_message, line, file, CNEXT_NT);
  379. }
  380. else
  381. result->error = connectError(makeError(NULL, NULL, line, file), result->error);
  382. }
  383. void setResultOperationNone(Result *ru, Inter *inter, LinkValue *belong) {
  384. setResult(ru, inter);
  385. ru->type = R_opt;
  386. }
  387. void setResultOperation(Result *ru, LinkValue *value) {
  388. freeResult(ru);
  389. setResultOperationBase(ru, value);
  390. }
  391. void setResultOperationBase(Result *ru, LinkValue *value) {
  392. setResultCore(ru);
  393. ru->value = value;
  394. if (value != NULL)
  395. gc_addTmpLink(&ru->value->gc_status);
  396. ru->type = R_opt;
  397. }
  398. void freeResult(Result *ru){
  399. memFree(ru->label);
  400. ru->label = NULL;
  401. if (ru->error != NULL)
  402. freeError(ru);
  403. ru->error = NULL;
  404. if (ru->value != NULL) {
  405. gc_freeTmpLink(&ru->value->gc_status);
  406. ru->value = NULL;
  407. }
  408. setResultCore(ru);
  409. }
  410. Error *makeError(wchar_t *type, wchar_t *message, fline line, char *file) {
  411. Error *tmp = memCalloc(1, sizeof(Error));
  412. tmp->line = line;
  413. tmp->type = memWidecpy(type);
  414. tmp->messgae = memWidecpy(message);
  415. tmp->file = memStrcpy(file);
  416. tmp->next = NULL;
  417. return tmp;
  418. }
  419. Error *connectError(Error *new, Error *base){
  420. new->next = base;
  421. return new;
  422. }
  423. void freeError(Result *base){
  424. Error *error = base->error;
  425. for (Error *next = NULL; error != NULL; error = next){
  426. next = error->next;
  427. memFree(error->messgae);
  428. memFree(error->type);
  429. memFree(error->file);
  430. memFree(error);
  431. }
  432. base->error = NULL;
  433. }
  434. void printError(Result *result, Inter *inter, bool free) {
  435. for (Error *base = result->error; base != NULL; base = base->next){
  436. if (base->next != NULL)
  437. fprintf(inter->data.inter_stderr, "Error Backtracking: On Line: %lld In file: %s Error ID: %p\n", base->line, base->file, base);
  438. else
  439. 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);
  440. }
  441. if (free)
  442. freeError(result);
  443. fflush(inter->data.inter_stderr);
  444. }
  445. inline bool isType(Value *value, enum ValueType type){
  446. return value->type == type;
  447. }
  448. Inherit *makeInherit(LinkValue *value){
  449. Inherit *tmp;
  450. tmp = memCalloc(1, sizeof(Inherit));
  451. tmp->value = value;
  452. tmp->next = NULL;
  453. return tmp;
  454. }
  455. Inherit *copyInheritCore(Inherit *value){
  456. Inherit *tmp;
  457. if (value == NULL)
  458. return NULL;
  459. tmp = makeInherit(value->value);
  460. return tmp;
  461. }
  462. Inherit *copyInherit(Inherit *value){
  463. Inherit *base = NULL;
  464. Inherit **tmp = &base;
  465. for (PASS; value != NULL; value = value->next, tmp = &(*tmp)->next)
  466. *tmp = copyInheritCore(value);
  467. return base;
  468. }
  469. Inherit *freeInherit(Inherit *value){
  470. FREE_BASE(value, error_);
  471. Inherit *next = value->next;
  472. memFree(value);
  473. return next;
  474. error_: return NULL;
  475. }
  476. Inherit *connectInherit(Inherit *base, Inherit *back){
  477. Inherit **tmp = &base;
  478. for (PASS; *tmp != NULL; tmp = &(*tmp)->next)
  479. PASS;
  480. *tmp = back;
  481. return base;
  482. }
  483. Inherit *connectSafeInherit(Inherit *base, Inherit *back){
  484. Inherit **last_node = &base;
  485. if (back == NULL)
  486. goto return_;
  487. for (PASS; *last_node != NULL;)
  488. if ((*last_node)->value->value == back->value->value)
  489. *last_node = freeInherit(*last_node);
  490. else
  491. last_node = &(*last_node)->next;
  492. *last_node = back;
  493. return_: return base;
  494. }
  495. Inherit *getInheritFromValueCore(LinkValue *num_father) {
  496. Inherit *object_father;
  497. Argument *father_arg = makeValueArgument(num_father);
  498. gc_addTmpLink(&num_father->gc_status);
  499. object_father = setFather(father_arg);
  500. freeArgument(father_arg, true);
  501. gc_freeTmpLink(&num_father->gc_status);
  502. return object_father;
  503. }
  504. Package *makePackage(Value *value, char *md5, char *name, Package *base) {
  505. Package *tmp = memCalloc(1, sizeof(Package));
  506. Package *tmp_base = base;
  507. tmp->name = memStrcpy(name);
  508. tmp->md5 = memStrcpy(md5);
  509. tmp->package = value;
  510. gc_addStatementLink(&value->gc_status);
  511. tmp->next = NULL;
  512. if (base == NULL)
  513. return tmp;
  514. for (PASS; tmp_base->next != NULL; tmp_base = tmp_base->next)
  515. PASS;
  516. tmp_base->next = tmp;
  517. return base;
  518. }
  519. void freePackage(Package *base) {
  520. for (Package *next; base != NULL; base = next) {
  521. next = base->next;
  522. gc_freeStatementLink(&base->package->gc_status);
  523. memFree(base->name);
  524. memFree(base->md5);
  525. memFree(base);
  526. }
  527. }
  528. Value *checkPackage(Package *base, char *md5, char *name) {
  529. for (PASS; base != NULL; base = base->next) {
  530. if (eqString(name, base->name) && eqString(md5, base->md5))
  531. return base->package;
  532. }
  533. return NULL;
  534. }
  535. bool needDel(Value *object_value, Inter *inter) {
  536. LinkValue *_del_ = checkStrVar(inter->data.object_del, false, CFUNC_CORE(object_value->object.var));
  537. enum FunctionPtType type;
  538. if (_del_ == NULL)
  539. return false;
  540. type = _del_->value->data.function.function_data.pt_type;
  541. if ((type == object_free_ || type == object_static_) && object_value->type == V_class)
  542. return false;
  543. if (_del_->belong == NULL || _del_->belong->value == object_value || checkAttribution(object_value, _del_->belong->value))
  544. return true;
  545. return false;
  546. }
  547. bool callDel(Value *object_value, Result *result, Inter *inter, VarList *var_list) {
  548. LinkValue *_del_ = findStrVarOnly(inter->data.object_del, false, CFUNC_CORE(object_value->object.var));
  549. setResultCore(result);
  550. if (_del_ != NULL){
  551. gc_addTmpLink(&_del_->gc_status);
  552. if (_del_->belong == NULL || _del_->belong->value != object_value && checkAttribution(object_value, _del_->belong->value))
  553. _del_->belong = makeLinkValue(object_value, inter->base_belong, inter);
  554. callBackCore(_del_, NULL, LINEFILE, 0, CFUNC_NT(var_list, result, inter->base_belong));
  555. gc_freeTmpLink(&_del_->gc_status);
  556. return true;
  557. } else
  558. return false;
  559. }
  560. /**
  561. * 检查 father 是否为 self 的父亲
  562. * @param self
  563. * @param father
  564. * @return
  565. */
  566. bool checkAttribution(Value *self, Value *father){
  567. for (Inherit *self_father = self->object.inherit; self_father != NULL; self_father = self_father->next)
  568. if (self_father->value->value == father)
  569. return true;
  570. return false;
  571. }
  572. void printValue(Value *value, FILE *debug, bool print_father, bool print_in) {
  573. switch (value->type){
  574. case V_num:
  575. fprintf(debug, "(%lld)", value->data.num.num);
  576. break;
  577. case V_str:
  578. fprintf(debug, "'%ls'", value->data.str.str);
  579. break;
  580. case V_file:
  581. if (print_father)
  582. fprintf(debug, "(file %s)", value->data.file.path);
  583. else
  584. fprintf(debug, "(file %s on %p)", value->data.file.path, value);
  585. break;
  586. case V_func:
  587. if (print_father)
  588. fprintf(debug, "func");
  589. else
  590. fprintf(debug, "(func on %p)", value);
  591. break;
  592. case V_list:
  593. if (print_in){
  594. fprintf(debug, "[");
  595. for (int i = 0; i < value->data.list.size; i++) {
  596. if (i > 0)
  597. fprintf(debug, ", ", NULL);
  598. printValue(value->data.list.list[i]->value, debug, false, false);
  599. }
  600. fprintf(debug, " ]", NULL);
  601. } else
  602. fprintf(debug, "[list]", NULL);
  603. break;
  604. case V_dict:
  605. if (print_in){
  606. Var *tmp = NULL;
  607. bool print_comma = false;
  608. fprintf(debug, "{");
  609. for (int i = 0; i < MAX_SIZE; i++) {
  610. for (tmp = value->data.dict.dict->hashtable[i]; tmp != NULL; tmp = tmp->next) {
  611. if (print_comma)
  612. fprintf(debug, ", ", NULL);
  613. else
  614. print_comma = true;
  615. printValue(tmp->name_->value, debug, false, false);
  616. fprintf(debug, " ['%ls'] : ", tmp->name);
  617. printValue(tmp->value->value, debug, false, false);
  618. }
  619. }
  620. fprintf(debug, " }", NULL);
  621. } else
  622. fprintf(debug, "[dict]", NULL);
  623. break;
  624. case V_none:
  625. fprintf(debug, "(null)", NULL);
  626. break;
  627. case V_class:
  628. if (print_father)
  629. fprintf(debug, "class");
  630. else
  631. fprintf(debug, "(class on %p)", value);
  632. break;
  633. case V_obj:
  634. if (print_father)
  635. fprintf(debug, "object");
  636. else
  637. fprintf(debug, "(object on %p)", value);
  638. break;
  639. case V_bool:
  640. if (value->data.bool_.bool_)
  641. fprintf(debug, "true");
  642. else
  643. fprintf(debug, "false");
  644. break;
  645. case V_ell:
  646. fprintf(debug, "...");
  647. break;
  648. case V_lib:
  649. if (print_father)
  650. fprintf(debug, "lib");
  651. else
  652. fprintf(debug, "(lib on %p)", value);
  653. break;
  654. default:
  655. fprintf(debug, "unknown");
  656. break;
  657. }
  658. if (print_father){
  659. fprintf(debug, "(");
  660. printf("<%p>", value);
  661. for (Inherit *fv = value->object.inherit; fv != NULL; fv = fv->next) {
  662. printf(" -> ");
  663. printValue(fv->value->value, debug, false, false);
  664. }
  665. fprintf(debug, ")");
  666. }
  667. }
  668. void printLinkValue(LinkValue *value, char *first, char *last, FILE *debug){
  669. if (value == NULL)
  670. return;
  671. fprintf(debug, "%s", first);
  672. if (value->belong != NULL) {
  673. printLinkValue(value->belong, "", "", debug);
  674. fprintf(debug, " . ", NULL);
  675. }
  676. if (value->value != NULL)
  677. printValue(value->value, debug, true, true);
  678. fprintf(debug, "%s", last);
  679. }