|
|
@@ -224,16 +224,15 @@ void LibObj_deinit(LibObj* self) {
|
|
|
|
|
|
/* add bytecode to lib, not copy the bytecode */
|
|
|
void LibObj_dynamicLink(LibObj* self, char* module_name, uint8_t* bytecode) {
|
|
|
- if (strIsContain(module_name, '.')) {
|
|
|
- /* skip file */
|
|
|
- return;
|
|
|
- }
|
|
|
- if (!obj_isArgExist(self, module_name)) {
|
|
|
- obj_newObj(self, module_name, "", New_TinyObj);
|
|
|
+ Args buffs = {0};
|
|
|
+ char* module_obj_name = strsReplace(&buffs, module_name, ".", "|");
|
|
|
+ if (!obj_isArgExist(self, module_obj_name)) {
|
|
|
+ obj_newObj(self, module_obj_name, "", New_TinyObj);
|
|
|
}
|
|
|
- PikaObj* module_obj = obj_getObj(self, module_name);
|
|
|
+ PikaObj* module_obj = obj_getObj(self, module_obj_name);
|
|
|
obj_setStr(module_obj, "name", module_name);
|
|
|
obj_setPtr(module_obj, "bytecode", bytecode);
|
|
|
+ strsDeinit(&buffs);
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
@@ -248,10 +247,12 @@ int LibObj_staticLink(LibObj* self,
|
|
|
char* module_name,
|
|
|
uint8_t* bytecode,
|
|
|
size_t size) {
|
|
|
- if (!obj_isArgExist(self, module_name)) {
|
|
|
- obj_newObj(self, module_name, "", New_TinyObj);
|
|
|
+ Args buffs = {0};
|
|
|
+ char* module_obj_name = strsReplace(&buffs, module_name, ".", "|");
|
|
|
+ if (!obj_isArgExist(self, module_obj_name)) {
|
|
|
+ obj_newObj(self, module_obj_name, "", New_TinyObj);
|
|
|
}
|
|
|
- PikaObj* module_obj = obj_getObj(self, module_name);
|
|
|
+ PikaObj* module_obj = obj_getObj(self, module_obj_name);
|
|
|
uint16_t name_len = strGetSize(module_name);
|
|
|
|
|
|
/* copy bytecode to buff */
|
|
|
@@ -261,6 +262,7 @@ int LibObj_staticLink(LibObj* self,
|
|
|
|
|
|
/* link to buff */
|
|
|
LibObj_dynamicLink(self, module_name, obj_getBytes(module_obj, "buff"));
|
|
|
+ strsDeinit(&buffs);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
@@ -387,7 +389,7 @@ static int32_t __foreach_handler_libWriteBytecode(Arg* argEach,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-//#define NAME_BUFF_SIZE LIB_INFO_BLOCK_SIZE - sizeof(uint32_t)
|
|
|
+// #define NAME_BUFF_SIZE LIB_INFO_BLOCK_SIZE - sizeof(uint32_t)
|
|
|
static int32_t __foreach_handler_libWriteIndex(Arg* argEach,
|
|
|
PikaLinker* linker) {
|
|
|
Args buffs = {0};
|
|
|
@@ -649,6 +651,33 @@ Arg* _getPack_libraryBytes(char* pack_name) {
|
|
|
return f_arg;
|
|
|
}
|
|
|
|
|
|
+typedef struct {
|
|
|
+ char* module_name;
|
|
|
+ PikaObj* module;
|
|
|
+} Context_LibObj_getModule;
|
|
|
+
|
|
|
+int32_t _handler_LibObj_getModule(Arg* argEach, void* context) {
|
|
|
+ Context_LibObj_getModule* ctx = context;
|
|
|
+ if (NULL != ctx->module) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ if (arg_isObject(argEach)) {
|
|
|
+ PikaObj* module_obj = arg_getPtr(argEach);
|
|
|
+ if (strEqu(obj_getStr(module_obj, "name"), ctx->module_name)) {
|
|
|
+ ctx->module = module_obj;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+PikaObj* LibObj_getModule(LibObj* self, char* module_name) {
|
|
|
+ Context_LibObj_getModule context = {0};
|
|
|
+ context.module_name = module_name;
|
|
|
+ args_foreach(self->list, _handler_LibObj_getModule, &context);
|
|
|
+ return context.module;
|
|
|
+}
|
|
|
+
|
|
|
int LibObj_loadLibrary(LibObj* self, uint8_t* library_bytes) {
|
|
|
int module_num = _getModuleNum(library_bytes);
|
|
|
if (module_num < 0) {
|
|
|
@@ -816,7 +845,8 @@ __exit:
|
|
|
static PIKA_RES __Maker_compileModuleWithInfo(PikaMaker* self,
|
|
|
char* module_name) {
|
|
|
Args buffs = {0};
|
|
|
- char* input_file_name = strsAppend(&buffs, module_name, ".py");
|
|
|
+ char* input_file_name = strsReplace(&buffs, module_name, ".", "/");
|
|
|
+ input_file_name = strsAppend(&buffs, input_file_name, ".py");
|
|
|
char* input_file_path =
|
|
|
strsPathJoin(&buffs, obj_getStr(self, "pwd"), input_file_name);
|
|
|
pika_platform_printf(" compiling %s...\r\n", input_file_name);
|
|
|
@@ -869,10 +899,13 @@ void pikaMaker_setPWD(PikaMaker* self, char* pwd) {
|
|
|
* @return: void
|
|
|
*/
|
|
|
void pikaMaker_setState(PikaMaker* self, char* module_name, char* state) {
|
|
|
- obj_newMetaObj(self, module_name, New_TinyObj);
|
|
|
- PikaObj* module_obj = obj_getObj(self, module_name);
|
|
|
+ Args buffs = {0};
|
|
|
+ char* module_obj_name = strsReplace(&buffs, module_name, ".", "|");
|
|
|
+ obj_newMetaObj(self, module_obj_name, New_TinyObj);
|
|
|
+ PikaObj* module_obj = obj_getObj(self, module_obj_name);
|
|
|
obj_setStr(module_obj, "name", module_name);
|
|
|
obj_setStr(module_obj, "state", state);
|
|
|
+ strsDeinit(&buffs);
|
|
|
}
|
|
|
|
|
|
char* pikaMaker_getState(PikaMaker* self, char* module_name) {
|
|
|
@@ -1031,10 +1064,12 @@ int pikaMaker_getDependencies(PikaMaker* self, char* module_name) {
|
|
|
instructUnit_getInstructIndex(ins_unit) == INH) {
|
|
|
char* imp_module_name =
|
|
|
constPool_getByOffset(const_pool, ins_unit->const_pool_index);
|
|
|
- char* imp_module_path =
|
|
|
- strsPathJoin(&buffs, obj_getStr(self, "pwd"), imp_module_name);
|
|
|
+ char* imp_module_name_fs =
|
|
|
+ strsReplace(&buffs, imp_module_name, ".", "/");
|
|
|
+ char* imp_module_path = strsPathJoin(
|
|
|
+ &buffs, obj_getStr(self, "pwd"), imp_module_name_fs);
|
|
|
/* check if compiled the module */
|
|
|
- if (obj_isArgExist(self, imp_module_name)) {
|
|
|
+ if (args_isArgExist(self->list, imp_module_name)) {
|
|
|
/* module info is exist, do nothing */
|
|
|
} else {
|
|
|
/* module info is not exist */
|
|
|
@@ -1053,7 +1088,8 @@ int pikaMaker_getDependencies(PikaMaker* self, char* module_name) {
|
|
|
pika_platform_printf(
|
|
|
" [warning]: file: '%s.pyi', '%s.py' or '%s.py.o' "
|
|
|
"no found\n",
|
|
|
- imp_module_name, imp_module_name, imp_module_name);
|
|
|
+ imp_module_name_fs, imp_module_name_fs,
|
|
|
+ imp_module_name_fs);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -1173,7 +1209,8 @@ PIKA_RES pikaMaker_compileModuleWithList(PikaMaker* self, char* list_content) {
|
|
|
break;
|
|
|
}
|
|
|
module_name = strsSubStr(&buffs, module_name_start, module_name_end);
|
|
|
- enum PIKA_MODULE_TYPE module_type = _checkModuleType(module_name);
|
|
|
+ char* module_name_fs = strsReplace(&buffs, module_name, ".", "/");
|
|
|
+ enum PIKA_MODULE_TYPE module_type = _checkModuleType(module_name_fs);
|
|
|
if (module_type == PIKA_MODULE_TYPE_PY) {
|
|
|
res = pikaMaker_compileModuleWithDepends(self, module_name);
|
|
|
if (PIKA_RES_OK != res) {
|
|
|
@@ -1184,6 +1221,12 @@ PIKA_RES pikaMaker_compileModuleWithList(PikaMaker* self, char* list_content) {
|
|
|
if (module_type == PIKA_MODULE_TYPE_PYO) {
|
|
|
pikaMaker_linkByteocdeFile(self, module_name);
|
|
|
}
|
|
|
+ if (module_type == PIKA_MODULE_TYPE_UNKNOWN) {
|
|
|
+ pika_platform_printf(
|
|
|
+ " [warning]: file: '%s.pyi', '%s.py' or '%s.py.o' "
|
|
|
+ "no found\n",
|
|
|
+ module_name, module_name, module_name);
|
|
|
+ }
|
|
|
module_name_start = module_name_end + 1;
|
|
|
}
|
|
|
__exit:
|