#include "PikaObj.h" #include "TinyObj.h" #include "BaseObj.h" #include "dataMemory.h" #include "dataString.h" #include "dataStrs.h" static void *getClassPtr(PikaObj *classObj, char *classPath) { char *ptrPath = classPath; return obj_getPtr(classObj, ptrPath); } int32_t obj_newObjByFun(PikaObj *self, char *objName, char *className, void *newFunPtr) { /* class means subprocess init */ Args *buffs = New_strBuff(); /* class means subprocess init */ char *mataObjName = strsAppend(buffs, "[mate]", objName); obj_setPtr(self, mataObjName, newFunPtr); /* add void process Ptr, no inited */ args_setObjectWithClass(self->attributeList, objName, className, NULL); args_deinit(buffs); return 0; } int32_t sysObj_setObjbyClass(PikaObj *self, char *objName, char *classPath) { /* class means subprocess init */ Args *buffs = New_strBuff(); PikaObj *classLoader = obj_getObj(self, "_clsld", 0); void *newFunPtr = getClassPtr(classLoader, classPath); /* class means subprocess init */ char *mataObjName = strsAppend(buffs, "[mate]", objName); obj_setPtr(self, mataObjName, newFunPtr); /* add void process Ptr, no inited */ args_setObjectWithClass(self->attributeList, objName, classPath, NULL); args_deinit(buffs); return 0; } static int32_t storeClassInfo(PikaObj *self, Args *buffs, char *classPath, void *classPtr) { int32_t res = 0; PikaObj *classHost = obj_getObj(self, classPath, 1); if (NULL == classHost) { res = 1; goto exit; } char *className = strsGetLastToken(buffs, classPath, '.'); char *classStoreName = className; obj_setPtr(classHost, classStoreName, classPtr); res = 0; goto exit; exit: return res; } int32_t obj_import(PikaObj *self, char *className, NewFun classPtr) { PikaObj *classLoader = obj_getObj(self, "_clsld", 0); Args *buffs = New_args(NULL); int32_t res = storeClassInfo(classLoader, buffs, className, classPtr); args_deinit(buffs); return res; } int32_t obj_newObj(PikaObj *self, char *objPath, char *classPath) { PikaObj *classLoader = obj_getObj(self, "_clsld", 0); Args *buffs = New_args(NULL); int res = 0; void *NewObjPtr = getClassPtr(classLoader, classPath); if (NULL == NewObjPtr) { res = 1; goto exit; } PikaObj *objHost = obj_getObj(self, objPath, 1); if (NULL == objHost) { res = 2; goto exit; } char *objName = strsGetLastToken(buffs, objPath, '.'); obj_newObjByFun(objHost, objName, classPath, NewObjPtr); res = 0; goto exit; exit: args_deinit(buffs); return res; } static void print(PikaObj *self, Args *args) { obj_setErrorCode(self, 0); char *res = args_print(args, "val"); if (NULL == res) { obj_setSysOut(self, "[error] print: can not print val"); obj_setErrorCode(self, 1); return; } /* not empty */ obj_setSysOut(self, res); } static void set(PikaObj *self, Args *args) { obj_setErrorCode(self, 0); char *argPath = method_getStr(args, "argPath"); if (obj_isArgExist(self, argPath)) { /* update arg */ char *valStr = args_print(args, "val"); int32_t res = obj_set(self, argPath, valStr); if (1 == res) { obj_setSysOut(self, "[error] set: arg no found."); obj_setErrorCode(self, 1); return; } if (2 == res) { obj_setSysOut(self, "[error] set: type not match."); obj_setErrorCode(self, 1); return; } if (3 == res) { obj_setSysOut(self, "[error] set: object not found."); obj_setErrorCode(self, 1); return; } return; } /* new arg */ Arg *val = args_getArg(args, "val"); Arg *newArg = arg_copy(val); char *argName = strsGetLastToken(args, argPath, '.'); newArg = arg_setName(newArg, argName); int32_t res = obj_setArg(self, argPath, newArg); if (res == 1) { obj_setSysOut(self, "[error] set: object not found."); obj_setErrorCode(self, 1); } arg_deinit(newArg); newArg = NULL; return; } PikaObj *New_BaseObj(Args *args) { PikaObj *self = New_TinyObj(args); obj_setObjWithoutClass(self, "_clsld", New_TinyObj); obj_getObj(self, "_clsld", 0); class_defineMethod(self, "print(val:any)", print); class_defineMethod(self, "set(argPath:str, val:any)", set); return self; }