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/boot/demo06-pikamain/pikascript_demo06-pikamain",
"args": [
"--gtest_filter=gc.*",
// "--gtest_filter=parser.bytes_iteral",
// "--gtest_filter=parser.list_init_fun",
// "--gtest_filter=args.heap_struct_override",

View File

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

View File

@ -110,13 +110,28 @@ int32_t deinitEachSubObj(Arg* argEach, Args* handleArgs) {
return 0;
}
void deinitAllSubObj(PikaObj* self) {
static void __deinitAllSubObj(PikaObj* self) {
Args* args = self->list;
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) {
deinitAllSubObj(self);
__obj_deinit_pyload(self);
args_deinit(self->list);
pikaFree(self, sizeof(PikaObj));
self = NULL;
@ -381,6 +396,7 @@ PikaObj* removeMethodInfo(PikaObj* thisClass) {
PikaObj* newObjFromFun(NewFun newObjFun) {
PikaObj* thisClass = obj_getClassObjByNewFun(NULL, "", newObjFun);
obj_refcntInc(thisClass);
return removeMethodInfo(thisClass);
}
@ -889,5 +905,6 @@ int obj_refcntNow(PikaObj* self) {
}
Arg* arg_setRefObj(Arg* self, char* name, PikaObj* obj) {
obj_refcntInc(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) {
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));
}
Arg* argCopied = New_arg(NULL);
@ -351,6 +352,12 @@ void arg_deinitHeap(Arg* self) {
void arg_deinit(Arg* 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);
}

View File

@ -110,13 +110,28 @@ int32_t deinitEachSubObj(Arg* argEach, Args* handleArgs) {
return 0;
}
void deinitAllSubObj(PikaObj* self) {
static void __deinitAllSubObj(PikaObj* self) {
Args* args = self->list;
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) {
deinitAllSubObj(self);
__obj_deinit_pyload(self);
args_deinit(self->list);
pikaFree(self, sizeof(PikaObj));
self = NULL;
@ -381,6 +396,7 @@ PikaObj* removeMethodInfo(PikaObj* thisClass) {
PikaObj* newObjFromFun(NewFun newObjFun) {
PikaObj* thisClass = obj_getClassObjByNewFun(NULL, "", newObjFun);
obj_refcntInc(thisClass);
return removeMethodInfo(thisClass);
}
@ -889,5 +905,6 @@ int obj_refcntNow(PikaObj* self) {
}
Arg* arg_setRefObj(Arg* self, char* name, PikaObj* obj) {
obj_refcntInc(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) {
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));
}
Arg* argCopied = New_arg(NULL);
@ -351,6 +352,12 @@ void arg_deinitHeap(Arg* self) {
void arg_deinit(Arg* 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);
}