This commit is contained in:
blueloveTH 2023-07-15 15:13:58 +08:00
parent e319c715e4
commit 73ae29809b
8 changed files with 301 additions and 34 deletions

View File

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

View File

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

View File

@ -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
src2/pocketpy_c.cpp Normal file
View File

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

View File

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

View File

@ -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
tests/dylib/test.c Normal file
View File

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

View File

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