mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
combine object and ref object
This commit is contained in:
parent
16886ec594
commit
df0db6a390
@ -37,7 +37,7 @@ void PikaStdLib_SysObj_type(PikaObj* self, Arg* arg) {
|
||||
obj_setSysOut(self, "string");
|
||||
return;
|
||||
}
|
||||
if (ARG_TYPE_REF_OBJECT == type) {
|
||||
if (ARG_TYPE_OBJECT == type) {
|
||||
obj_setSysOut(self, "pointer");
|
||||
return;
|
||||
}
|
||||
@ -113,7 +113,7 @@ Arg* PikaStdLib_SysObj_iter(PikaObj* self, Arg* arg) {
|
||||
return arg_copy(arg);
|
||||
}
|
||||
/* object */
|
||||
if (ARG_TYPE_REF_OBJECT == arg_getType(arg)) {
|
||||
if (ARG_TYPE_OBJECT == arg_getType(arg)) {
|
||||
PikaObj* arg_obj = arg_getPtr(arg);
|
||||
// pikaVM_runAsm(arg_obj,
|
||||
// "B0\n"
|
||||
@ -150,7 +150,7 @@ Arg* PikaStdLib_SysObj___get__(PikaObj* self, Arg* key, Arg* obj) {
|
||||
char_buff[0] = str_pyload[index];
|
||||
return arg_setStr(NULL, "", char_buff);
|
||||
}
|
||||
if ((ARG_TYPE_OBJECT == obj_type) || (ARG_TYPE_REF_OBJECT == obj_type)) {
|
||||
if ((ARG_TYPE_OBJECT == obj_type) || (ARG_TYPE_OBJECT == obj_type)) {
|
||||
PikaObj* arg_obj = arg_getPtr(obj);
|
||||
obj_setArg(arg_obj, "__key", key);
|
||||
// pikaVM_runAsm(arg_obj,
|
||||
@ -187,7 +187,7 @@ void PikaStdLib_SysObj___set__(PikaObj* self,
|
||||
str_pyload[index] = str_val[0];
|
||||
obj_setStr(self, obj_str, str_pyload);
|
||||
}
|
||||
if ((ARG_TYPE_OBJECT == obj_type) || (ARG_TYPE_REF_OBJECT == obj_type)) {
|
||||
if ((ARG_TYPE_OBJECT == obj_type) || (ARG_TYPE_OBJECT == obj_type)) {
|
||||
PikaObj* arg_obj = arg_getPtr(obj);
|
||||
obj_setArg(arg_obj, "__key", key);
|
||||
obj_setArg(arg_obj, "__val", val);
|
||||
|
3
port/linux/.vscode/launch.json
vendored
3
port/linux/.vscode/launch.json
vendored
@ -11,7 +11,8 @@
|
||||
"program": "${workspaceFolder}/build/test/pikascript_test",
|
||||
// "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain",
|
||||
"args": [
|
||||
// "--gtest_filter=pikaMain.list_iter",
|
||||
// "--gtest_filter=pikaMain.range",
|
||||
// "--gtest_filter=pikaMain.range",
|
||||
// "--gtest_filter=gc.*",
|
||||
// "--gtest_filter=parser.bytes_iteral",
|
||||
// "--gtest_filter=parser.list_init_fun",
|
||||
|
@ -35,11 +35,9 @@
|
||||
#include "dataStrs.h"
|
||||
|
||||
Arg* arg_setMetaObj(char* objName, char* className, NewFun objPtr) {
|
||||
Args buffs = {0};
|
||||
Arg* argNew = New_arg(NULL);
|
||||
/* m means mate-object */
|
||||
argNew = arg_setPtr(argNew, objName, ARG_TYPE_MATE_OBJECT, (void*)objPtr);
|
||||
strsDeinit(&buffs);
|
||||
return argNew;
|
||||
}
|
||||
|
||||
@ -48,8 +46,8 @@ int32_t obj_newObj(PikaObj* self,
|
||||
char* className,
|
||||
NewFun newFunPtr) {
|
||||
/* add mate Obj, no inited */
|
||||
Arg* mateObj = arg_setMetaObj(objName, className, newFunPtr);
|
||||
args_setArg(self->list, mateObj);
|
||||
Arg* newobj = arg_setMetaObj(objName, className, newFunPtr);
|
||||
args_setArg(self->list, newobj);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -361,7 +361,7 @@ PikaObj* removeMethodInfo(PikaObj* thisClass) {
|
||||
return thisClass;
|
||||
}
|
||||
|
||||
PikaObj* newObjFromFun(NewFun newObjFun) {
|
||||
PikaObj* obj_newObjDirect(NewFun newObjFun) {
|
||||
PikaObj* thisClass = obj_getClassObjByNewFun(NULL, "", newObjFun);
|
||||
obj_refcntInc(thisClass);
|
||||
return removeMethodInfo(thisClass);
|
||||
@ -369,7 +369,7 @@ PikaObj* newObjFromFun(NewFun newObjFun) {
|
||||
|
||||
extern PikaObj* __pikaMain;
|
||||
PikaObj* newRootObj(char* name, NewFun newObjFun) {
|
||||
PikaObj* newObj = newObjFromFun(newObjFun);
|
||||
PikaObj* newObj = obj_newObjDirect(newObjFun);
|
||||
__pikaMain = newObj;
|
||||
return newObj;
|
||||
}
|
||||
@ -378,14 +378,14 @@ Arg* obj_getRefArg(PikaObj* self) {
|
||||
return arg_setPtr(NULL, "", ARG_TYPE_FREE_OBJECT, self);
|
||||
}
|
||||
|
||||
Arg* newFreeObjArg(NewFun newObjFun) {
|
||||
PikaObj* newObj = newObjFromFun(newObjFun);
|
||||
Arg* obj_newObjArg(NewFun newObjFun) {
|
||||
PikaObj* newObj = obj_newObjDirect(newObjFun);
|
||||
Arg* objArg = arg_setPtr(NULL, "", ARG_TYPE_FREE_OBJECT, newObj);
|
||||
return objArg;
|
||||
}
|
||||
|
||||
Arg* obj_newObjInPackage(NewFun newObjFun) {
|
||||
return newFreeObjArg(newObjFun);
|
||||
return obj_newObjArg(newObjFun);
|
||||
}
|
||||
|
||||
static PikaObj* __initObj(PikaObj* obj, char* name) {
|
||||
@ -421,7 +421,7 @@ PikaObj* obj_getObjDirect(PikaObj* self, char* name) {
|
||||
return __initObj(self, name);
|
||||
}
|
||||
/* found Objcet */
|
||||
if (type == ARG_TYPE_OBJECT || type == ARG_TYPE_REF_OBJECT) {
|
||||
if (type == ARG_TYPE_OBJECT || type == ARG_TYPE_OBJECT) {
|
||||
return args_getPtr(self->list, name);
|
||||
}
|
||||
return NULL;
|
||||
@ -869,9 +869,9 @@ 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);
|
||||
return arg_setPtr(self, name, ARG_TYPE_OBJECT, obj);
|
||||
}
|
||||
|
||||
Arg* arg_setWeakRefObj(Arg* self, char* name, PikaObj* obj) {
|
||||
return arg_setPtr(self, name, ARG_TYPE_REF_OBJECT, obj);
|
||||
return arg_setPtr(self, name, ARG_TYPE_OBJECT, obj);
|
||||
}
|
||||
|
@ -223,12 +223,13 @@ void obj_shellLineProcess(PikaObj* self,
|
||||
int pikaCompile(char* output_file_name, char* py_lines);
|
||||
Method obj_getNativeMethod(PikaObj* self, char* method_name);
|
||||
void obj_runNativeMethod(PikaObj* self, char* method_name, Args* args);
|
||||
Arg* newFreeObjArg(NewFun newObjFun);
|
||||
Arg* obj_newObjArg(NewFun newObjFun);
|
||||
Arg* obj_newObjInPackage(NewFun newObjFun);
|
||||
|
||||
void obj_refcntInc(PikaObj* self);
|
||||
void obj_refcntDec(PikaObj* self);
|
||||
int obj_refcntNow(PikaObj* self);
|
||||
PikaObj* obj_newObjDirect(NewFun newObjFun);
|
||||
Arg* arg_setRefObj(Arg* self, char* name, PikaObj* obj);
|
||||
Arg* arg_setWeakRefObj(Arg* self, char* name, PikaObj* obj);
|
||||
|
||||
|
@ -153,7 +153,7 @@ static Arg* VM_instruction_handler_NON(PikaObj* self, VMState* vs, char* data) {
|
||||
static Arg* VM_instruction_handler_NEW(PikaObj* self, VMState* vs, char* data) {
|
||||
Arg* origin_arg = obj_getArg(vs->locals, data);
|
||||
Arg* new_arg = arg_copy(origin_arg);
|
||||
origin_arg = arg_setType(origin_arg, ARG_TYPE_REF_OBJECT);
|
||||
origin_arg = arg_setType(origin_arg, ARG_TYPE_OBJECT);
|
||||
arg_setType(new_arg, ARG_TYPE_FREE_OBJECT);
|
||||
return new_arg;
|
||||
}
|
||||
@ -173,7 +173,7 @@ static Arg* VM_instruction_handler_REF(PikaObj* self, VMState* vs, char* data) {
|
||||
}
|
||||
ArgType arg_type = arg_getType(arg);
|
||||
if (ARG_TYPE_OBJECT == arg_type) {
|
||||
arg = arg_setType(arg, ARG_TYPE_REF_OBJECT);
|
||||
arg = arg_setType(arg, ARG_TYPE_OBJECT);
|
||||
}
|
||||
if (NULL == arg) {
|
||||
VMState_setErrorCode(vs, 1);
|
||||
@ -271,7 +271,7 @@ static void VMState_loadArgsFromMethodArg(VMState* vs,
|
||||
/* load 'self' as the first arg when call object method */
|
||||
if (method_type == ARG_TYPE_OBJECT_METHOD) {
|
||||
Arg* call_arg =
|
||||
arg_setPtr(NULL, "self", ARG_TYPE_REF_OBJECT, method_host_obj);
|
||||
arg_setPtr(NULL, "self", ARG_TYPE_OBJECT, method_host_obj);
|
||||
args_setArg(args, call_arg);
|
||||
}
|
||||
exit:
|
||||
@ -491,7 +491,6 @@ static Arg* VM_instruction_handler_OUT(PikaObj* self, VMState* vs, char* data) {
|
||||
/* set free object to nomal object */
|
||||
if (ARG_TYPE_FREE_OBJECT == outArg_type) {
|
||||
arg_setType(outArg, ARG_TYPE_OBJECT);
|
||||
arg_refCntInc(outArg);
|
||||
}
|
||||
|
||||
/* ouput arg to locals */
|
||||
|
@ -310,7 +310,7 @@ Arg* arg_copy(Arg* argToBeCopy) {
|
||||
return NULL;
|
||||
}
|
||||
ArgType arg_type = arg_getType(argToBeCopy);
|
||||
if (ARG_TYPE_OBJECT == arg_type || ARG_TYPE_REF_OBJECT == arg_type) {
|
||||
if (ARG_TYPE_OBJECT == arg_type || ARG_TYPE_OBJECT == arg_type) {
|
||||
obj_refcntInc(arg_getPtr(argToBeCopy));
|
||||
}
|
||||
Arg* argCopied = New_arg(NULL);
|
||||
@ -354,7 +354,7 @@ void arg_deinit(Arg* self) {
|
||||
arg_deinitHeap(self);
|
||||
/* deinit sub object */
|
||||
ArgType type = arg_getType(self);
|
||||
if (type == ARG_TYPE_OBJECT || type == ARG_TYPE_REF_OBJECT) {
|
||||
if (type == ARG_TYPE_OBJECT || type == ARG_TYPE_OBJECT) {
|
||||
PikaObj* subObj = arg_getPtr(self);
|
||||
obj_refcntDec(subObj);
|
||||
int ref_cnt = obj_refcntNow(subObj);
|
||||
@ -365,15 +365,3 @@ void arg_deinit(Arg* self) {
|
||||
/* free the ref */
|
||||
arg_freeContent(self);
|
||||
}
|
||||
|
||||
void arg_refCntInc(Arg* self) {
|
||||
((__arg*)self)->ref_cnt++;
|
||||
}
|
||||
|
||||
void arg_refCntDec(Arg* self) {
|
||||
((__arg*)self)->ref_cnt--;
|
||||
}
|
||||
|
||||
uint8_t arg_getRefCnt(Arg* self) {
|
||||
return ((__arg*)self)->ref_cnt;
|
||||
}
|
||||
|
@ -40,11 +40,10 @@ typedef enum {
|
||||
ARG_TYPE_INT,
|
||||
ARG_TYPE_FLOAT,
|
||||
ARG_TYPE_STRING,
|
||||
ARG_TYPE_OBJECT,
|
||||
ARG_TYPE_MATE_OBJECT,
|
||||
ARG_TYPE_FREE_OBJECT,
|
||||
ARG_TYPE_OBJECT,
|
||||
ARG_TYPE_POINTER,
|
||||
ARG_TYPE_REF_OBJECT,
|
||||
ARG_TYPE_NATIVE_METHOD,
|
||||
ARG_TYPE_NATIVE_CONSTRUCTOR_METHOD,
|
||||
ARG_TYPE_CONSTRUCTOR_METHOD,
|
||||
@ -139,8 +138,5 @@ void* arg_getHeapStruct(Arg* self);
|
||||
void arg_deinitHeap(Arg* self);
|
||||
Arg* arg_setBytes(Arg* self, char* name, uint8_t* src, size_t size);
|
||||
void arg_printBytes(Arg* self);
|
||||
void arg_refCntInc(Arg* self);
|
||||
void arg_refCntDec(Arg* self);
|
||||
uint8_t arg_getRefCnt(Arg* self);
|
||||
|
||||
#endif
|
||||
|
@ -437,7 +437,7 @@ char* args_print(Args* self, char* name) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (type == ARG_TYPE_REF_OBJECT) {
|
||||
if (type == ARG_TYPE_OBJECT) {
|
||||
void* val = args_getPtr(self, name);
|
||||
res = getPrintStringFromPtr(self, name, val);
|
||||
goto exit;
|
||||
|
@ -37,7 +37,7 @@ void PikaStdLib_SysObj_type(PikaObj* self, Arg* arg) {
|
||||
obj_setSysOut(self, "string");
|
||||
return;
|
||||
}
|
||||
if (ARG_TYPE_REF_OBJECT == type) {
|
||||
if (ARG_TYPE_OBJECT == type) {
|
||||
obj_setSysOut(self, "pointer");
|
||||
return;
|
||||
}
|
||||
@ -113,7 +113,7 @@ Arg* PikaStdLib_SysObj_iter(PikaObj* self, Arg* arg) {
|
||||
return arg_copy(arg);
|
||||
}
|
||||
/* object */
|
||||
if (ARG_TYPE_REF_OBJECT == arg_getType(arg)) {
|
||||
if (ARG_TYPE_OBJECT == arg_getType(arg)) {
|
||||
PikaObj* arg_obj = arg_getPtr(arg);
|
||||
// pikaVM_runAsm(arg_obj,
|
||||
// "B0\n"
|
||||
@ -150,7 +150,7 @@ Arg* PikaStdLib_SysObj___get__(PikaObj* self, Arg* key, Arg* obj) {
|
||||
char_buff[0] = str_pyload[index];
|
||||
return arg_setStr(NULL, "", char_buff);
|
||||
}
|
||||
if ((ARG_TYPE_OBJECT == obj_type) || (ARG_TYPE_REF_OBJECT == obj_type)) {
|
||||
if ((ARG_TYPE_OBJECT == obj_type) || (ARG_TYPE_OBJECT == obj_type)) {
|
||||
PikaObj* arg_obj = arg_getPtr(obj);
|
||||
obj_setArg(arg_obj, "__key", key);
|
||||
// pikaVM_runAsm(arg_obj,
|
||||
@ -187,7 +187,7 @@ void PikaStdLib_SysObj___set__(PikaObj* self,
|
||||
str_pyload[index] = str_val[0];
|
||||
obj_setStr(self, obj_str, str_pyload);
|
||||
}
|
||||
if ((ARG_TYPE_OBJECT == obj_type) || (ARG_TYPE_REF_OBJECT == obj_type)) {
|
||||
if ((ARG_TYPE_OBJECT == obj_type) || (ARG_TYPE_OBJECT == obj_type)) {
|
||||
PikaObj* arg_obj = arg_getPtr(obj);
|
||||
obj_setArg(arg_obj, "__key", key);
|
||||
obj_setArg(arg_obj, "__val", val);
|
||||
|
@ -581,7 +581,7 @@ TEST(VM, RUN_NEW) {
|
||||
ArgType newObj_type = arg_getType(newObj);
|
||||
ArgType outObj_type = arg_getType(outObj);
|
||||
EXPECT_EQ(x, 1);
|
||||
EXPECT_EQ(newObj_type, ARG_TYPE_REF_OBJECT);
|
||||
EXPECT_EQ(newObj_type, ARG_TYPE_OBJECT);
|
||||
EXPECT_EQ(outObj_type, ARG_TYPE_OBJECT);
|
||||
obj_deinit(self);
|
||||
// obj_deinit(globals);
|
||||
|
@ -349,22 +349,22 @@ TEST(pikaMain, list_for_loop) {
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
TEST(pikaMain, range) {
|
||||
/* init */
|
||||
pikaMemInfo.heapUsedMax = 0;
|
||||
PikaObj* pikaMain = newRootObj((char*)"pikaMain", New_PikaMain);
|
||||
/* run */
|
||||
obj_runDirect(pikaMain, (char*)
|
||||
"r = range(10, 0)\n"
|
||||
"ir = iter(r)\n"
|
||||
"\n"
|
||||
);
|
||||
/* collect */
|
||||
/* assert */
|
||||
obj_deinit(pikaMain);
|
||||
/* mem check */
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
// TEST(pikaMain, range) {
|
||||
// /* init */
|
||||
// pikaMemInfo.heapUsedMax = 0;
|
||||
// PikaObj* pikaMain = newRootObj((char*)"pikaMain", New_PikaMain);
|
||||
// /* run */
|
||||
// obj_runDirect(pikaMain, (char*)
|
||||
// "r = range(10, 0)\n"
|
||||
// "r\n"
|
||||
// "\n"
|
||||
// );
|
||||
// /* collect */
|
||||
// /* assert */
|
||||
// obj_deinit(pikaMain);
|
||||
// /* mem check */
|
||||
// EXPECT_EQ(pikaMemNow(), 0);
|
||||
// }
|
||||
|
||||
TEST(pikaMain, for_in_range) {
|
||||
/* init */
|
||||
|
@ -35,11 +35,9 @@
|
||||
#include "dataStrs.h"
|
||||
|
||||
Arg* arg_setMetaObj(char* objName, char* className, NewFun objPtr) {
|
||||
Args buffs = {0};
|
||||
Arg* argNew = New_arg(NULL);
|
||||
/* m means mate-object */
|
||||
argNew = arg_setPtr(argNew, objName, ARG_TYPE_MATE_OBJECT, (void*)objPtr);
|
||||
strsDeinit(&buffs);
|
||||
return argNew;
|
||||
}
|
||||
|
||||
@ -48,8 +46,8 @@ int32_t obj_newObj(PikaObj* self,
|
||||
char* className,
|
||||
NewFun newFunPtr) {
|
||||
/* add mate Obj, no inited */
|
||||
Arg* mateObj = arg_setMetaObj(objName, className, newFunPtr);
|
||||
args_setArg(self->list, mateObj);
|
||||
Arg* newobj = arg_setMetaObj(objName, className, newFunPtr);
|
||||
args_setArg(self->list, newobj);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -361,7 +361,7 @@ PikaObj* removeMethodInfo(PikaObj* thisClass) {
|
||||
return thisClass;
|
||||
}
|
||||
|
||||
PikaObj* newObjFromFun(NewFun newObjFun) {
|
||||
PikaObj* obj_newObjDirect(NewFun newObjFun) {
|
||||
PikaObj* thisClass = obj_getClassObjByNewFun(NULL, "", newObjFun);
|
||||
obj_refcntInc(thisClass);
|
||||
return removeMethodInfo(thisClass);
|
||||
@ -369,7 +369,7 @@ PikaObj* newObjFromFun(NewFun newObjFun) {
|
||||
|
||||
extern PikaObj* __pikaMain;
|
||||
PikaObj* newRootObj(char* name, NewFun newObjFun) {
|
||||
PikaObj* newObj = newObjFromFun(newObjFun);
|
||||
PikaObj* newObj = obj_newObjDirect(newObjFun);
|
||||
__pikaMain = newObj;
|
||||
return newObj;
|
||||
}
|
||||
@ -378,14 +378,14 @@ Arg* obj_getRefArg(PikaObj* self) {
|
||||
return arg_setPtr(NULL, "", ARG_TYPE_FREE_OBJECT, self);
|
||||
}
|
||||
|
||||
Arg* newFreeObjArg(NewFun newObjFun) {
|
||||
PikaObj* newObj = newObjFromFun(newObjFun);
|
||||
Arg* obj_newObjArg(NewFun newObjFun) {
|
||||
PikaObj* newObj = obj_newObjDirect(newObjFun);
|
||||
Arg* objArg = arg_setPtr(NULL, "", ARG_TYPE_FREE_OBJECT, newObj);
|
||||
return objArg;
|
||||
}
|
||||
|
||||
Arg* obj_newObjInPackage(NewFun newObjFun) {
|
||||
return newFreeObjArg(newObjFun);
|
||||
return obj_newObjArg(newObjFun);
|
||||
}
|
||||
|
||||
static PikaObj* __initObj(PikaObj* obj, char* name) {
|
||||
@ -421,7 +421,7 @@ PikaObj* obj_getObjDirect(PikaObj* self, char* name) {
|
||||
return __initObj(self, name);
|
||||
}
|
||||
/* found Objcet */
|
||||
if (type == ARG_TYPE_OBJECT || type == ARG_TYPE_REF_OBJECT) {
|
||||
if (type == ARG_TYPE_OBJECT || type == ARG_TYPE_OBJECT) {
|
||||
return args_getPtr(self->list, name);
|
||||
}
|
||||
return NULL;
|
||||
@ -869,9 +869,9 @@ 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);
|
||||
return arg_setPtr(self, name, ARG_TYPE_OBJECT, obj);
|
||||
}
|
||||
|
||||
Arg* arg_setWeakRefObj(Arg* self, char* name, PikaObj* obj) {
|
||||
return arg_setPtr(self, name, ARG_TYPE_REF_OBJECT, obj);
|
||||
return arg_setPtr(self, name, ARG_TYPE_OBJECT, obj);
|
||||
}
|
||||
|
@ -223,12 +223,13 @@ void obj_shellLineProcess(PikaObj* self,
|
||||
int pikaCompile(char* output_file_name, char* py_lines);
|
||||
Method obj_getNativeMethod(PikaObj* self, char* method_name);
|
||||
void obj_runNativeMethod(PikaObj* self, char* method_name, Args* args);
|
||||
Arg* newFreeObjArg(NewFun newObjFun);
|
||||
Arg* obj_newObjArg(NewFun newObjFun);
|
||||
Arg* obj_newObjInPackage(NewFun newObjFun);
|
||||
|
||||
void obj_refcntInc(PikaObj* self);
|
||||
void obj_refcntDec(PikaObj* self);
|
||||
int obj_refcntNow(PikaObj* self);
|
||||
PikaObj* obj_newObjDirect(NewFun newObjFun);
|
||||
Arg* arg_setRefObj(Arg* self, char* name, PikaObj* obj);
|
||||
Arg* arg_setWeakRefObj(Arg* self, char* name, PikaObj* obj);
|
||||
|
||||
|
@ -153,7 +153,7 @@ static Arg* VM_instruction_handler_NON(PikaObj* self, VMState* vs, char* data) {
|
||||
static Arg* VM_instruction_handler_NEW(PikaObj* self, VMState* vs, char* data) {
|
||||
Arg* origin_arg = obj_getArg(vs->locals, data);
|
||||
Arg* new_arg = arg_copy(origin_arg);
|
||||
origin_arg = arg_setType(origin_arg, ARG_TYPE_REF_OBJECT);
|
||||
origin_arg = arg_setType(origin_arg, ARG_TYPE_OBJECT);
|
||||
arg_setType(new_arg, ARG_TYPE_FREE_OBJECT);
|
||||
return new_arg;
|
||||
}
|
||||
@ -173,7 +173,7 @@ static Arg* VM_instruction_handler_REF(PikaObj* self, VMState* vs, char* data) {
|
||||
}
|
||||
ArgType arg_type = arg_getType(arg);
|
||||
if (ARG_TYPE_OBJECT == arg_type) {
|
||||
arg = arg_setType(arg, ARG_TYPE_REF_OBJECT);
|
||||
arg = arg_setType(arg, ARG_TYPE_OBJECT);
|
||||
}
|
||||
if (NULL == arg) {
|
||||
VMState_setErrorCode(vs, 1);
|
||||
@ -271,7 +271,7 @@ static void VMState_loadArgsFromMethodArg(VMState* vs,
|
||||
/* load 'self' as the first arg when call object method */
|
||||
if (method_type == ARG_TYPE_OBJECT_METHOD) {
|
||||
Arg* call_arg =
|
||||
arg_setPtr(NULL, "self", ARG_TYPE_REF_OBJECT, method_host_obj);
|
||||
arg_setPtr(NULL, "self", ARG_TYPE_OBJECT, method_host_obj);
|
||||
args_setArg(args, call_arg);
|
||||
}
|
||||
exit:
|
||||
@ -491,7 +491,6 @@ static Arg* VM_instruction_handler_OUT(PikaObj* self, VMState* vs, char* data) {
|
||||
/* set free object to nomal object */
|
||||
if (ARG_TYPE_FREE_OBJECT == outArg_type) {
|
||||
arg_setType(outArg, ARG_TYPE_OBJECT);
|
||||
arg_refCntInc(outArg);
|
||||
}
|
||||
|
||||
/* ouput arg to locals */
|
||||
|
@ -310,7 +310,7 @@ Arg* arg_copy(Arg* argToBeCopy) {
|
||||
return NULL;
|
||||
}
|
||||
ArgType arg_type = arg_getType(argToBeCopy);
|
||||
if (ARG_TYPE_OBJECT == arg_type || ARG_TYPE_REF_OBJECT == arg_type) {
|
||||
if (ARG_TYPE_OBJECT == arg_type || ARG_TYPE_OBJECT == arg_type) {
|
||||
obj_refcntInc(arg_getPtr(argToBeCopy));
|
||||
}
|
||||
Arg* argCopied = New_arg(NULL);
|
||||
@ -354,7 +354,7 @@ void arg_deinit(Arg* self) {
|
||||
arg_deinitHeap(self);
|
||||
/* deinit sub object */
|
||||
ArgType type = arg_getType(self);
|
||||
if (type == ARG_TYPE_OBJECT || type == ARG_TYPE_REF_OBJECT) {
|
||||
if (type == ARG_TYPE_OBJECT || type == ARG_TYPE_OBJECT) {
|
||||
PikaObj* subObj = arg_getPtr(self);
|
||||
obj_refcntDec(subObj);
|
||||
int ref_cnt = obj_refcntNow(subObj);
|
||||
@ -365,15 +365,3 @@ void arg_deinit(Arg* self) {
|
||||
/* free the ref */
|
||||
arg_freeContent(self);
|
||||
}
|
||||
|
||||
void arg_refCntInc(Arg* self) {
|
||||
((__arg*)self)->ref_cnt++;
|
||||
}
|
||||
|
||||
void arg_refCntDec(Arg* self) {
|
||||
((__arg*)self)->ref_cnt--;
|
||||
}
|
||||
|
||||
uint8_t arg_getRefCnt(Arg* self) {
|
||||
return ((__arg*)self)->ref_cnt;
|
||||
}
|
||||
|
@ -40,11 +40,10 @@ typedef enum {
|
||||
ARG_TYPE_INT,
|
||||
ARG_TYPE_FLOAT,
|
||||
ARG_TYPE_STRING,
|
||||
ARG_TYPE_OBJECT,
|
||||
ARG_TYPE_MATE_OBJECT,
|
||||
ARG_TYPE_FREE_OBJECT,
|
||||
ARG_TYPE_OBJECT,
|
||||
ARG_TYPE_POINTER,
|
||||
ARG_TYPE_REF_OBJECT,
|
||||
ARG_TYPE_NATIVE_METHOD,
|
||||
ARG_TYPE_NATIVE_CONSTRUCTOR_METHOD,
|
||||
ARG_TYPE_CONSTRUCTOR_METHOD,
|
||||
@ -139,8 +138,5 @@ void* arg_getHeapStruct(Arg* self);
|
||||
void arg_deinitHeap(Arg* self);
|
||||
Arg* arg_setBytes(Arg* self, char* name, uint8_t* src, size_t size);
|
||||
void arg_printBytes(Arg* self);
|
||||
void arg_refCntInc(Arg* self);
|
||||
void arg_refCntDec(Arg* self);
|
||||
uint8_t arg_getRefCnt(Arg* self);
|
||||
|
||||
#endif
|
||||
|
@ -437,7 +437,7 @@ char* args_print(Args* self, char* name) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (type == ARG_TYPE_REF_OBJECT) {
|
||||
if (type == ARG_TYPE_OBJECT) {
|
||||
void* val = args_getPtr(self, name);
|
||||
res = getPrintStringFromPtr(self, name, val);
|
||||
goto exit;
|
||||
|
Loading…
x
Reference in New Issue
Block a user