From f98d8683363f4a86097a726a7dd2e9992fa491ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=9A=93?= Date: Sun, 6 Jul 2025 11:48:11 -0400 Subject: [PATCH] Implement `Kernel.save_data` in libretro builds --- binding-sandbox/binding-sandbox.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/binding-sandbox/binding-sandbox.cpp b/binding-sandbox/binding-sandbox.cpp index 0928cd87..6ae40875 100644 --- a/binding-sandbox/binding-sandbox.cpp +++ b/binding-sandbox/binding-sandbox.cpp @@ -199,6 +199,25 @@ static VALUE load_data(int32_t argc, wasm_ptr_t argv, VALUE self) { return sb()->bind()()(argc, argv, self); } +static VALUE save_data(VALUE self, VALUE obj, VALUE filename) { + struct coro : boost::asio::coroutine { + typedef decl_slots slots; + + VALUE operator()(VALUE self, VALUE obj, VALUE filename) { + BOOST_ASIO_CORO_REENTER (this) { + SANDBOX_AWAIT_S(0, rb_string_value_cstr, &filename); + SANDBOX_AWAIT_S(1, rb_file_open, sb()->str(SANDBOX_SLOT(0)), "wb"); + SANDBOX_AWAIT(rb_marshal_dump, obj, SANDBOX_SLOT(1)); + SANDBOX_AWAIT(rb_io_close, SANDBOX_SLOT(1)); + } + + return SANDBOX_NIL; + } + }; + + return sb()->bind()()(self, obj, filename); +} + static VALUE rgss_main(VALUE self) { struct coro : boost::asio::coroutine { static VALUE func(VALUE block) { @@ -599,6 +618,7 @@ void sandbox_binding_init::operator()() { SANDBOX_AWAIT(graphics_binding_init); SANDBOX_AWAIT(rb_define_module_function, sb()->rb_mKernel(), "load_data", (VALUE (*)(ANYARGS))load_data, -1); + SANDBOX_AWAIT(rb_define_module_function, sb()->rb_mKernel(), "save_data", (VALUE (*)(ANYARGS))save_data, 2); if (rgssVer >= 3) { SANDBOX_AWAIT(rb_define_module_function, sb()->rb_mKernel(), "rgss_main", (VALUE (*)(ANYARGS))rgss_main, 0);