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/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",
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
sh api-make.sh
|
sh api-make.sh
|
||||||
cd build
|
|
||||||
ninja clean
|
ninja clean
|
||||||
ninja -j0
|
sh only_make.sh
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user