mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-19 19:10:17 +00:00
...
This commit is contained in:
parent
e319c715e4
commit
73ae29809b
2
build.sh
2
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
|
@ -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);
|
||||
|
@ -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
244
src2/pocketpy_c.cpp
Normal 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) {
|
||||
}
|
@ -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()
|
@ -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
24
tests/dylib/test.c
Normal 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";
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user