gc-test.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #include "test_common.h"
  2. TEST_START
  3. TEST(gc, root) {
  4. PikaObj* root = newRootObj("root", New_PikaMain);
  5. EXPECT_EQ(obj_refcntNow(root), 1);
  6. Arg* refArg = arg_setRef(NULL, "", root);
  7. EXPECT_EQ(obj_refcntNow(root), 2);
  8. arg_deinit(refArg);
  9. EXPECT_EQ(obj_refcntNow(root), 1);
  10. obj_deinit(root);
  11. EXPECT_EQ(pikaMemNow(), 0);
  12. }
  13. TEST(gc, ref1) {
  14. /* init */
  15. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  16. /* run */
  17. obj_run(pikaMain, "mem = PikaStdLib.MemChecker()");
  18. PikaObj* mem = (PikaObj*)obj_getPtr(pikaMain, "mem");
  19. EXPECT_EQ(obj_refcntNow(mem), 1);
  20. /* deinit */
  21. obj_deinit(pikaMain);
  22. EXPECT_EQ(pikaMemNow(), 0);
  23. }
  24. TEST(gc, ref121) {
  25. /* init */
  26. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  27. /* run */
  28. obj_run(pikaMain, "mem = PikaStdLib.MemChecker()");
  29. PikaObj* mem = (PikaObj*)obj_getPtr(pikaMain, "mem");
  30. EXPECT_EQ(obj_refcntNow(mem), 1);
  31. obj_run(pikaMain, "mem2 = mem");
  32. EXPECT_EQ(obj_refcntNow(mem), 2);
  33. obj_removeArg(pikaMain, "mem2");
  34. EXPECT_EQ(obj_refcntNow(mem), 1);
  35. /* deinit */
  36. obj_deinit(pikaMain);
  37. EXPECT_EQ(pikaMemNow(), 0);
  38. }
  39. TEST(gc, ref12) {
  40. /* init */
  41. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  42. /* run */
  43. obj_run(pikaMain, "mem = PikaStdLib.MemChecker()");
  44. PikaObj* mem = (PikaObj*)obj_getPtr(pikaMain, "mem");
  45. EXPECT_EQ(obj_refcntNow(mem), 1);
  46. obj_run(pikaMain, "mem2 = mem");
  47. EXPECT_EQ(obj_refcntNow(mem), 2);
  48. /* deinit */
  49. obj_deinit(pikaMain);
  50. EXPECT_EQ(pikaMemNow(), 0);
  51. }
  52. TEST(gc, ref1210) {
  53. /* init */
  54. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  55. /* run */
  56. obj_run(pikaMain, "mem = PikaStdLib.MemChecker()");
  57. PikaObj* mem = (PikaObj*)obj_getPtr(pikaMain, "mem");
  58. EXPECT_EQ(obj_refcntNow(mem), 1);
  59. obj_run(pikaMain, "mem2 = mem");
  60. EXPECT_EQ(obj_refcntNow(mem), 2);
  61. obj_removeArg(pikaMain, "mem2");
  62. EXPECT_EQ(obj_refcntNow(mem), 1);
  63. /* deinit */
  64. obj_deinit(pikaMain);
  65. EXPECT_EQ(pikaMemNow(), 0);
  66. }
  67. TEST(gc, ref_move) {
  68. /* init */
  69. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  70. /* run */
  71. obj_run(pikaMain, "mem = PikaStdLib.MemChecker()");
  72. PikaObj* mem = (PikaObj*)obj_getPtr(pikaMain, "mem");
  73. EXPECT_EQ(obj_refcntNow(mem), 1);
  74. obj_run(pikaMain, "mem2 = mem");
  75. EXPECT_EQ(obj_refcntNow(mem), 2);
  76. obj_removeArg(pikaMain, "mem");
  77. EXPECT_EQ(obj_refcntNow(mem), 1);
  78. /* deinit */
  79. obj_deinit(pikaMain);
  80. EXPECT_EQ(pikaMemNow(), 0);
  81. }
  82. TEST(gc, factory) {
  83. /* init */
  84. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  85. /* run */
  86. obj_run(pikaMain,
  87. "def factory():\n"
  88. " _mem = PikaStdLib.MemChecker()\n"
  89. " return _mem\n"
  90. "mem = factory()\n");
  91. /* collect */
  92. PikaObj* mem = obj_getObj(pikaMain, "mem");
  93. EXPECT_EQ(obj_refcntNow(mem), 1);
  94. /* deinit */
  95. obj_deinit(pikaMain);
  96. EXPECT_EQ(pikaMemNow(), 0);
  97. }
  98. TEST(gc, not_out) {
  99. /* init */
  100. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  101. /* run */
  102. obj_run(pikaMain, "PikaStdLib.MemChecker()\n");
  103. /* deinit */
  104. obj_deinit(pikaMain);
  105. EXPECT_EQ(pikaMemNow(), 0);
  106. }
  107. TEST(gc, heap_failed1) {
  108. /* init */
  109. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  110. /* run */
  111. obj_run(pikaMain,
  112. "recv_buf = PikaStdData.List()\n"
  113. "RECV_MAX_SIZE=128\n"
  114. "iteri = 0\n"
  115. "for i in range(0, int(RECV_MAX_SIZE)):\n"
  116. " recv_buf.append(0)\n"
  117. " iteri += 1\n"
  118. "iteri");
  119. /* assert */
  120. EXPECT_STREQ("128\r\n", log_buff[0]);
  121. #if PIKA_GC_MARK_SWEEP_ENABLE
  122. int cnt = pikaGC_count();
  123. EXPECT_EQ(cnt != 0, 1);
  124. pikaGC_markDump();
  125. int cnt_marked = pikaGC_countMarked();
  126. EXPECT_EQ(cnt, cnt_marked);
  127. /* deinit */
  128. #endif
  129. obj_deinit(pikaMain);
  130. #if PIKA_GC_MARK_SWEEP_ENABLE
  131. cnt = pikaGC_count();
  132. EXPECT_EQ(cnt, 0);
  133. #endif
  134. EXPECT_EQ(pikaMemNow(), 0);
  135. }
  136. #if PIKA_GC_MARK_SWEEP_ENABLE
  137. TEST(gc, circle) {
  138. /* init */
  139. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  140. /* run */
  141. pikaVM_runSingleFile(pikaMain, "test/python/gc/gc_circle.py");
  142. /* assert */
  143. /* deinit */
  144. obj_deinit(pikaMain);
  145. EXPECT_EQ(pikaMemNow(), 0);
  146. }
  147. TEST(gc, circle2) {
  148. /* init */
  149. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  150. /* run */
  151. pikaVM_runSingleFile(pikaMain, "test/python/gc/gc_circle2.py");
  152. /* assert */
  153. /* deinit */
  154. obj_deinit(pikaMain);
  155. EXPECT_EQ(pikaMemNow(), 0);
  156. }
  157. TEST(gc, tree1) {
  158. /* init */
  159. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  160. /* run */
  161. pikaVM_runSingleFile(pikaMain, "test/python/gc/gc_tree1.py");
  162. /* assert */
  163. /* deinit */
  164. obj_deinit(pikaMain);
  165. EXPECT_EQ(pikaMemNow(), 0);
  166. }
  167. #endif
  168. TEST_END