From 7964cc1af6e5a1a3772e7b7d4856c2d44283cf7a Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Mon, 9 Sep 2024 13:20:11 +0800 Subject: [PATCH] support dll load --- .gitignore | 4 +--- build_dll.sh | 6 ++++++ src/interpreter/dll.c | 36 ++++++++++++++++++++++++++++++++++++ src/public/modules.c | 7 ++++--- src2/hello.c | 15 +++++++++++++++ 5 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 build_dll.sh create mode 100644 src/interpreter/dll.c create mode 100644 src2/hello.c diff --git a/.gitignore b/.gitignore index 5e644ff6..efd5fa98 100644 --- a/.gitignore +++ b/.gitignore @@ -26,9 +26,7 @@ APPS build main -pocketpy.dSYM -libpocketpy.dylib.dSYM/ -main.dSYM/ +*.dSYM docs/references.md diff --git a/build_dll.sh b/build_dll.sh new file mode 100644 index 00000000..0c3110b5 --- /dev/null +++ b/build_dll.sh @@ -0,0 +1,6 @@ +set -e + +FLAGS="-std=c11 -Iinclude -O0 -Wfatal-errors -g -DDEBUG -DPK_ENABLE_OS=1" + +clang $FLAGS -shared -fPIC src2/hello.c -o libhello.dylib -undefined dynamic_lookup + diff --git a/src/interpreter/dll.c b/src/interpreter/dll.c new file mode 100644 index 00000000..2a4c7e86 --- /dev/null +++ b/src/interpreter/dll.c @@ -0,0 +1,36 @@ +#include "pocketpy/pocketpy.h" + +#if PK_IS_DESKTOP_PLATFORM + +#ifdef _WIN32 +#include +#else +#include +#endif + +typedef bool (*py_module_initialize_t)() PY_RAISE PY_RETURN; + +int load_module_from_dll_desktop_only(const char* path) PY_RAISE PY_RETURN { + const char* f_init_name = "py_module_initialize"; +#ifdef _WIN32 + HMODULE dll = LoadLibraryA(path); + if(dll == NULL) return 0; + py_module_initialize_t f_init = (py_module_initialize_t)GetProcAddress(dll, init_func); +#else + void* dll = dlopen(path, RTLD_LAZY); + if(dll == NULL) return 0; + py_module_initialize_t f_init = (py_module_initialize_t)dlsym(dll, f_init_name); +#endif + if(f_init == NULL) return 0; + bool success = f_init(); + if(!success) return -1; + return 1; +} + +#else + +int load_module_from_dll_desktop_only(const char* path) PY_RAISE PY_RETURN { + return 0; +} + +#endif \ No newline at end of file diff --git a/src/public/modules.c b/src/public/modules.c index df1a928a..6be8c503 100644 --- a/src/public/modules.c +++ b/src/public/modules.c @@ -63,9 +63,9 @@ py_Ref py_newmodule(const char* path) { return py_getmodule(path); } -int py_import(const char* path_cstr) { - // printf("importing %s\n", path_cstr); +int load_module_from_dll_desktop_only(const char* path) PY_RAISE PY_RETURN; +int py_import(const char* path_cstr) { VM* vm = pk_current_vm; c11_sv path = {path_cstr, strlen(path_cstr)}; if(path.size == 0) return ValueError("empty module name"); @@ -142,7 +142,8 @@ int py_import(const char* path_cstr) { c11_string__delete(filename); c11_string__delete(slashed_path); - return 0; + // not found + return load_module_from_dll_desktop_only(path_cstr); __SUCCESS: do { diff --git a/src2/hello.c b/src2/hello.c new file mode 100644 index 00000000..92520fdb --- /dev/null +++ b/src2/hello.c @@ -0,0 +1,15 @@ +#include "pocketpy.h" + +static bool hello_add(int argc, py_Ref argv){ + PY_CHECK_ARGC(2); + return py_binaryadd(py_arg(0), py_arg(1)); +} + +bool py_module_initialize(){ + py_GlobalRef mod = py_newmodule("hello"); + + py_bindfunc(mod, "add", hello_add); + + py_assign(py_retval(), mod); + return true; +} \ No newline at end of file