combine object and ref object

This commit is contained in:
lyon 2022-04-26 10:43:50 +08:00
parent 16886ec594
commit df0db6a390
19 changed files with 65 additions and 100 deletions

View File

@ -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);

View File

@ -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",

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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);

View File

@ -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 */

View File

@ -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;
}

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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 */

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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);

View File

@ -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 */

View File

@ -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;
}

View File

@ -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

View File

@ -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;