This commit is contained in:
blueloveTH 2023-07-09 16:17:08 +08:00
parent 85a9588459
commit cdd6776058
3 changed files with 42 additions and 69 deletions

View File

@ -1,17 +1,5 @@
#ifndef PK_EXPORT #ifndef PK_EXPORT
#ifdef _WIN32
#define PK_EXPORT __declspec(dllexport)
#elif __EMSCRIPTEN__
#include <emscripten.h>
#define PK_EXPORT EMSCRIPTEN_KEEPALIVE
#else
#define PK_EXPORT __attribute__((visibility("default")))
#endif
#endif
#ifdef _WIN32 #ifdef _WIN32
#ifndef WIN32_LEAN_AND_MEAN #ifndef WIN32_LEAN_AND_MEAN
@ -24,12 +12,17 @@
#include <Windows.h> #include <Windows.h>
#define PK_EXPORT __declspec(dllexport)
#elif __EMSCRIPTEN__ #elif __EMSCRIPTEN__
#include <emscripten.h> #include <emscripten.h>
#define PK_EXPORT EMSCRIPTEN_KEEPALIVE
#else
#define PK_EXPORT __attribute__((visibility("default")))
#endif
#elif __unix__ #endif
#ifdef __unix__
#include <dlfcn.h> #include <dlfcn.h>
#endif #endif

View File

@ -108,52 +108,44 @@ PK_EXPORT bool pkpy_check_stack(pkpy_vm*, int free);
//returns the number of elements on the stack //returns the number of elements on the stack
PK_EXPORT int pkpy_stack_size(pkpy_vm*); PK_EXPORT int pkpy_stack_size(pkpy_vm*);
typedef void (*OutputHandler)(pkpy_vm*, const char*);
PK_EXPORT void pkpy_set_output_handlers(pkpy_vm*, OutputHandler stdout_handler, OutputHandler stderr_handler);
PK_EXPORT bool pkpy_getattr(pkpy_vm*, const char* name); PK_EXPORT bool pkpy_getattr(pkpy_vm*, const char* name);
PK_EXPORT bool pkpy_setattr(pkpy_vm*, const char* name); PK_EXPORT bool pkpy_setattr(pkpy_vm*, const char* name);
PK_EXPORT bool pkpy_eval(pkpy_vm*, const char* source); PK_EXPORT bool pkpy_eval(pkpy_vm*, const char* source);
/*********************************************************/
PK_EXPORT
void pkpy_free(void* p);
PK_EXPORT
void pkpy_vm_exec(void* vm, const char* source);
PK_EXPORT
void pkpy_vm_exec_2(void* vm, const char* source, const char* filename, int mode, const char* module);
PK_EXPORT
void pkpy_vm_compile(void* vm, const char* source, const char* filename, int mode, bool* ok, char** res);
PK_EXPORT
void* pkpy_new_repl(void* vm);
PK_EXPORT
bool pkpy_repl_input(void* r, const char* line);
PK_EXPORT
void pkpy_vm_add_module(void* vm, const char* name, const char* source);
PK_EXPORT
void* pkpy_new_vm(bool enable_os=true);
PK_EXPORT
void pkpy_delete_vm(void* vm);
PK_EXPORT
void pkpy_delete_repl(void* repl);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
/*************************GLOBAL NAMESPACE*************************/
extern "C" {
PK_EXPORT
void pkpy_free(void* p);
PK_EXPORT
void pkpy_vm_exec(void* vm, const char* source);
PK_EXPORT
void pkpy_vm_exec_2(void* vm, const char* source, const char* filename, int mode, const char* module);
PK_EXPORT
void pkpy_vm_compile(void* vm, const char* source, const char* filename, int mode, bool* ok, char** res);
PK_EXPORT
void* pkpy_new_repl(void* vm);
PK_EXPORT
bool pkpy_repl_input(void* r, const char* line);
PK_EXPORT
void pkpy_vm_add_module(void* vm, const char* name, const char* source);
PK_EXPORT
void* pkpy_new_vm(bool enable_os=true);
PK_EXPORT
void pkpy_delete_vm(void* vm);
PK_EXPORT
void pkpy_delete_repl(void* repl);
}
#endif #endif

View File

@ -131,27 +131,15 @@ void gc_marker_ex(CVM* vm) {
if(vm->error != nullptr) PK_OBJ_MARK(vm->error); if(vm->error != nullptr) PK_OBJ_MARK(vm->error);
} }
static OutputHandler stdout_handler = nullptr;
static OutputHandler stderr_handler = nullptr;
void pkpy_set_output_handlers(pkpy_vm*, OutputHandler stdout_handler, OutputHandler stderr_handler){
::stdout_handler = stdout_handler;
::stderr_handler = stderr_handler;
}
pkpy_vm* pkpy_vm_create(bool use_stdio, bool enable_os) { pkpy_vm* pkpy_vm_create(bool use_stdio, bool enable_os) {
CVM* vm = new CVM(enable_os); CVM* vm = new CVM(enable_os);
vm->c_data = new LuaStack(); vm->c_data = new LuaStack();
vm->heap._gc_marker_ex = (void (*)(VM*)) gc_marker_ex; vm->heap._gc_marker_ex = (void (*)(VM*)) gc_marker_ex;
if (!use_stdio) { if (!use_stdio) {
vm->_stdout = [](VM* vm, const Str& s){ vm->_stdout = vm->_stderr = [](VM* vm, const Str& s){
std::string str = s.str(); PK_UNUSED(vm);
if (stdout_handler != nullptr) stdout_handler((pkpy_vm*)vm, str.c_str()); PK_UNUSED(s);
};
vm->_stderr = [](VM* vm, const Str& s){
std::string str = s.str();
if (stderr_handler != nullptr) stderr_handler((pkpy_vm*)vm, str.c_str());
}; };
} }