mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
...
This commit is contained in:
parent
e319c715e4
commit
73ae29809b
2
build.sh
2
build.sh
@ -1,3 +1,3 @@
|
|||||||
python3 prebuild.py
|
python3 prebuild.py
|
||||||
SRC=$(find src/ -name "*.cpp")
|
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{
|
namespace pkpy{
|
||||||
|
|
||||||
using dylib_entry_t = PyObject*(*)(VM*, const char*);
|
using dylib_entry_t = const char* (*)(void*, const char*);
|
||||||
|
|
||||||
#if PK_ENABLE_OS
|
#if PK_ENABLE_OS
|
||||||
|
|
||||||
@ -11,7 +11,7 @@ static dylib_entry_t load_dylib(const char* path){
|
|||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
auto p = std::filesystem::absolute(path, ec);
|
auto p = std::filesystem::absolute(path, ec);
|
||||||
if(ec) return nullptr;
|
if(ec) return nullptr;
|
||||||
HMODULE handle = LoadLibraryA((LPCSTR)"test.dll");
|
HMODULE handle = LoadLibraryA(p.string().c_str());
|
||||||
// get last error
|
// get last error
|
||||||
// Get the last error code
|
// Get the last error code
|
||||||
SetErrorMode(SEM_FAILCRITICALERRORS);
|
SetErrorMode(SEM_FAILCRITICALERRORS);
|
||||||
@ -169,7 +169,8 @@ void init_builtins(VM* _vm) {
|
|||||||
if(!entry){
|
if(!entry){
|
||||||
vm->_error("ImportError", "cannot load dynamic library: " + name.escape());
|
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);
|
return vm->py_import(name);
|
||||||
|
@ -57,9 +57,9 @@ int main(int argc, char** argv){
|
|||||||
#if _WIN32
|
#if _WIN32
|
||||||
// implicitly load pocketpy.dll in current directory
|
// implicitly load pocketpy.dll in current directory
|
||||||
#elif __linux__
|
#elif __linux__
|
||||||
dlopen("libpocketpy.so", RTLD_LAZY);
|
dlopen("libpocketpy.so", RTLD_LAZY | RTLD_GLOBAL);
|
||||||
#elif __APPLE__
|
#elif __APPLE__
|
||||||
dlopen("libpocketpy.dylib", RTLD_LAZY);
|
dlopen("libpocketpy.dylib", RTLD_LAZY | RTLD_GLOBAL);
|
||||||
#endif
|
#endif
|
||||||
pkpy_vm* vm = pkpy_new_vm(true);
|
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)
|
project(test)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_C_STANDARD 11)
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GR- /EHsc /utf-8 /O2")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GR- /EHsc /utf-8 /O2")
|
||||||
else()
|
else()
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -fexceptions -O2")
|
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()
|
endif()
|
||||||
|
|
||||||
include_directories(
|
include_directories(
|
||||||
@ -24,5 +17,19 @@ include_directories(
|
|||||||
add_library(
|
add_library(
|
||||||
${PROJECT_NAME}
|
${PROJECT_NAME}
|
||||||
SHARED
|
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 os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
print('platform:', sys.platform)
|
||||||
print(os.getcwd())
|
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()
|
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