gc not pass

This commit is contained in:
lyon 2022-04-25 23:38:10 +08:00
parent 88c0fd481e
commit 9803b1cf9f
6 changed files with 56 additions and 8 deletions

View File

@ -18,6 +18,7 @@
"program": "${workspaceFolder}/build/test/pikascript_test", "program": "${workspaceFolder}/build/test/pikascript_test",
// "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain", // "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain",
"args": [ "args": [
"--gtest_filter=gc.*",
// "--gtest_filter=parser.bytes_iteral", // "--gtest_filter=parser.bytes_iteral",
// "--gtest_filter=parser.list_init_fun", // "--gtest_filter=parser.list_init_fun",
// "--gtest_filter=args.heap_struct_override", // "--gtest_filter=args.heap_struct_override",

View File

@ -1,4 +1,3 @@
sh api-make.sh sh api-make.sh
cd build
ninja clean ninja clean
ninja -j0 sh only_make.sh

View File

@ -110,13 +110,28 @@ int32_t deinitEachSubObj(Arg* argEach, Args* handleArgs) {
return 0; return 0;
} }
void deinitAllSubObj(PikaObj* self) { static void __deinitAllSubObj(PikaObj* self) {
Args* args = self->list; Args* args = self->list;
args_foreach(args, deinitEachSubObj, NULL); args_foreach(args, deinitEachSubObj, NULL);
} }
static void __obj_deinit_pyload(PikaObj* self) {
/* no refcnt, deinit directly */
if (!obj_isArgExist(self, "_refcnt")) {
__deinitAllSubObj(self);
return;
}
/* refcnt exist, only deinit when refcnt = 0 */
int ref_cnt = obj_refcntNow(self);
if (ref_cnt == 0 || ref_cnt == 1) {
__deinitAllSubObj(self);
return;
}
return;
}
int32_t obj_deinit(PikaObj* self) { int32_t obj_deinit(PikaObj* self) {
deinitAllSubObj(self); __obj_deinit_pyload(self);
args_deinit(self->list); args_deinit(self->list);
pikaFree(self, sizeof(PikaObj)); pikaFree(self, sizeof(PikaObj));
self = NULL; self = NULL;
@ -381,6 +396,7 @@ PikaObj* removeMethodInfo(PikaObj* thisClass) {
PikaObj* newObjFromFun(NewFun newObjFun) { PikaObj* newObjFromFun(NewFun newObjFun) {
PikaObj* thisClass = obj_getClassObjByNewFun(NULL, "", newObjFun); PikaObj* thisClass = obj_getClassObjByNewFun(NULL, "", newObjFun);
obj_refcntInc(thisClass);
return removeMethodInfo(thisClass); return removeMethodInfo(thisClass);
} }
@ -889,5 +905,6 @@ int obj_refcntNow(PikaObj* self) {
} }
Arg* arg_setRefObj(Arg* self, char* name, PikaObj* obj) { Arg* arg_setRefObj(Arg* self, char* name, PikaObj* obj) {
obj_refcntInc(obj);
return arg_setPtr(self, name, ARG_TYPE_REF_OBJECT, obj); return arg_setPtr(self, name, ARG_TYPE_REF_OBJECT, obj);
} }

View File

@ -309,7 +309,8 @@ Arg* arg_copy(Arg* argToBeCopy) {
if (NULL == argToBeCopy) { if (NULL == argToBeCopy) {
return NULL; return NULL;
} }
if (ARG_TYPE_OBJECT == arg_getType(argToBeCopy)) { ArgType arg_type = arg_getType(argToBeCopy);
if (ARG_TYPE_OBJECT == arg_type || ARG_TYPE_REF_OBJECT == arg_type) {
obj_refcntInc(arg_getPtr(argToBeCopy)); obj_refcntInc(arg_getPtr(argToBeCopy));
} }
Arg* argCopied = New_arg(NULL); Arg* argCopied = New_arg(NULL);
@ -351,6 +352,12 @@ void arg_deinitHeap(Arg* self) {
void arg_deinit(Arg* self) { void arg_deinit(Arg* self) {
arg_deinitHeap(self); arg_deinitHeap(self);
if (arg_getType(self) == ARG_TYPE_REF_OBJECT) {
PikaObj* obj = arg_getPtr(self);
if (obj_isArgExist(obj, "_refcnt")) {
obj_refcntDec(obj);
}
}
arg_freeContent(self); arg_freeContent(self);
} }

View File

@ -110,13 +110,28 @@ int32_t deinitEachSubObj(Arg* argEach, Args* handleArgs) {
return 0; return 0;
} }
void deinitAllSubObj(PikaObj* self) { static void __deinitAllSubObj(PikaObj* self) {
Args* args = self->list; Args* args = self->list;
args_foreach(args, deinitEachSubObj, NULL); args_foreach(args, deinitEachSubObj, NULL);
} }
static void __obj_deinit_pyload(PikaObj* self) {
/* no refcnt, deinit directly */
if (!obj_isArgExist(self, "_refcnt")) {
__deinitAllSubObj(self);
return;
}
/* refcnt exist, only deinit when refcnt = 0 */
int ref_cnt = obj_refcntNow(self);
if (ref_cnt == 0 || ref_cnt == 1) {
__deinitAllSubObj(self);
return;
}
return;
}
int32_t obj_deinit(PikaObj* self) { int32_t obj_deinit(PikaObj* self) {
deinitAllSubObj(self); __obj_deinit_pyload(self);
args_deinit(self->list); args_deinit(self->list);
pikaFree(self, sizeof(PikaObj)); pikaFree(self, sizeof(PikaObj));
self = NULL; self = NULL;
@ -381,6 +396,7 @@ PikaObj* removeMethodInfo(PikaObj* thisClass) {
PikaObj* newObjFromFun(NewFun newObjFun) { PikaObj* newObjFromFun(NewFun newObjFun) {
PikaObj* thisClass = obj_getClassObjByNewFun(NULL, "", newObjFun); PikaObj* thisClass = obj_getClassObjByNewFun(NULL, "", newObjFun);
obj_refcntInc(thisClass);
return removeMethodInfo(thisClass); return removeMethodInfo(thisClass);
} }
@ -889,5 +905,6 @@ int obj_refcntNow(PikaObj* self) {
} }
Arg* arg_setRefObj(Arg* self, char* name, PikaObj* obj) { Arg* arg_setRefObj(Arg* self, char* name, PikaObj* obj) {
obj_refcntInc(obj);
return arg_setPtr(self, name, ARG_TYPE_REF_OBJECT, obj); return arg_setPtr(self, name, ARG_TYPE_REF_OBJECT, obj);
} }

View File

@ -309,7 +309,8 @@ Arg* arg_copy(Arg* argToBeCopy) {
if (NULL == argToBeCopy) { if (NULL == argToBeCopy) {
return NULL; return NULL;
} }
if (ARG_TYPE_OBJECT == arg_getType(argToBeCopy)) { ArgType arg_type = arg_getType(argToBeCopy);
if (ARG_TYPE_OBJECT == arg_type || ARG_TYPE_REF_OBJECT == arg_type) {
obj_refcntInc(arg_getPtr(argToBeCopy)); obj_refcntInc(arg_getPtr(argToBeCopy));
} }
Arg* argCopied = New_arg(NULL); Arg* argCopied = New_arg(NULL);
@ -351,6 +352,12 @@ void arg_deinitHeap(Arg* self) {
void arg_deinit(Arg* self) { void arg_deinit(Arg* self) {
arg_deinitHeap(self); arg_deinitHeap(self);
if (arg_getType(self) == ARG_TYPE_REF_OBJECT) {
PikaObj* obj = arg_getPtr(self);
if (obj_isArgExist(obj, "_refcnt")) {
obj_refcntDec(obj);
}
}
arg_freeContent(self); arg_freeContent(self);
} }