mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
gc not pass
This commit is contained in:
parent
88c0fd481e
commit
9803b1cf9f
1
port/linux/.vscode/launch.json
vendored
1
port/linux/.vscode/launch.json
vendored
@ -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",
|
||||
|
@ -1,4 +1,3 @@
|
||||
sh api-make.sh
|
||||
cd build
|
||||
ninja clean
|
||||
ninja -j0
|
||||
sh only_make.sh
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user