diff --git a/src/PikaObj.c b/src/PikaObj.c index 294577ac1..3c98950a5 100644 --- a/src/PikaObj.c +++ b/src/PikaObj.c @@ -1807,8 +1807,8 @@ void obj_dump(PikaObj* self) { #if !PIKA_KERNAL_DEBUG_ENABLE return; #else - pika_platform_printf("[%s]", self->name); - pika_platform_printf("\t\t@%p", self); + pika_platform_printf("[\033[32m%s\033[0m]", self->name); + pika_platform_printf(" \033[36m@%p\033[0m", self); pika_platform_printf("\r\n"); #endif } @@ -1826,8 +1826,8 @@ uint32_t pikaGC_markSweepOnce(PikaGC* gc) { obj = obj->gcNext; } if (count > 0) { - pikaGC_markDump(); - pikaGC_printFreeList(); + // pikaGC_markDump(); + // pikaGC_printFreeList(); for (uint32_t i = 0; i < count; i++) { obj_GC(freeList[i]); } @@ -1901,7 +1901,7 @@ void pikaGC_mark(void) { int _pikaGC_markDumpHandler(PikaGC* gc) { for (uint32_t i = 0; i < gc->markDeepth - 1; i++) { - pika_platform_printf(" "); + pika_platform_printf(" |"); } if (gc->markDeepth != 1) { pika_platform_printf("- "); @@ -1910,13 +1910,6 @@ int _pikaGC_markDumpHandler(PikaGC* gc) { return 0; } -void pikaGC_markDump(void) { - PikaGC gc = {0}; - pika_platform_printf("========= PIKA GC DUMP =========\r\n"); - gc.onMarkObj = _pikaGC_markDumpHandler; - _pikaGC_mark(&gc); -} - #endif PIKA_BOOL obj_checkAlive(PikaObj* self) { @@ -1959,6 +1952,9 @@ uint32_t pikaGC_markSweep(void) { while (pikaGC_markSweepOnce(&gc) != 0) { count++; }; + if (count > 0) { + // pikaGC_markDump(); + } /* update gc state */ g_PikaObjState.objCntLastGC = g_PikaObjState.objCnt; pikaGC_unlock(); @@ -1966,6 +1962,20 @@ uint32_t pikaGC_markSweep(void) { #endif } +void pikaGC_markDump(void) { +#if !PIKA_GC_MARK_SWEEP_ENABLE + return; +#else + PikaGC gc = {0}; + pika_platform_printf( + "\033[31m" + "========= PIKA GC DUMP =========\r\n" + "\033[0m"); + gc.onMarkObj = _pikaGC_markDumpHandler; + _pikaGC_mark(&gc); +#endif +} + void pikaGC_checkThreshold(void) { #if !PIKA_GC_MARK_SWEEP_ENABLE return; diff --git a/src/PikaVM.c b/src/PikaVM.c index 1958b44ae..df67ecbc7 100644 --- a/src/PikaVM.c +++ b/src/PikaVM.c @@ -451,11 +451,9 @@ static int32_t VMState_getAddrOffsetOfContinue(VMState* vm) { static void VMState_delLReg(VMState* vm, uint8_t index) { PikaObj* obj = vm->lreg[index]; if (NULL != obj) { - obj_refcntDec(obj); + obj_enableGC(obj); vm->lreg[index] = NULL; - if (0 == obj_refcntNow(obj)) { - obj_deinit(obj); - } + obj_GC(obj); } } @@ -1604,8 +1602,10 @@ static Arg* VM_instruction_handler_RET(PikaObj* self, Arg* arg_ret_reg) { /* exit jmp signal */ vm->jmp = VM_JMP_EXIT; - Arg* return_arg = stack_popArg_alloc(&(vm->stack)); - method_returnArg(vm->locals->list, return_arg); + Arg* aReturn = stack_popArg_alloc(&(vm->stack)); + /* set gc root to avoid gc */ + arg_setObjFlag(aReturn, OBJ_FLAG_GC_ROOT); + method_returnArg(vm->locals->list, aReturn); return NULL; } @@ -2909,18 +2909,19 @@ static Arg* VM_instruction_handler_DEL(PikaObj* self, if (_checkLReg(data)) { uint8_t reg_index = _getLRegIndex(data); VMState_delLReg(vm, reg_index); - return NULL; + goto __exit; } if (obj_isArgExist(vm->locals, data)) { obj_removeArg(vm->locals, data); - return NULL; + goto __exit; } if (obj_isArgExist(vm->globals, data)) { obj_removeArg(vm->globals, data); - return NULL; + goto __exit; } VMState_setErrorCode(vm, PIKA_RES_ERR_OPERATION_FAILED); pika_platform_printf("NameError: name '%s' is not defined\n", data); +__exit: return NULL; } diff --git a/test/pikaui-test.cpp b/test/pikaui-test.cpp index 1708436a4..ac45cf080 100644 --- a/test/pikaui-test.cpp +++ b/test/pikaui-test.cpp @@ -1,6 +1,7 @@ #include "test_common.h" TEST_START -#if !PIKA_NANO_ENABLE && 0 + +#if PIKA_GC_MARK_SWEEP_ENABLE TEST(pikaui, page) { /* init */ diff --git a/test/python/PikaUI/PikaUI.py b/test/python/PikaUI/PikaUI.py index 46da42917..8dbcab310 100644 --- a/test/python/PikaUI/PikaUI.py +++ b/test/python/PikaUI/PikaUI.py @@ -44,7 +44,8 @@ class Widget: def _set_perent(self, parent): # use weakref to avoid circular reference - self.parent = weakref.ref(parent) + # self.parent = weakref.ref(parent) + self.parent = parent def update(self): if self.needbuild: diff --git a/test/python/PikaUI/test_page.py b/test/python/PikaUI/test_page.py index 9ed23cd88..c750644a6 100644 --- a/test/python/PikaUI/test_page.py +++ b/test/python/PikaUI/test_page.py @@ -59,18 +59,17 @@ class Page2(ui.Page): app = ui.App() -page1 = Page1() -page1.add(page1.build()) app.pageManager.enter(Page2()) app.timer.cb(0) -# mem.now() -# app.pageManager.enter(Page2()) -# app.timer.cb(0) -# mem.now() -# app.pageManager.back() -# app.timer.cb(0) -# mem.now() +mem.now() +app.pageManager.enter(Page2()) +app.timer.cb(0) +mem.now() +app.pageManager.back() +app.timer.cb(0) +mem.now() +gcdump() # for i in range(100): # app.pageManager.enter(Page2())