From f91c83e4a126d9411368c6c275c5e283b1c905dc Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Wed, 24 May 2023 18:20:17 +0800 Subject: [PATCH] ... --- c_bindings/pocketpy_c.cpp | 18 +++++++++++++----- c_bindings/pocketpy_c.h | 3 +++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/c_bindings/pocketpy_c.cpp b/c_bindings/pocketpy_c.cpp index 05551f9e..c7610296 100644 --- a/c_bindings/pocketpy_c.cpp +++ b/c_bindings/pocketpy_c.cpp @@ -100,10 +100,12 @@ void gc_marker_ex(CVM* vm) { for(PyObject* obj: *vm->c_data) if(obj!=nullptr) OBJ_MARK(obj); } +static OutputHandler stdout_handler = nullptr; +static OutputHandler stderr_handler = nullptr; -static void noop_output_handler(VM* vm, const Str& str) { - (void) vm; - (void) str; +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) { @@ -113,8 +115,14 @@ pkpy_vm* pkpy_vm_create(bool use_stdio, bool enable_os) { vm->_gc_marker_ex = (void (*)(VM*)) gc_marker_ex; if (!use_stdio) { - vm->_stdout = noop_output_handler; - vm->_stderr = noop_output_handler; + vm->_stdout = [](VM* vm, const Str& s){ + std::string str = s.str(); + if (stdout_handler != nullptr) stdout_handler((pkpy_vm*)vm, str.c_str()); + }; + vm->_stderr = [](VM* vm, const Str& s){ + std::string str = s.str(); + if (stderr_handler != nullptr) stderr_handler((pkpy_vm*)vm, str.c_str()); + }; } return (pkpy_vm*) vm; diff --git a/c_bindings/pocketpy_c.h b/c_bindings/pocketpy_c.h index 96b969c6..a799d768 100644 --- a/c_bindings/pocketpy_c.h +++ b/c_bindings/pocketpy_c.h @@ -107,6 +107,9 @@ bool pkpy_check_stack(pkpy_vm*, int free); //returns the number of elements on the stack int pkpy_stack_size(pkpy_vm*); +typedef void (*OutputHandler)(pkpy_vm*, const char*); +void pkpy_set_output_handlers(pkpy_vm*, OutputHandler stdout_handler, OutputHandler stderr_handler); + #ifdef __cplusplus }