inter.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. #include "__virtualmath.h"
  2. #define setName(str) memStrToWcs(str, false)
  3. Inter *makeInter(char *out, char *error_, char *in, LinkValue *belong) {
  4. Inter *tmp = memCalloc(1, sizeof(Inter));
  5. tmp->base = NULL;
  6. tmp->link_base = NULL;
  7. tmp->hash_base = NULL;
  8. tmp->base_var = NULL;
  9. tmp->package = NULL;
  10. setBaseInterData(tmp);
  11. tmp->var_list = makeVarList(tmp, true);
  12. if (out != NULL) {
  13. tmp->data.inter_stdout = fopen(out, "w");
  14. tmp->data.is_stdout = false;
  15. if (tmp->data.inter_stdout == NULL)
  16. goto set_stdout;
  17. }
  18. else {
  19. set_stdout:
  20. tmp->data.inter_stdout = stdout;
  21. tmp->data.is_stdout = true;
  22. }
  23. if (error_ != NULL) {
  24. tmp->data.inter_stdout = fopen(error_, "w");
  25. tmp->data.is_stderr = false;
  26. if (tmp->data.inter_stdout == NULL)
  27. goto set_error_;
  28. }
  29. else {
  30. set_error_:
  31. tmp->data.inter_stderr = stderr;
  32. tmp->data.is_stderr = true;
  33. }
  34. if (in != NULL) {
  35. tmp->data.inter_stdin = fopen(in, "r");
  36. tmp->data.is_stdin = false;
  37. if (tmp->data.inter_stdin == NULL)
  38. goto set_stdin_;
  39. }
  40. else {
  41. set_stdin_:
  42. tmp->data.inter_stdin = stdin;
  43. tmp->data.is_stdin = true;
  44. }
  45. registeredFunctionName(tmp, belong);
  46. return tmp;
  47. }
  48. void setBaseInterData(struct Inter *inter){
  49. inter->data.var_name[VN_str] = setName("str_");
  50. inter->data.var_name[VN_num] = setName("num_");
  51. inter->data.var_name[VN_file] = setName("file_");
  52. inter->data.var_name[VN_none] = setName("none");
  53. inter->data.var_name[VN_pass] = setName("ellipsis");
  54. inter->data.var_name[VN_bool] = setName("bool_");
  55. inter->data.var_name[VN_class] = setName("class_");
  56. inter->data.var_name[VN_obj] = setName("obj_");
  57. inter->data.var_name[VN_dict] = setName("dict_");
  58. inter->data.var_name[VN_tuple] = setName("tuple_");
  59. inter->data.mag_func[M_INIT] = setName("__init__");
  60. inter->data.mag_func[M_ENTER] = setName("__enter__");
  61. inter->data.mag_func[M_EXIT] = setName("__exit__");
  62. inter->data.mag_func[M_NEW] = setName("__new__");
  63. inter->data.mag_func[M_ADD] = setName("__add__");
  64. inter->data.mag_func[M_SUB] = setName("__sub__");
  65. inter->data.mag_func[M_MUL] = setName("__mul__");
  66. inter->data.mag_func[M_DIV] = setName("__div__");
  67. inter->data.mag_func[M_CALL] = setName("__call__");
  68. inter->data.mag_func[M_DEL] = setName("__del__");
  69. inter->data.mag_func[M_DOWN] = setName("__down__");
  70. inter->data.mag_func[M_SLICE] = setName("__slice__");
  71. inter->data.mag_func[M_ITER] = setName("__iter__");
  72. inter->data.mag_func[M_NEXT] = setName("__next__");
  73. inter->data.mag_func[M_REPO] = setName("__repo__");
  74. inter->data.mag_func[M_BOOL] = setName("__bool__");
  75. inter->data.mag_func[M_SELF] = setName("__self__");
  76. inter->data.mag_func[M_NAME] = setName("__name__");
  77. inter->data.mag_func[M_FATHER] = setName("__father__");
  78. inter->data.mag_func[M_MESSAGE] = setName("__message__");
  79. inter->data.mag_func[M_STR] = setName("__str__");
  80. inter->data.mag_func[M_DOWN_ASSIGMENT] = setName("__down_assignment__");
  81. inter->data.mag_func[M_SLICE_ASSIGMENT] = setName("__slice_assignment__");
  82. inter->data.mag_func[M_DOWN_DEL] = setName("__down_del__");
  83. inter->data.mag_func[M_SLICE_DEL] = setName("__slice_del__");
  84. inter->data.mag_func[M_ATTR] = setName("__attr__");
  85. inter->data.mag_func[M_VAL] = setName("__val__");
  86. inter->data.mag_func[M_INTDIV] = setName("__intdiv__");
  87. inter->data.mag_func[M_MOD] = setName("__mod__");
  88. inter->data.mag_func[M_POW] = setName("__pow__");
  89. inter->data.mag_func[M_BAND] = setName("__bitand__");
  90. inter->data.mag_func[M_BOR] = setName("__bitor__");
  91. inter->data.mag_func[M_BXOR] = setName("__bitxor__");
  92. inter->data.mag_func[M_BNOT] = setName("__bitnot__");
  93. inter->data.mag_func[M_BL] = setName("__bitleft__");
  94. inter->data.mag_func[M_BR] = setName("__bitright__");
  95. inter->data.mag_func[M_EQ] = setName("__eq__");
  96. inter->data.mag_func[M_MOREEQ] = setName("__moreeq__");
  97. inter->data.mag_func[M_LESSEQ] = setName("__lesseq__");
  98. inter->data.mag_func[M_MORE] = setName("__more__");
  99. inter->data.mag_func[M_LESS] = setName("__less__");
  100. inter->data.mag_func[M_NOTEQ] = setName("__noteq__");
  101. inter->data.mag_func[M_AND] = setName("__and__");
  102. inter->data.mag_func[M_OR] = setName("__or__");
  103. inter->data.mag_func[M_NOT] = setName("__not__");
  104. inter->data.mag_func[M_NEGATE] = setName("__negate__");
  105. inter->data.default_pt_type = free_;
  106. }
  107. void freeBaseInterData(struct Inter *inter){
  108. gc_freeStatementLink(&inter->base_belong->gc_status);
  109. for (int i=0; i < BASEOBJSZIE; i ++)
  110. gc_freeStatementLink(&inter->data.base_obj[i]->gc_status);
  111. for (int i=0; i < BASEEXCESIZE; i ++)
  112. gc_freeStatementLink(&inter->data.base_exc[i]->gc_status);
  113. for (int i=0; i < VARNAMESIZE; i ++)
  114. memFree(inter->data.var_name[i]);
  115. for (int i=0; i < MAGFUNCSIZE; i ++)
  116. memFree(inter->data.mag_func[i]);
  117. if (!inter->data.is_stdout)
  118. fclose(inter->data.inter_stdout);
  119. if (!inter->data.is_stderr)
  120. fclose(inter->data.inter_stderr);
  121. if (!inter->data.is_stdin)
  122. fclose(inter->data.inter_stdin);
  123. }
  124. void freeInter(Inter *inter, bool show_gc) {
  125. FREE_BASE(inter, return_);
  126. gc_runDelAll(inter);
  127. freeBaseInterData(inter);
  128. freePackage(inter->package);
  129. #if DEBUG
  130. if (show_gc && (printf("\nEnter '1' to show gc: "), getc(stdin) == '1')) {
  131. printGC(inter);
  132. while (getc(stdin) != '\n')
  133. PASS;
  134. }
  135. #endif
  136. freeVarList(inter->var_list);
  137. while (inter->base != NULL)
  138. freeValue(&inter->base);
  139. while (inter->base_var != NULL)
  140. freeVar(&inter->base_var);
  141. while (inter->link_base != NULL)
  142. freeLinkValue(&inter->link_base);
  143. while (inter->hash_base != NULL)
  144. freeHashTable(&inter->hash_base);
  145. memFree(inter);
  146. return_:
  147. return;
  148. }
  149. void mergeInter(Inter *new, Inter *base){
  150. Value **base_value = NULL;
  151. LinkValue **base_linkValue = NULL;
  152. HashTable **base_hash = NULL;
  153. Var **base_var = NULL;
  154. gc_runDelAll(new);
  155. freeBaseInterData(new);
  156. freeVarList(new->var_list);
  157. for (base_value = &base->base; *base_value != NULL; base_value = &(*base_value)->gc_next)
  158. PASS;
  159. for (base_linkValue = &base->link_base; *base_linkValue != NULL; base_linkValue = &(*base_linkValue)->gc_next)
  160. PASS;
  161. for (base_hash = &base->hash_base; *base_hash != NULL; base_hash = &(*base_hash)->gc_next)
  162. PASS;
  163. for (base_var = &base->base_var; *base_var != NULL; base_var = &(*base_var)->gc_next)
  164. PASS;
  165. *base_value = new->base;
  166. *base_linkValue = new->link_base;
  167. *base_hash = new->hash_base;
  168. *base_var = new->base_var;
  169. if (base->package == NULL)
  170. base->package = new->package;
  171. memFree(new);
  172. }
  173. Inter *deriveInter(LinkValue *belong, Inter *inter) {
  174. Inter *import_inter = makeInter(NULL, NULL, NULL, belong);
  175. import_inter->data.inter_stdout = inter->data.inter_stdout;
  176. import_inter->data.inter_stderr = inter->data.inter_stderr;
  177. import_inter->data.inter_stdin = inter->data.inter_stdin;
  178. import_inter->data.is_stdout = true;
  179. import_inter->data.is_stderr = true;
  180. import_inter->data.is_stdin = true;
  181. return import_inter;
  182. }
  183. #if DEBUG
  184. /* ***********************DEBUG 专用函数*********************************** */
  185. void printGC(Inter *inter){
  186. #if START_GC
  187. long int lv_st = 0;
  188. long int lv_tmp = 0;
  189. long int v_st = 0;
  190. long int v_tmp = 0;
  191. long int h_tmp = 0;
  192. printLinkValueGC("\n\nprintLinkValueGC TAG : freeInter", inter, &lv_tmp, &lv_st);
  193. printValueGC("\nprintValueGC TAG : freeInter", inter, &v_tmp, &v_st);
  194. printVarGC("\nprintVarGC TAG : freeInter", inter);
  195. printHashTableGC("\nprintHashTableGC TAG : freeInter", inter, &h_tmp);
  196. printf("\n");
  197. printf("linkvalue tmp link = %ld\n", lv_tmp);
  198. printf("linkvalue statement link = %ld\n", lv_st);
  199. printf(" value tmp link = %ld\n", v_tmp);
  200. printf(" value statement link = %ld\n", v_st);
  201. printf("hashtable tmp link = %ld\n", h_tmp);
  202. printf(" tmp link count = %ld\n", lv_tmp + v_tmp + h_tmp);
  203. printf("statement link count = %ld\n", lv_st + v_st);
  204. #endif
  205. }
  206. #if START_GC
  207. void printLinkValueGC(char *tag, Inter *inter, long *tmp_link, long *st_link) {
  208. LinkValue *base = inter->link_base;
  209. long tmp = 0;
  210. long st = 0;
  211. printf("%s\n", tag);
  212. while (base != NULL) {
  213. tmp += labs(base->gc_status.tmp_link);
  214. st += labs(base->gc_status.statement_link);
  215. if (base->gc_status.tmp_link != 0 || base->gc_status.statement_link != 0) {
  216. printf("inter->link_base.tmp_link = %ld :: %p\n", base->gc_status.tmp_link, base);
  217. printf("inter->link_base.statement_link = %ld :: %p\n", base->gc_status.statement_link, base);
  218. printf("inter->link_base.link = %ld :: %p\n", base->gc_status.link, base);
  219. printLinkValue(base, "value = ", "\n", stdout);
  220. printf("-------------------------------------------\n");
  221. }
  222. base = base->gc_next;
  223. }
  224. printf("tmp link = %ld\n", tmp);
  225. printf("st link = %ld\n", st);
  226. printf("printLinkValueGC TAG : END\n");
  227. if (tmp_link != NULL)
  228. *tmp_link = tmp;
  229. if (st_link != NULL) {
  230. *st_link = st;
  231. }
  232. }
  233. void printValueGC(char *tag, Inter *inter, long *tmp_link, long *st_link) {
  234. Value *base = inter->base;
  235. long tmp = 0;
  236. long st = 0;
  237. printf("%s\n", tag);
  238. while (base != NULL) {
  239. tmp += labs(base->gc_status.tmp_link);
  240. st += labs(base->gc_status.statement_link);
  241. if (base->gc_status.tmp_link != 0 || base->gc_status.statement_link != 0) {
  242. printf("inter->link_base.tmp_link = %ld :: %p\n", base->gc_status.tmp_link, base);
  243. printf("inter->link_base.statement_link = %ld :: %p\n", base->gc_status.statement_link, base);
  244. printf("inter->link_base.link = %ld :: %p\n", base->gc_status.link, base);
  245. printf("value = ");
  246. printValue(base, stdout, true, true);
  247. printf("\n-------------------------------------------\n");
  248. }
  249. base = base->gc_next;
  250. }
  251. printf("tmp link = %ld\n", tmp);
  252. printf("st link = %ld\n", st);
  253. printf("printValueGC TAG : END\n");
  254. if (tmp_link != NULL)
  255. *tmp_link = tmp;
  256. if (st_link != NULL)
  257. *st_link = st;
  258. }
  259. void printVarGC(char *tag, Inter *inter){
  260. Var *base = inter->base_var;
  261. printf("%s\n", tag);
  262. while (base != NULL) {
  263. if (base->gc_status.tmp_link != 0) {
  264. printf("inter->link_base.tmp_link = %ld :: %p\n", base->gc_status.tmp_link, base);
  265. printf("inter->link_base.statement_link = %ld :: %p\n", base->gc_status.statement_link, base);
  266. printf("inter->link_base.link = %ld :: %p\n", base->gc_status.link, base);
  267. }
  268. printf("str_name = %ls\n", base->name);
  269. printf("name = ");
  270. printValue(base->name_->value, stdout, false, true);
  271. printf("\nvalue = ");
  272. printValue(base->value->value, stdout, false, true);
  273. printf("\n-------------------------------------------\n");
  274. base = base->gc_next;
  275. }
  276. printf("printVarGC TAG : END\n");
  277. }
  278. void printHashTableGC(char *tag, Inter *inter, long *tmp_link) {
  279. HashTable *base = inter->hash_base;
  280. long tmp = 0;
  281. printf("%s\n", tag);
  282. while (base != NULL) {
  283. tmp += labs(base->gc_status.tmp_link);
  284. if (base->gc_status.tmp_link != 0) {
  285. printf("inter->link_base.tmp_link = %ld :: %p\n", base->gc_status.tmp_link, base);
  286. printf("inter->link_base.statement_link = %ld :: %p\n", base->gc_status.statement_link, base);
  287. printf("inter->link_base.link = %ld :: %p\n", base->gc_status.link, base);
  288. printf("-------------------------------------------\n");
  289. }
  290. base = base->gc_next;
  291. }
  292. printf("tmp link = %ld\n", tmp);
  293. printf("printHashTableGC TAG : END\n");
  294. if (tmp_link != NULL)
  295. *tmp_link = tmp;
  296. }
  297. void printToken(Token *tk) {
  298. if (tk->token_type >= 0) {
  299. wchar_t *tmp = tk->data.str, *second_tmp = tk->data.second_str;
  300. if (eqWide(tmp, L"\n"))
  301. tmp = L"\\n";
  302. if (eqWide(second_tmp, L"\n"))
  303. second_tmp = L"\\n";
  304. printf("<token str = ('%ls','%ls'), type = %d>", tmp, second_tmp, tk->token_type);
  305. }
  306. else
  307. printf("<token statement, type = %d>", tk->token_type);
  308. }
  309. #endif // START_GC
  310. #endif // DBUG