blueloveTH 2 lat temu
rodzic
commit
73ae29809b
8 zmienionych plików z 301 dodań i 34 usunięć
  1. 1 1
      build.sh
  2. 4 3
      src/pocketpy.cpp
  3. 2 2
      src2/main.cpp
  4. 244 0
      src2/pocketpy_c.cpp
  5. 17 10
      tests/dylib/CMakeLists.txt
  6. 9 1
      tests/dylib/main.py
  7. 24 0
      tests/dylib/test.c
  8. 0 17
      tests/dylib/test.cpp

+ 1 - 1
build.sh

@@ -1,3 +1,3 @@
 python3 prebuild.py
 SRC=$(find src/ -name "*.cpp")
-clang++ -std=c++17 -fno-rtti -O2 -stdlib=libc++ -Wfatal-errors -o main src2/main.cpp $SRC -Iinclude -ldl
+clang++ -std=c++17 -fno-rtti -O2 -stdlib=libc++ -Wfatal-errors -o main src2/main.cpp $SRC -Iinclude -ldl -rdynamic

+ 4 - 3
src/pocketpy.cpp

@@ -2,7 +2,7 @@
 
 namespace pkpy{
 
-using dylib_entry_t = PyObject*(*)(VM*, const char*);
+using dylib_entry_t = const char* (*)(void*, const char*);
 
 #if PK_ENABLE_OS
 
@@ -11,7 +11,7 @@ static dylib_entry_t load_dylib(const char* path){
     std::error_code ec;
     auto p = std::filesystem::absolute(path, ec);
     if(ec) return nullptr;
-    HMODULE handle = LoadLibraryA((LPCSTR)"test.dll");
+    HMODULE handle = LoadLibraryA(p.string().c_str());
     // get last error
     // Get the last error code
     SetErrorMode(SEM_FAILCRITICALERRORS);
@@ -169,7 +169,8 @@ void init_builtins(VM* _vm) {
                 if(!entry){
                     vm->_error("ImportError", "cannot load dynamic library: " + name.escape());
                 }
-                return entry(vm, PK_VERSION);
+                const char* name = entry(vm, PK_VERSION);
+                return vm->_modules[name];
             }
         }
         return vm->py_import(name);

+ 2 - 2
src2/main.cpp

@@ -57,9 +57,9 @@ int main(int argc, char** argv){
 #if _WIN32
     // implicitly load pocketpy.dll in current directory
 #elif __linux__
-    dlopen("libpocketpy.so", RTLD_LAZY);
+    dlopen("libpocketpy.so", RTLD_LAZY | RTLD_GLOBAL);
 #elif __APPLE__
-    dlopen("libpocketpy.dylib", RTLD_LAZY);
+    dlopen("libpocketpy.dylib", RTLD_LAZY | RTLD_GLOBAL);
 #endif
     pkpy_vm* vm = pkpy_new_vm(true);
 

+ 244 - 0
src2/pocketpy_c.cpp

@@ -0,0 +1,244 @@
+/* autogenerated code.  Do not edit */
+
+#include "pocketpy_c.h"
+
+#ifdef _WIN32
+#pragma warning(disable: 4700)
+#endif
+
+pkpy_vm* pkpy_new_vm(bool enable_os) {
+    pkpy_vm* returnValue;
+    return returnValue;
+}
+
+void pkpy_delete_vm(pkpy_vm*) {
+}
+
+bool pkpy_exec(pkpy_vm*, const char* source) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_exec_2(pkpy_vm*, const char* source, const char* filename, int mode, const char* module) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_pop(pkpy_vm*, int) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_pop_top(pkpy_vm*) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_dup_top(pkpy_vm*) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_rot_two(pkpy_vm*) {
+    bool returnValue;
+    return returnValue;
+}
+
+int pkpy_stack_size(pkpy_vm*) {
+    int returnValue;
+    return returnValue;
+}
+
+bool pkpy_push_int(pkpy_vm*, int) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_is_int(pkpy_vm*, int i) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_to_int(pkpy_vm*, int i, int* out) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_push_float(pkpy_vm*, float) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_is_float(pkpy_vm*, int i) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_to_float(pkpy_vm*, int i, float* out) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_push_bool(pkpy_vm*, bool) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_is_bool(pkpy_vm*, int i) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_to_bool(pkpy_vm*, int i, bool* out) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_push_string(pkpy_vm*, pkpy_CString) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_is_string(pkpy_vm*, int i) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_to_string(pkpy_vm*, int i, pkpy_CString* out) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_push_voidp(pkpy_vm*, void*) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_is_voidp(pkpy_vm*, int i) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_to_voidp(pkpy_vm*, int i, void** out) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_push_none(pkpy_vm*) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_is_none(pkpy_vm*, int i) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_push_null(pkpy_vm*) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_push_function(pkpy_vm*, const char*, pkpy_CFunction) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_push_module(pkpy_vm*, const char*) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_getattr(pkpy_vm*, pkpy_CName) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_setattr(pkpy_vm*, pkpy_CName) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_getglobal(pkpy_vm*, pkpy_CName) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_setglobal(pkpy_vm*, pkpy_CName) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_eval(pkpy_vm*, const char* source) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_unpack_sequence(pkpy_vm*, int size) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_get_unbound_method(pkpy_vm*, pkpy_CName) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_py_repr(pkpy_vm*, int i) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_error(pkpy_vm*, const char* name, pkpy_CString) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_check_error(pkpy_vm*) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_clear_error(pkpy_vm*, char** message) {
+    bool returnValue;
+    return returnValue;
+}
+
+bool pkpy_vectorcall(pkpy_vm*, int argc) {
+    bool returnValue;
+    return returnValue;
+}
+
+void pkpy_free(void* p) {
+}
+
+pkpy_CString pkpy_string(const char*) {
+    pkpy_CString returnValue;
+    return returnValue;
+}
+
+pkpy_CName pkpy_name(const char*) {
+    pkpy_CName returnValue;
+    return returnValue;
+}
+
+pkpy_CString pkpy_name_to_string(pkpy_CName) {
+    pkpy_CString returnValue;
+    return returnValue;
+}
+
+void pkpy_compile_to_string(pkpy_vm*, const char* source, const char* filename, int mode, bool* ok, char** out) {
+}
+
+void* pkpy_new_repl(pkpy_vm* vm) {
+    void* returnValue;
+    return returnValue;
+}
+
+bool pkpy_repl_input(void* r, const char* line) {
+    bool returnValue;
+    return returnValue;
+}
+
+void pkpy_delete_repl(void* repl) {
+}

+ 17 - 10
tests/dylib/CMakeLists.txt

@@ -2,19 +2,12 @@ cmake_minimum_required(VERSION 3.17)
 
 project(test)
 
-set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_C_STANDARD 11)
 
 if(MSVC)
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GR- /EHsc /utf-8 /O2")
 else()
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -fexceptions -O2")
-    if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
-        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
-    endif()
-endif()
-
-if (MSVC)
-    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /FORCE:UNRESOLVED")
 endif()
 
 include_directories(
@@ -24,5 +17,19 @@ include_directories(
 add_library(
     ${PROJECT_NAME}
     SHARED
-    test.cpp
-)
+    test.c
+)
+
+
+if (WIN32)
+    add_library(
+        ${PROJECT_NAME}_stub
+        SHARED
+        ${CMAKE_CURRENT_LIST_DIR}/../../src2/pocketpy_c.cpp
+    )
+
+    target_link_libraries(
+        ${PROJECT_NAME}
+        ${PROJECT_NAME}_stub
+    )
+endif()

+ 9 - 1
tests/dylib/main.py

@@ -1,6 +1,14 @@
 import os
+import sys
 
+print('platform:', sys.platform)
 print(os.getcwd())
-test = __import__('build/libtest.so')
+
+if sys.platform == 'linux':
+    test = __import__('build/linux/libtest.so')
+elif sys.platform == 'win32':
+    test = __import__('build/win32/test.dll')
+else:
+    raise Exception('Unsupported platform')
 
 test.hello()

+ 24 - 0
tests/dylib/test.c

@@ -0,0 +1,24 @@
+#include "pocketpy_c.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+static int hello(pkpy_vm* vm){
+    printf("Hello from dylib!\n");
+    return 0;
+}
+
+PK_EXPORT
+const char* platform_module__init__(pkpy_vm* vm, const char* version){
+    printf("version: %s\n", version);
+    pkpy_push_function(vm, "hello()", hello);
+    pkpy_push_module(vm, "test");
+    pkpy_setattr(vm, pkpy_name("hello"));
+    if(pkpy_check_error(vm)){
+        char* err;
+        pkpy_clear_error(vm, &err);
+        printf("%s\n", err);
+        free(err);
+        exit(1);
+    }
+    return "test";
+}

+ 0 - 17
tests/dylib/test.cpp

@@ -1,17 +0,0 @@
-#include "pocketpy.h"
-
-using namespace pkpy;
-
-extern "C" {
-    PK_EXPORT
-    PyObject* platform_module__init__(VM* vm, const char* version){
-        PyObject* mod = vm->new_module("test");
-        vm->_stdout(vm, "Hello from dylib!\n");
-
-        vm->bind(mod, "hello()", [](VM* vm, ArgsView args){
-            vm->_stdout(vm, "Hello from dylib!\n");
-            return vm->None;
-        });
-        return mod;
-    }
-}