gc.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #include "__virtualmath.h"
  2. void gc_iterLinkValue(LinkValue *value){
  3. if (value == NULL)
  4. return;
  5. gcAddLink(&value->gc_status);
  6. if (!setIterAlready(&value->gc_status)){
  7. gc_iterLinkValue(value->father);
  8. gc_iterValue(value->value);
  9. }
  10. }
  11. void gc_iterValue(Value *value){
  12. if (value == NULL)
  13. return;
  14. gcAddLink(&value->gc_status);
  15. if (setIterAlready(&value->gc_status))
  16. return;
  17. switch (value->type) {
  18. case function:
  19. gc_var_list(value->data.function.var);
  20. break;
  21. case list:
  22. for (int i=0;i < value->data.list.size;i++)
  23. gc_iterLinkValue(value->data.list.list[i]);
  24. break;
  25. case dict:
  26. gc_iterHashTable(value->data.dict.dict);
  27. break;
  28. default:
  29. break;
  30. }
  31. }
  32. void gc_var_list(VarList *vl){
  33. while (vl != NULL){
  34. gc_iterHashTable(vl->hashtable);
  35. vl = vl->next;
  36. }
  37. }
  38. void gc_iterHashTable(HashTable *ht){
  39. if (ht == NULL)
  40. return;
  41. gcAddLink(&ht->gc_status);
  42. if (setIterAlready(&ht->gc_status))
  43. return;
  44. for (int i=0;i < MAX_SIZE;i++){
  45. gc_iterVar(ht->hashtable[i]);
  46. }
  47. }
  48. void gc_iterVar(Var *var){
  49. while (var != NULL){
  50. gc_iterLinkValue(var->name_);
  51. gc_iterLinkValue(var->value);
  52. var = var->next;
  53. }
  54. }
  55. void gc_resetBase(Inter *inter){
  56. Value *value_base = inter->base;
  57. while (value_base != NULL){
  58. resetGC(&value_base->gc_status);
  59. value_base = value_base->next;
  60. }
  61. LinkValue *link_base = inter->link_base;
  62. while (link_base != NULL){
  63. resetGC(&link_base->gc_status);
  64. link_base = link_base->next;
  65. }
  66. HashTable *hash_base = inter->hash_base;
  67. while (hash_base != NULL){
  68. resetGC(&hash_base->gc_status);
  69. hash_base = hash_base->next;
  70. }
  71. }
  72. void gc_checkBase(Inter *inter){
  73. Value *value_base = inter->base;
  74. while (value_base != NULL){
  75. if (!needFree(&value_base->gc_status) && !value_base->gc_status.continue_)
  76. gc_iterValue(value_base);
  77. value_base = value_base->next;
  78. }
  79. LinkValue *link_base = inter->link_base;
  80. while (link_base != NULL){
  81. if (!needFree(&link_base->gc_status) && !link_base->gc_status.continue_)
  82. gc_iterLinkValue(link_base);
  83. link_base = link_base->next;
  84. }
  85. HashTable *hash_base = inter->hash_base;
  86. while (hash_base != NULL){
  87. if (!needFree(&hash_base->gc_status) && !hash_base->gc_status.continue_)
  88. gc_iterHashTable(hash_base);
  89. hash_base = hash_base->next;
  90. }
  91. }
  92. void gc_freeBase(Inter *inter){
  93. #if START_GC
  94. Value *value_base = inter->base;
  95. while (value_base != NULL){
  96. if (needFree(&value_base->gc_status))
  97. value_base = freeValue(value_base, inter);
  98. else
  99. value_base = value_base->next;
  100. }
  101. LinkValue *link_base = inter->link_base;
  102. while (link_base != NULL){
  103. if (needFree(&link_base->gc_status))
  104. link_base = freeLinkValue(link_base, inter);
  105. else
  106. link_base = link_base->next;
  107. }
  108. HashTable *hash_base = inter->hash_base;
  109. while (hash_base != NULL){
  110. if (needFree(&hash_base->gc_status))
  111. hash_base = freeHashTable(hash_base, inter);
  112. else
  113. hash_base = hash_base->next;
  114. }
  115. #endif
  116. }
  117. void runGC(Inter *inter, int var_list, int link_value, int value, ...){
  118. #if START_GC
  119. gc_resetBase(inter);
  120. va_list arg;
  121. va_start(arg, value);
  122. for (int i =0;i < var_list;i ++){
  123. VarList *tmp = va_arg(arg, VarList *);
  124. gc_var_list(tmp);
  125. }
  126. for (int i =0;i < link_value;i ++){
  127. LinkValue *tmp = va_arg(arg, LinkValue *);
  128. gc_iterLinkValue(tmp);
  129. }
  130. for (int i =0;i < value;i ++){
  131. Value *tmp = va_arg(arg, Value *);
  132. gc_iterValue(tmp);
  133. }
  134. va_end(arg);
  135. gc_checkBase(inter);
  136. gc_freeBase(inter);
  137. #endif
  138. }