value.c 21 KB

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