inter.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. #include "__virtualmath.h"
  2. Inter *runBaseInter(char *code_file, char *debug_dir, int *status) {
  3. Result global_result;
  4. setResultCore(&global_result);
  5. return newInter(code_file, debug_dir, &global_result, status);
  6. }
  7. Inter *newInter(char *code_file, char *debug_dir, Result *global_result, int *status) {
  8. Inter *global_inter = NULL;
  9. ParserMessage *pm = NULL;
  10. ResultType type;
  11. *status = 0;
  12. if (checkFile(code_file) != 1){
  13. *status = 1;
  14. return NULL;
  15. }
  16. if (checkFile(debug_dir) != 2)
  17. debug_dir = NULL;
  18. global_inter = makeInter(code_file, debug_dir);
  19. pm = makeParserMessage(code_file, debug_dir);
  20. parserCommandList(pm, global_inter, true, global_inter->statement);
  21. if (pm->status != success){
  22. writeLog(stderr, ERROR, "Syntax Error: %s\n", pm->status_message);
  23. goto return_;
  24. }
  25. type = globalIterStatement(global_inter, global_result);
  26. if (type == error_return)
  27. printError(global_result, global_inter, true);
  28. return_:
  29. freeParserMessage(pm, true);
  30. return global_inter;
  31. }
  32. Inter *makeInter(char *code_file, char *debug) {
  33. Inter *tmp = memCalloc(1, sizeof(Inter));
  34. setBaseInterData(tmp);
  35. tmp->base = NULL;
  36. tmp->link_base = NULL;
  37. tmp->statement = makeStatement(0, code_file);
  38. tmp->var_list = makeVarList(tmp);
  39. tmp->data.log_dir = memStrcpy(debug);
  40. if (debug != NULL && !args.stdout_inter){
  41. char *debug_dir = memStrcat(debug, INTER_LOG, false), *error_dir = memStrcat(debug, INTER_ERROR, false);
  42. tmp->data.debug = fopen(debug_dir, "w");
  43. tmp->data.error = fopen(error_dir, "w");
  44. memFree(debug_dir);
  45. memFree(error_dir);
  46. }
  47. else {
  48. tmp->data.debug = stdout;
  49. tmp->data.error = stderr;
  50. }
  51. Value *none_value = makeNoneValue(tmp); // 注册None值
  52. gc_addStatementLink(&none_value->gc_status);
  53. return tmp;
  54. }
  55. void setBaseInterData(struct Inter *inter){
  56. inter->data.var_str_prefix = memStrcpy("str_");
  57. inter->data.var_num_prefix = memStrcpy("num_");
  58. inter->data.var_defualt = memStrcpy("default_var");
  59. inter->data.object_init = memStrcpy("__init__");
  60. inter->data.debug = NULL;
  61. inter->data.log_dir = NULL;
  62. }
  63. void freeBaseInterData(struct Inter *inter){
  64. memFree(inter->data.var_defualt);
  65. memFree(inter->data.var_num_prefix);
  66. memFree(inter->data.var_str_prefix);
  67. memFree(inter->data.object_init);
  68. memFree(inter->data.log_dir);
  69. if (inter->data.log_dir != NULL) {
  70. fclose(inter->data.debug);
  71. fclose(inter->data.error);
  72. }
  73. }
  74. void freeInter(Inter *inter, bool self){
  75. freeBase(inter, return_);
  76. printLinkValueGC("\n\nprintLinkValueGC TAG : freeInter", inter);
  77. printValueGC("\nprintValueGC TAG : freeInter", inter);
  78. printVarGC("\nprintVarGC TAG : freeInter", inter);
  79. freeStatement(inter->statement); // Statement放在Value前面释放, 因为base_value的释放需要处理gc_status
  80. freeVarList(inter->var_list, true);
  81. while (inter->base != NULL)
  82. freeValue(inter->base, inter);
  83. while (inter->base_var != NULL)
  84. freeVar(inter->base_var, inter);
  85. while (inter->link_base != NULL)
  86. freeLinkValue(inter->link_base, inter);
  87. while (inter->hash_base != NULL)
  88. freeHashTable(inter->hash_base, inter);
  89. freeBaseInterData(inter);
  90. if (self)
  91. memFree(inter);
  92. return_:
  93. return;
  94. }
  95. /* ***********************DEBUG 专用函数*********************************** */
  96. void printLinkValueGC(char *tag, Inter *inter){
  97. LinkValue *base = inter->link_base;
  98. printf("%s\n", tag);
  99. while (base != NULL) {
  100. printf("inter->link_base.tmp_link = %ld :: %p\n", base->gc_status.tmp_link, base);
  101. printf("inter->link_base.statement_link = %ld :: %p\n", base->gc_status.statement_link, base);
  102. printf("inter->link_base.link = %ld :: %p\n", base->gc_status.link, base);
  103. printLinkValue(base, "value = ", "\n", stdout);
  104. printf("-------------------------------------------\n");
  105. base = base->gc_next;
  106. }
  107. printf("printLinkValueGC TAG : END\n");
  108. }
  109. void printValueGC(char *tag, Inter *inter){
  110. Value *base = inter->base;
  111. printf("%s\n", tag);
  112. while (base != NULL) {
  113. printf("inter->link_base.tmp_link = %ld :: %p\n", base->gc_status.tmp_link, base);
  114. printf("inter->link_base.statement_link = %ld :: %p\n", base->gc_status.statement_link, base);
  115. printf("inter->link_base.link = %ld :: %p\n", base->gc_status.link, base);
  116. printf("value = ");
  117. printValue(base, stdout);
  118. printf("\n-------------------------------------------\n");
  119. base = base->gc_next;
  120. }
  121. printf("printValueGC TAG : END\n");
  122. }
  123. void printVarGC(char *tag, Inter *inter){
  124. Var *base = inter->base_var;
  125. printf("%s\n", tag);
  126. while (base != NULL) {
  127. printf("inter->link_base.tmp_link = %ld :: %p\n", base->gc_status.tmp_link, base);
  128. printf("inter->link_base.statement_link = %ld :: %p\n", base->gc_status.statement_link, base);
  129. printf("inter->link_base.link = %ld :: %p\n", base->gc_status.link, base);
  130. printf("value :\n");
  131. printLinkValue(base->name_, "name_: ", "\n", stdout);
  132. printLinkValue(base->value, "value_: ", "\n", stdout);
  133. printf("str_name = %s\n", base->name);
  134. printf("-------------------------------------------\n");
  135. base = base->gc_next;
  136. }
  137. printf("printVarGC TAG : END\n");
  138. }
  139. void showLinkValue(struct LinkValue *base){
  140. printf("tmp_link = %ld :: %p\n", base->gc_status.tmp_link, base);
  141. printf("statement_link = %ld :: %p\n", base->gc_status.statement_link, base);
  142. printf("link = %ld :: %p\n", base->gc_status.link, base);
  143. printLinkValue(base, "value = ", "\n", stdout);
  144. printf("--------------------------\n");
  145. }