inter.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. #include "__virtualmath.h"
  2. Inter *makeInter(char *debug, LinkValue *father) {
  3. Inter *tmp = memCalloc(1, sizeof(Inter));
  4. LinkValue *base_father = NULL;
  5. setBaseInterData(tmp);
  6. tmp->base = NULL;
  7. tmp->link_base = NULL;
  8. tmp->hash_base = NULL;
  9. tmp->base_var = NULL;
  10. tmp->var_list = makeVarList(tmp, true);
  11. tmp->data.log_dir = memStrcpy(debug);
  12. if (debug != NULL && !args.stdout_inter){
  13. #ifdef __unix__
  14. char *debug_dir = memStrcat(debug, "/inter.log", false, false), *error_dir = memStrcat(debug, "/inter_error.log", false, false);
  15. #else // __unix__
  16. char *debug_dir = memStrcat(debug, "\inter.log", false, false), *error_dir = memStrcat(debug, "\inter_error.log", false, false);
  17. #endif // __unix__
  18. tmp->data.debug = fopen(debug_dir, "w");
  19. tmp->data.error = fopen(error_dir, "w");
  20. memFree(debug_dir);
  21. memFree(error_dir);
  22. }
  23. else {
  24. tmp->data.debug = stdout;
  25. tmp->data.error = stderr;
  26. }
  27. makeBaseObject(tmp);
  28. tmp->data.none = makeNoneValue(tmp);
  29. gc_addStatementLink(&tmp->data.none->gc_status);
  30. {
  31. VarList *out_var = copyVarList(tmp->var_list, false, tmp);
  32. Value *base_father_value = makeObject(tmp, out_var, NULL, NULL);
  33. base_father = makeLinkValue(base_father_value, father, tmp);
  34. gc_addStatementLink(&base_father->gc_status);
  35. tmp->base_father = base_father;
  36. }
  37. registeredBaseFunction(base_father, tmp);
  38. return tmp;
  39. }
  40. void setBaseInterData(struct Inter *inter){
  41. inter->data.object = NULL;
  42. inter->data.none = NULL;
  43. inter->data.var_str_prefix = memStrcpy("str_");
  44. inter->data.var_num_prefix = memStrcpy("num_");
  45. inter->data.var_defualt = memStrcpy("default_var");
  46. inter->data.object_init = memStrcpy("__init__");
  47. inter->data.object_enter = memStrcpy("__enter__");
  48. inter->data.object_exit = memStrcpy("__exit__");
  49. inter->data.object_new = memStrcpy("__new__");
  50. }
  51. void freeBaseInterData(struct Inter *inter){
  52. gc_freeStatementLink(&inter->data.none->gc_status);
  53. gc_freeStatementLink(&inter->data.object->gc_status);
  54. memFree(inter->data.var_num_prefix);
  55. memFree(inter->data.var_str_prefix);
  56. memFree(inter->data.var_defualt);
  57. memFree(inter->data.object_init);
  58. memFree(inter->data.object_enter);
  59. memFree(inter->data.object_exit);
  60. memFree(inter->data.object_new);
  61. memFree(inter->data.log_dir);
  62. if (inter->data.log_dir != NULL) {
  63. fclose(inter->data.debug);
  64. fclose(inter->data.error);
  65. }
  66. }
  67. void freeInter(Inter *inter, bool show_gc) {
  68. freeBase(inter, return_);
  69. gc_freeStatementLink(&inter->base_father->gc_status);
  70. inter->base_father = NULL;
  71. freeVarList(inter->var_list);
  72. freeBaseInterData(inter);
  73. if (show_gc && (printf("Enter '1' to show gc: "), getc(stdin) == '1')) {
  74. printLinkValueGC("\n\nprintLinkValueGC TAG : freeInter", inter);
  75. printValueGC("\nprintValueGC TAG : freeInter", inter);
  76. printVarGC("\nprintVarGC TAG : freeInter", inter);
  77. printHashTableGC("\nprintHashTableGC TAG : freeInter", inter);
  78. while (getc(stdin) != '\n')
  79. PASS;
  80. }
  81. while (inter->base != NULL)
  82. freeValue(&inter->base);
  83. while (inter->base_var != NULL)
  84. freeVar(&inter->base_var);
  85. while (inter->link_base != NULL)
  86. freeLinkValue(&inter->link_base);
  87. while (inter->hash_base != NULL)
  88. freeHashTable(&inter->hash_base);
  89. memFree(inter);
  90. return_:
  91. return;
  92. }
  93. void mergeInter(Inter *new, Inter *base){
  94. Value **base_value = NULL;
  95. LinkValue **base_linkValue = NULL;
  96. HashTable **base_hash = NULL;
  97. Var **base_var = NULL;
  98. gc_freeStatementLink(&new->base_father->gc_status);
  99. new->base_father = NULL;
  100. freeVarList(new->var_list);
  101. freeBaseInterData(new);
  102. for (base_value = &base->base; *base_value != NULL; base_value = &(*base_value)->gc_next)
  103. PASS;
  104. for (base_linkValue = &base->link_base; *base_linkValue != NULL; base_linkValue = &(*base_linkValue)->gc_next)
  105. PASS;
  106. for (base_hash = &base->hash_base; *base_hash != NULL; base_hash = &(*base_hash)->gc_next)
  107. PASS;
  108. for (base_var = &base->base_var; *base_var != NULL; base_var = &(*base_var)->gc_next)
  109. PASS;
  110. *base_value = new->base;
  111. *base_linkValue = new->link_base;
  112. *base_hash = new->hash_base;
  113. *base_var = new->base_var;
  114. memFree(new);
  115. }
  116. /* ***********************DEBUG 专用函数*********************************** */
  117. void printLinkValueGC(char *tag, Inter *inter){
  118. LinkValue *base = inter->link_base;
  119. printf("%s\n", tag);
  120. while (base != NULL) {
  121. printf("inter->link_base.tmp_link = %ld :: %p\n", base->gc_status.tmp_link, base);
  122. printf("inter->link_base.statement_link = %ld :: %p\n", base->gc_status.statement_link, base);
  123. printf("inter->link_base.link = %ld :: %p\n", base->gc_status.link, base);
  124. printLinkValue(base, "value = ", "\n", stdout);
  125. printf("-------------------------------------------\n");
  126. base = base->gc_next;
  127. }
  128. printf("printLinkValueGC TAG : END\n");
  129. }
  130. void printValueGC(char *tag, Inter *inter){
  131. Value *base = inter->base;
  132. printf("%s\n", tag);
  133. while (base != NULL) {
  134. printf("inter->link_base.tmp_link = %ld :: %p\n", base->gc_status.tmp_link, base);
  135. printf("inter->link_base.statement_link = %ld :: %p\n", base->gc_status.statement_link, base);
  136. printf("inter->link_base.link = %ld :: %p\n", base->gc_status.link, base);
  137. printf("value = ");
  138. printValue(base, stdout, true);
  139. printf("\n-------------------------------------------\n");
  140. base = base->gc_next;
  141. }
  142. printf("printValueGC TAG : END\n");
  143. }
  144. void printVarGC(char *tag, Inter *inter){
  145. Var *base = inter->base_var;
  146. printf("%s\n", tag);
  147. while (base != NULL) {
  148. printf("inter->link_base.tmp_link = %ld :: %p\n", base->gc_status.tmp_link, base);
  149. printf("inter->link_base.statement_link = %ld :: %p\n", base->gc_status.statement_link, base);
  150. printf("inter->link_base.link = %ld :: %p\n", base->gc_status.link, base);
  151. printf("value :\n");
  152. printLinkValue(base->name_, "name_: ", "\n", stdout);
  153. printLinkValue(base->value, "value_: ", "\n", stdout);
  154. printf("str_name = %s\n", base->name);
  155. printf("-------------------------------------------\n");
  156. base = base->gc_next;
  157. }
  158. printf("printVarGC TAG : END\n");
  159. }
  160. void printHashTableGC(char *tag, Inter *inter){
  161. HashTable *base = inter->hash_base;
  162. printf("%s\n", tag);
  163. while (base != NULL) {
  164. printf("inter->link_base.tmp_link = %ld :: %p\n", base->gc_status.tmp_link, base);
  165. printf("inter->link_base.statement_link = %ld :: %p\n", base->gc_status.statement_link, base);
  166. printf("inter->link_base.link = %ld :: %p\n", base->gc_status.link, base);
  167. printf("-------------------------------------------\n");
  168. base = base->gc_next;
  169. }
  170. printf("printHashTableGC TAG : END\n");
  171. }
  172. void printToken(Token *tk) {
  173. if (tk->token_type >= 0) {
  174. char *tmp = tk->data.str, *second_tmp = tk->data.second_str;
  175. if (!strcmp(tmp, "\n")) {
  176. tmp = "\\n";
  177. }
  178. if (!strcmp(second_tmp, "\n")) {
  179. second_tmp = "\\n";
  180. }
  181. if (tmp[0] == EOF) {
  182. tmp = "(EOF)";
  183. }
  184. printf("<token str = ('%s','%s'), type = %d>", tmp, second_tmp, tk->token_type);
  185. }
  186. else{
  187. printf("<token statement, type = %d>", tk->token_type);
  188. }
  189. }
  190. void printTokenStream(TokenStream *ts) {
  191. printf("token_list: ");
  192. Token *tmp = ts->token_list;
  193. int i = 0;
  194. while (tmp != NULL){
  195. if (i > 0)
  196. printf("-");
  197. printToken(tmp);
  198. tmp = tmp->next;
  199. i++;
  200. }
  201. printf("\n");
  202. }