value.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657
  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. default:
  287. return NULL;
  288. }
  289. }
  290. char *getErrorInfo(LinkValue *exc, int type, Inter *inter){
  291. char *str_name = type == 1 ? inter->data.object_name : inter->data.object_message;
  292. LinkValue *_info_ = findAttributes(str_name, false, exc, inter);
  293. if (_info_ != NULL && _info_->value->type == string)
  294. return memStrcpy(_info_->value->data.str.str);
  295. else
  296. return type == 1 ? memStrcpy("Error Type: Unknown") : memStrcpy("Error Message: Unknown");
  297. }
  298. void callException(LinkValue *exc, char *message, fline line, char *file, INTER_FUNCTIONSIG_NOT_ST) {
  299. LinkValue *_new_ = findAttributes(inter->data.object_new, false, exc, inter);
  300. char *type = NULL;
  301. char *error_message = NULL;
  302. setResultCore(result);
  303. gc_addTmpLink(&exc->gc_status);
  304. if (_new_ != NULL){
  305. Argument *arg = makeValueArgument(makeLinkValue(makeStringValue(message, inter), belong, inter));
  306. gc_addTmpLink(&_new_->gc_status);
  307. callBackCore(_new_, arg, line, file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  308. gc_freeTmpLink(&_new_->gc_status);
  309. freeArgument(arg, true);
  310. type = getErrorInfo(result->value, 1, inter);
  311. error_message = getErrorInfo(result->value, 2, inter);
  312. }
  313. else {
  314. result->value = exc;
  315. gc_addTmpLink(&result->value->gc_status);
  316. }
  317. result->type = error_return;
  318. result->error = connectError(makeError(type, error_message, line, file), result->error);
  319. memFree(type);
  320. memFree(error_message);
  321. gc_freeTmpLink(&exc->gc_status);
  322. }
  323. void setResultError(BaseErrorType type, char *error_message, fline line, char *file, bool new, INTER_FUNCTIONSIG_NOT_ST) {
  324. if (!new && result->type != error_return)
  325. return;
  326. if (new) {
  327. Value *exc = findBaseError(type, inter);
  328. if (exc == NULL)
  329. exc = inter->data.base_exc;
  330. freeResult(result);
  331. callException(makeLinkValue(exc, belong, inter), error_message, line, file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  332. }
  333. else
  334. result->error = connectError(makeError(NULL, NULL, line, file), result->error);
  335. }
  336. void setResultOperationNone(Result *ru, Inter *inter, LinkValue *belong) {
  337. setResult(ru, inter, belong);
  338. ru->type = operation_return;
  339. }
  340. void setResultOperation(Result *ru, LinkValue *value) {
  341. freeResult(ru);
  342. setResultOperationBase(ru, value);
  343. }
  344. void setResultOperationBase(Result *ru, LinkValue *value) {
  345. setResultCore(ru);
  346. ru->value = value;
  347. if (value != NULL)
  348. gc_addTmpLink(&ru->value->gc_status);
  349. ru->type = operation_return;
  350. }
  351. void freeResult(Result *ru){
  352. memFree(ru->label);
  353. ru->label = NULL;
  354. freeResultSafe(ru);
  355. if (ru->value != NULL) {
  356. gc_freeTmpLink(&ru->value->gc_status);
  357. ru->value = NULL;
  358. }
  359. }
  360. void freeResultSafe(Result *ru){
  361. if (ru->error != NULL)
  362. freeError(ru);
  363. ru->error = NULL;
  364. }
  365. Error *makeError(char *type, char *message, fline line, char *file) {
  366. Error *tmp = memCalloc(1, sizeof(Error));
  367. tmp->line = line;
  368. tmp->type = memStrcpy(type);
  369. tmp->messgae = memStrcpy(message);
  370. tmp->file = memStrcpy(file);
  371. tmp->next = NULL;
  372. return tmp;
  373. }
  374. Error *connectError(Error *new, Error *base){
  375. new->next = base;
  376. return new;
  377. }
  378. void freeError(Result *base){
  379. Error *error = base->error;
  380. for (Error *next = NULL; error != NULL; error = next){
  381. next = error->next;
  382. memFree(error->messgae);
  383. memFree(error->type);
  384. memFree(error->file);
  385. memFree(error);
  386. }
  387. base->error = NULL;
  388. }
  389. void printError(Result *result, Inter *inter, bool free) {
  390. for (Error *base = result->error; base != NULL; base = base->next){
  391. if (base->next != NULL)
  392. fprintf(inter->data.inter_stderr, "Error Backtracking: On Line: %lld In file: %s Error ID: %p\n", base->line, base->file, base);
  393. else
  394. 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);
  395. }
  396. if (free)
  397. freeError(result);
  398. }
  399. inline bool isType(Value *value, enum ValueType type){
  400. return value->type == type;
  401. }
  402. Inherit *makeInherit(LinkValue *value){
  403. Inherit *tmp;
  404. tmp = memCalloc(1, sizeof(Inherit));
  405. tmp->value = value;
  406. tmp->next = NULL;
  407. return tmp;
  408. }
  409. Inherit *copyInheritCore(Inherit *value){
  410. Inherit *tmp;
  411. if (value == NULL)
  412. return NULL;
  413. tmp = makeInherit(value->value);
  414. return tmp;
  415. }
  416. Inherit *copyInherit(Inherit *value){
  417. Inherit *base = NULL;
  418. Inherit **tmp = &base;
  419. for (PASS; value != NULL; value = value->next, tmp = &(*tmp)->next)
  420. *tmp = copyInheritCore(value);
  421. return base;
  422. }
  423. Inherit *freeInherit(Inherit *value){
  424. FREE_BASE(value, error_);
  425. Inherit *next = value->next;
  426. memFree(value);
  427. return next;
  428. error_: return NULL;
  429. }
  430. Inherit *connectInherit(Inherit *base, Inherit *back){
  431. Inherit **tmp = &base;
  432. for (PASS; *tmp != NULL; tmp = &(*tmp)->next)
  433. PASS;
  434. *tmp = back;
  435. return base;
  436. }
  437. Inherit *connectSafeInherit(Inherit *base, Inherit *back){
  438. Inherit **last_node = &base;
  439. if (back == NULL)
  440. goto reutrn_;
  441. for (PASS; *last_node != NULL;)
  442. if ((*last_node)->value->value == back->value->value)
  443. *last_node = freeInherit(*last_node);
  444. else
  445. last_node = &(*last_node)->next;
  446. *last_node = back;
  447. reutrn_: return base;
  448. }
  449. Inherit *getInheritFromValue(Value *value, Inter *inter){
  450. LinkValue *num_father = makeLinkValue(value, inter->base_father, inter);
  451. return getInheritFromValueCore(num_father);
  452. }
  453. Inherit *getInheritFromValueCore(LinkValue *num_father) {
  454. Inherit *object_father;
  455. Argument *father_arg = makeValueArgument(num_father);
  456. gc_addTmpLink(&num_father->gc_status);
  457. object_father = setFather(father_arg);
  458. freeArgument(father_arg, true);
  459. gc_freeTmpLink(&num_father->gc_status);
  460. return object_father;
  461. }
  462. bool needDel(Value *object_value, Inter *inter) {
  463. LinkValue *_del_ = checkStrVar(inter->data.object_del, false, CALL_INTER_FUNCTIONSIG_CORE(object_value->object.var));
  464. enum FunctionPtType type;
  465. if (_del_ == NULL)
  466. return false;
  467. type = _del_->value->data.function.function_data.pt_type;
  468. if ((type == object_free_ || type == object_static_) && object_value->type == class)
  469. return false;
  470. if (_del_->belong == NULL || _del_->belong->value == object_value || checkAttribution(object_value, _del_->belong->value))
  471. return true;
  472. return false;
  473. }
  474. bool callDel(Value *object_value, Result *result, Inter *inter, VarList *var_list) {
  475. LinkValue *_del_ = findStrVar(inter->data.object_del, false, CALL_INTER_FUNCTIONSIG_CORE(object_value->object.var));
  476. setResultCore(result);
  477. if (_del_ != NULL){
  478. gc_addTmpLink(&_del_->gc_status);
  479. if (_del_->belong == NULL || _del_->belong->value != object_value && checkAttribution(object_value, _del_->belong->value))
  480. _del_->belong = makeLinkValue(object_value, inter->base_father, inter);
  481. callBackCore(_del_, NULL, 0, "sys", CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, inter->base_father));
  482. gc_freeTmpLink(&_del_->gc_status);
  483. return true;
  484. } else
  485. return false;
  486. }
  487. /**
  488. * 检查 father 是否为 self 的父亲
  489. * @param self
  490. * @param father
  491. * @return
  492. */
  493. bool checkAttribution(Value *self, Value *father){
  494. for (Inherit *self_father = self->object.inherit; self_father != NULL; self_father = self_father->next)
  495. if (self_father->value->value == father)
  496. return true;
  497. return false;
  498. }
  499. void printValue(Value *value, FILE *debug, bool print_father, bool print_in) {
  500. switch (value->type){
  501. case number:
  502. fprintf(debug, "%lld", value->data.num.num);
  503. break;
  504. case string:
  505. fprintf(debug, "%s", value->data.str.str);
  506. break;
  507. case function:
  508. if (print_father)
  509. fprintf(debug, "function");
  510. else
  511. fprintf(debug, "(function on %p)", value);
  512. break;
  513. case list:
  514. if (print_in){
  515. fprintf(debug, "[");
  516. for (int i = 0; i < value->data.list.size; i++) {
  517. if (i > 0)
  518. fprintf(debug, ", ", NULL);
  519. printValue(value->data.list.list[i]->value, debug, false, false);
  520. }
  521. fprintf(debug, " ]", NULL);
  522. } else
  523. fprintf(debug, "[list]", NULL);
  524. break;
  525. case dict:
  526. if (print_in){
  527. Var *tmp = NULL;
  528. bool print_comma = false;
  529. fprintf(debug, "{");
  530. for (int i = 0; i < MAX_SIZE; i++) {
  531. for (tmp = value->data.dict.dict->hashtable[i]; tmp != NULL; tmp = tmp->next) {
  532. if (print_comma)
  533. fprintf(debug, ", ", NULL);
  534. else
  535. print_comma = true;
  536. printValue(tmp->name_->value, debug, false, false);
  537. fprintf(debug, " ['%s'] : ", tmp->name);
  538. printValue(tmp->value->value, debug, false, false);
  539. }
  540. }
  541. fprintf(debug, " }", NULL);
  542. } else
  543. fprintf(debug, "[dict]", NULL);
  544. break;
  545. case none:
  546. fprintf(debug, "(null)", NULL);
  547. break;
  548. case class:
  549. if (print_father)
  550. fprintf(debug, "class");
  551. else
  552. fprintf(debug, "(class on %p)", value);
  553. break;
  554. case object_:
  555. if (print_father)
  556. fprintf(debug, "object");
  557. else
  558. fprintf(debug, "(object on %p)", value);
  559. break;
  560. case bool_:
  561. if (value->data.bool_.bool_)
  562. fprintf(debug, "true");
  563. else
  564. fprintf(debug, "false");
  565. break;
  566. case pass_:
  567. fprintf(debug, "...");
  568. break;
  569. default:
  570. fprintf(debug, "unknown");
  571. break;
  572. }
  573. if (print_father){
  574. fprintf(debug, "(");
  575. printf("<%p>", value);
  576. for (Inherit *fv = value->object.inherit; fv != NULL; fv = fv->next) {
  577. printf(" -> ");
  578. printValue(fv->value->value, debug, false, false);
  579. }
  580. fprintf(debug, ")");
  581. }
  582. }
  583. void printLinkValue(LinkValue *value, char *first, char *last, FILE *debug){
  584. if (value == NULL)
  585. return;
  586. fprintf(debug, "%s", first);
  587. if (value->belong != NULL) {
  588. printLinkValue(value->belong, "", "", debug);
  589. fprintf(debug, " . ", NULL);
  590. }
  591. if (value->value != NULL)
  592. printValue(value->value, debug, true, true);
  593. fprintf(debug, "%s", last);
  594. }