From e3ae8da7995a2d2c76552917fa5e43d0e6331687 Mon Sep 17 00:00:00 2001 From: Username404 Date: Thu, 19 Jan 2023 12:14:24 +0000 Subject: [PATCH] Yerbacon.hpp: Add a yerbacon_output variable to use in JavaScript Signed-off-by: Username404 --- CMakeLists.txt | 2 +- src/headers/Yerbacon.hpp | 23 +++++++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d3198c..f84e274 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -78,7 +78,7 @@ if (${IS_GNU} OR ${IS_CLANG}) else() set(IS_HOST_NOT_ANDROID 0) endif() - set(CMAKE_EXE_LINKER_FLAGS "--closure 1 -lnodefs.js -sFORCE_FILESYSTEM=1 -sWASM=0 --memory-init-file 0 -sEXPORTED_FUNCTIONS=_main -sEXIT_RUNTIME=0 -sSINGLE_FILE=1 -sSAFE_HEAP=${IS_HOST_NOT_ANDROID} -sABORTING_MALLOC=0 -sJS_MATH=1 -sENVIRONMENT='web,webview,worker,node,shell' -sNODEJS_CATCH_EXIT=0 -sSTRICT=1 -sMINIMAL_RUNTIME=0 -sDISABLE_EXCEPTION_CATCHING=0 -sALLOW_MEMORY_GROWTH=1 -Wno-pthreads-mem-growth -sMEMORY_GROWTH_GEOMETRIC_STEP=0 -sDECLARE_ASM_MODULE_EXPORTS=0 ${CMAKE_EXE_LINKER_FLAGS}") + set(CMAKE_EXE_LINKER_FLAGS "--closure 1 -lnodefs.js -lembind -sFORCE_FILESYSTEM=1 -sWASM=0 --memory-init-file 0 -sEXPORTED_FUNCTIONS=_main -sEXIT_RUNTIME=0 -sSINGLE_FILE=1 -sSAFE_HEAP=${IS_HOST_NOT_ANDROID} -sABORTING_MALLOC=0 -sJS_MATH=1 -sENVIRONMENT='web,webview,worker,node,shell' -sNODEJS_CATCH_EXIT=0 -sSTRICT=1 -sMINIMAL_RUNTIME=0 -sDISABLE_EXCEPTION_CATCHING=0 -sALLOW_MEMORY_GROWTH=1 -Wno-pthreads-mem-growth -sMEMORY_GROWTH_GEOMETRIC_STEP=0 -sDECLARE_ASM_MODULE_EXPORTS=0 ${CMAKE_EXE_LINKER_FLAGS}") if (CMAKE_USE_PTHREADS_INIT) set(CMAKE_CXX_FLAGS "-pthread ${CMAKE_CXX_FLAGS}") # Emscripten requires the -pthread flag set(CMAKE_EXE_LINKER_FLAGS "--closure-args=\"--compilation_level SIMPLE\" -sPROXY_TO_PTHREAD=1 ${CMAKE_EXE_LINKER_FLAGS}") # See https://github.com/emscripten-core/emscripten/issues/16706 diff --git a/src/headers/Yerbacon.hpp b/src/headers/Yerbacon.hpp index fdec0b8..f75638c 100644 --- a/src/headers/Yerbacon.hpp +++ b/src/headers/Yerbacon.hpp @@ -36,11 +36,30 @@ #include static bool is_node; void exit(int status) { + MAIN_THREAD_EM_ASM("yerbacon_output = Module.get_cout();"); if (is_node) emscripten_force_exit(status); else emscripten_exit_with_live_runtime(); std::exit(status); } +#include +static std::ostringstream string_cout; +using std::cout; +#define cout (is_node ? std::cout : string_cout) +#define cerr (is_node ? std::cerr : string_cout) +std::string get_cout() { + static size_t previous_cout_size = 0; + std::string output = string_cout.str(); + const size_t current_size = output.size(); + output = output.substr(previous_cout_size, current_size); + previous_cout_size = current_size; + return output; +} +#include +EMSCRIPTEN_BINDINGS() { + emscripten::function("get_cout", &get_cout); +} #else using std::exit; +using std::cout; #endif namespace Yerbacon { @@ -53,9 +72,9 @@ namespace Yerbacon { } static void fail(const std::initializer_list reason) { std::for_each(reason.begin(), reason.end(), [](const char* current_string){ - std::cout << current_string; + cout << current_string; }); - std::cout << std::endl; + cout << std::endl; exit(EXIT_FAILURE); } inline void fail(const char* reason) { fail({reason}); }