diff --git a/binding-sandbox/binding-util.h b/binding-sandbox/binding-util.h index 318dace7..f8f4a372 100644 --- a/binding-sandbox/binding-util.h +++ b/binding-sandbox/binding-util.h @@ -28,8 +28,6 @@ #include "exception.h" #include "sandbox.h" -#define GFX_GUARD_EXC(exp) exp - #define SANDBOX_SLOT(slot_index) (::mkxp_sandbox::sb()->ref::type>(::mkxp_sandbox::sb()->stack_pointer() + ::mkxp_sandbox::slot_offset<(slot_index), slots>::value)) #define SANDBOX_AWAIT(coroutine, ...) \ @@ -273,7 +271,7 @@ namespace mkxp_sandbox { struct coro : boost::asio::coroutine { \ VALUE operator()(VALUE self, VALUE value) { \ BOOST_ASIO_CORO_REENTER (this) { \ - SANDBOX_GUARD(get_private_data(self)->set##prop(sb().e, SANDBOX_VALUE_TO_BOOL(value))); \ + SANDBOX_GUARD_L(get_private_data(self)->set##prop(sb().e, SANDBOX_VALUE_TO_BOOL(value))); \ } \ return value; \ } \ @@ -302,7 +300,7 @@ namespace mkxp_sandbox { typedef decl_slots slots; \ BOOST_ASIO_CORO_REENTER (this) { \ SANDBOX_AWAIT_S(0, val2num, value); \ - SANDBOX_GUARD(get_private_data(self)->set##prop(sb().e, SANDBOX_SLOT(0))); \ + SANDBOX_GUARD_L(get_private_data(self)->set##prop(sb().e, SANDBOX_SLOT(0))); \ } \ return value; \ } \ @@ -324,7 +322,7 @@ namespace mkxp_sandbox { struct coro : boost::asio::coroutine { \ VALUE operator()(VALUE self, VALUE value) { \ BOOST_ASIO_CORO_REENTER (this) { \ - SANDBOX_GUARD(get_private_data(self)->set##prop(sb().e, value == SANDBOX_NIL ? nullptr : get_private_data(value))); \ + SANDBOX_GUARD_L(get_private_data(self)->set##prop(sb().e, value == SANDBOX_NIL ? nullptr : get_private_data(value))); \ SANDBOX_AWAIT(rb_iv_set, self, #name, value); \ } \ return value; \ @@ -343,7 +341,7 @@ namespace mkxp_sandbox { struct coro : boost::asio::coroutine { \ VALUE operator()(VALUE self, VALUE value) { \ BOOST_ASIO_CORO_REENTER (this) { \ - SANDBOX_GUARD(get_private_data(self)->set##prop(sb().e, *get_private_data(value))); \ + SANDBOX_GUARD_L(get_private_data(self)->set##prop(sb().e, *get_private_data(value))); \ } \ return value; \ } \ @@ -449,6 +447,8 @@ namespace mkxp_sandbox { } while (0) #define SANDBOX_GUARD(...) SANDBOX_GUARD_F(, __VA_ARGS__) +#define SANDBOX_GUARD_LF(finalizer, ...) do { GFX_LOCK; SANDBOX_GUARD_F(finalizer; GFX_UNLOCK, __VA_ARGS__); GFX_UNLOCK; } while (0) +#define SANDBOX_GUARD_L(...) SANDBOX_GUARD_LF(, __VA_ARGS__) namespace mkxp_sandbox { // We need these helper functions so that the arguments to `SANDBOX_AWAIT`/`SANDBOX_AWAIT_R`/`SANDBOX_AWAIT_S` are evaluated before `sb()->bind` is called instead of after. diff --git a/binding-sandbox/bitmap-binding.cpp b/binding-sandbox/bitmap-binding.cpp index 343ea13c..75a2e654 100644 --- a/binding-sandbox/bitmap-binding.cpp +++ b/binding-sandbox/bitmap-binding.cpp @@ -69,9 +69,9 @@ static VALUE initialize(int32_t argc, wasm_ptr_t argv, VALUE self) { } if (argc == 1) { - SANDBOX_GUARD(set_private_data(self, new Bitmap(sb().e, sb()->str(SANDBOX_SLOT(0))))); + SANDBOX_GUARD_L(set_private_data(self, new Bitmap(sb().e, sb()->str(SANDBOX_SLOT(0))))); } else { - SANDBOX_GUARD(set_private_data(self, new Bitmap(sb().e, SANDBOX_SLOT(1), SANDBOX_SLOT(2)))); + SANDBOX_GUARD_L(set_private_data(self, new Bitmap(sb().e, SANDBOX_SLOT(1), SANDBOX_SLOT(2)))); } SANDBOX_AWAIT(bitmap_init_props, self); @@ -94,11 +94,7 @@ static VALUE initialize_copy(VALUE self, VALUE value) { SANDBOX_AWAIT(rb_obj_init_copy, self, value); - { - Bitmap *bitmap; - SANDBOX_GUARD_F(delete bitmap, bitmap = new Bitmap(sb().e, *get_private_data(value))); - set_private_data(self, bitmap); - } + SANDBOX_GUARD_L(set_private_data(self, new Bitmap(sb().e, *get_private_data(value)))); SANDBOX_AWAIT(bitmap_init_props, self); Font *font; @@ -181,9 +177,9 @@ static VALUE blt(int32_t argc, wasm_ptr_t argv, VALUE self) { if (get_private_data(SANDBOX_SLOT(0)) != nullptr) { if (argc > 4) { - SANDBOX_GUARD(get_private_data(self)->blt(sb().e, SANDBOX_SLOT(2), SANDBOX_SLOT(3), *get_private_data(SANDBOX_SLOT(0)), get_private_data(SANDBOX_SLOT(1))->toIntRect(), SANDBOX_SLOT(4))); + SANDBOX_GUARD_L(get_private_data(self)->blt(sb().e, SANDBOX_SLOT(2), SANDBOX_SLOT(3), *get_private_data(SANDBOX_SLOT(0)), get_private_data(SANDBOX_SLOT(1))->toIntRect(), SANDBOX_SLOT(4))); } else { - SANDBOX_GUARD(get_private_data(self)->blt(sb().e, SANDBOX_SLOT(2), SANDBOX_SLOT(3), *get_private_data(SANDBOX_SLOT(0)), get_private_data(SANDBOX_SLOT(1))->toIntRect())); + SANDBOX_GUARD_L(get_private_data(self)->blt(sb().e, SANDBOX_SLOT(2), SANDBOX_SLOT(3), *get_private_data(SANDBOX_SLOT(0)), get_private_data(SANDBOX_SLOT(1))->toIntRect())); } } } @@ -210,9 +206,9 @@ static VALUE stretch_blt(int32_t argc, wasm_ptr_t argv, VALUE self) { if (get_private_data(SANDBOX_SLOT(1)) != nullptr) { if (argc > 4) { - SANDBOX_GUARD(get_private_data(self)->stretchBlt(sb().e, get_private_data(SANDBOX_SLOT(0))->toIntRect(), *get_private_data(SANDBOX_SLOT(1)), get_private_data(SANDBOX_SLOT(2))->toIntRect(), SANDBOX_SLOT(3));); + SANDBOX_GUARD_L(get_private_data(self)->stretchBlt(sb().e, get_private_data(SANDBOX_SLOT(0))->toIntRect(), *get_private_data(SANDBOX_SLOT(1)), get_private_data(SANDBOX_SLOT(2))->toIntRect(), SANDBOX_SLOT(3));); } else { - SANDBOX_GUARD(get_private_data(self)->stretchBlt(sb().e, get_private_data(SANDBOX_SLOT(0))->toIntRect(), *get_private_data(SANDBOX_SLOT(1)), get_private_data(SANDBOX_SLOT(2))->toIntRect());); + SANDBOX_GUARD_L(get_private_data(self)->stretchBlt(sb().e, get_private_data(SANDBOX_SLOT(0))->toIntRect(), *get_private_data(SANDBOX_SLOT(1)), get_private_data(SANDBOX_SLOT(2))->toIntRect());); } } } @@ -231,13 +227,13 @@ static VALUE fill_rect(int32_t argc, wasm_ptr_t argv, VALUE self) { VALUE operator()(int32_t argc, wasm_ptr_t argv, VALUE self) { BOOST_ASIO_CORO_REENTER (this) { if (argc == 2) { - SANDBOX_GUARD(get_private_data(self)->fillRect(sb().e, get_private_data(sb()->ref(argv, 0))->toIntRect(), get_private_data(sb()->ref(argv, 1))->norm)); + SANDBOX_GUARD_L(get_private_data(self)->fillRect(sb().e, get_private_data(sb()->ref(argv, 0))->toIntRect(), get_private_data(sb()->ref(argv, 1))->norm)); } else { SANDBOX_AWAIT_S(0, rb_num2int, sb()->ref(argv, 0)); SANDBOX_AWAIT_S(1, rb_num2int, sb()->ref(argv, 1)); SANDBOX_AWAIT_S(2, rb_num2int, sb()->ref(argv, 2)); SANDBOX_AWAIT_S(3, rb_num2int, sb()->ref(argv, 3)); - SANDBOX_GUARD(get_private_data(self)->fillRect(sb().e, SANDBOX_SLOT(0), SANDBOX_SLOT(1), SANDBOX_SLOT(2), SANDBOX_SLOT(3), get_private_data(sb()->ref(argv, 4))->norm)); + SANDBOX_GUARD_L(get_private_data(self)->fillRect(sb().e, SANDBOX_SLOT(0), SANDBOX_SLOT(1), SANDBOX_SLOT(2), SANDBOX_SLOT(3), get_private_data(sb()->ref(argv, 4))->norm)); } } @@ -252,7 +248,7 @@ static VALUE clear(VALUE self) { struct coro : boost::asio::coroutine { VALUE operator()(VALUE self) { BOOST_ASIO_CORO_REENTER (this) { - SANDBOX_GUARD(get_private_data(self)->clear(sb().e)); + SANDBOX_GUARD_L(get_private_data(self)->clear(sb().e)); } return SANDBOX_NIL; @@ -277,7 +273,7 @@ static VALUE get_pixel(VALUE self, VALUE x, VALUE y) { if (get_private_data(self)->surface() != nullptr || get_private_data(self)->megaSurface() != nullptr) { SANDBOX_GUARD(sb().bitmap_pixel_buffer = get_private_data(self)->getPixel(sb().e, SANDBOX_SLOT(1), SANDBOX_SLOT(2))); } else { - SANDBOX_GUARD(sb().bitmap_pixel_buffer = get_private_data(self)->getPixel(sb().e, SANDBOX_SLOT(1), SANDBOX_SLOT(2))); + SANDBOX_GUARD_L(sb().bitmap_pixel_buffer = get_private_data(self)->getPixel(sb().e, SANDBOX_SLOT(1), SANDBOX_SLOT(2))); } Color *color = new Color(sb().bitmap_pixel_buffer); set_private_data(SANDBOX_SLOT(0), color); @@ -301,7 +297,7 @@ static VALUE set_pixel(VALUE self, VALUE x, VALUE y, VALUE colorObj) { SANDBOX_AWAIT_S(0, rb_num2int, x); SANDBOX_AWAIT_S(1, rb_num2int, y); - SANDBOX_GUARD(get_private_data(self)->setPixel(sb().e, SANDBOX_SLOT(0), SANDBOX_SLOT(1), *get_private_data(colorObj))); + SANDBOX_GUARD_L(get_private_data(self)->setPixel(sb().e, SANDBOX_SLOT(0), SANDBOX_SLOT(1), *get_private_data(colorObj))); } return self; @@ -319,7 +315,7 @@ static VALUE hue_change(VALUE self, VALUE hueval) { BOOST_ASIO_CORO_REENTER (this) { SANDBOX_AWAIT_S(0, rb_num2int, hueval); - SANDBOX_GUARD(get_private_data(self)->hueChange(sb().e, SANDBOX_SLOT(0))); + SANDBOX_GUARD_L(get_private_data(self)->hueChange(sb().e, SANDBOX_SLOT(0))); } return self; @@ -343,10 +339,10 @@ static VALUE draw_text(int32_t argc, wasm_ptr_t argv, VALUE self) { SANDBOX_AWAIT_S(0, rb_string_value_cstr, &sb()->ref(argv, 1)); } if (argc == 2) { - SANDBOX_GUARD(get_private_data(self)->drawText(sb().e, get_private_data(sb()->ref(argv, 0))->toIntRect(), sb()->str(SANDBOX_SLOT(0)));); + SANDBOX_GUARD_L(get_private_data(self)->drawText(sb().e, get_private_data(sb()->ref(argv, 0))->toIntRect(), sb()->str(SANDBOX_SLOT(0)));); } else { SANDBOX_AWAIT_S(2, rb_num2int, sb()->ref(argv, 2)); - SANDBOX_GUARD(get_private_data(self)->drawText(sb().e, get_private_data(sb()->ref(argv, 0))->toIntRect(), sb()->str(SANDBOX_SLOT(0)), SANDBOX_SLOT(2));); + SANDBOX_GUARD_L(get_private_data(self)->drawText(sb().e, get_private_data(sb()->ref(argv, 0))->toIntRect(), sb()->str(SANDBOX_SLOT(0)), SANDBOX_SLOT(2));); } } else { SANDBOX_AWAIT_S(3, rb_num2int, sb()->ref(argv, 0)); @@ -360,10 +356,10 @@ static VALUE draw_text(int32_t argc, wasm_ptr_t argv, VALUE self) { SANDBOX_AWAIT_S(0, rb_string_value_cstr, &sb()->ref(argv, 4)); } if (argc < 6) { - SANDBOX_GUARD(get_private_data(self)->drawText(sb().e, SANDBOX_SLOT(3), SANDBOX_SLOT(4), SANDBOX_SLOT(5), SANDBOX_SLOT(6), sb()->str(SANDBOX_SLOT(0)));); + SANDBOX_GUARD_L(get_private_data(self)->drawText(sb().e, SANDBOX_SLOT(3), SANDBOX_SLOT(4), SANDBOX_SLOT(5), SANDBOX_SLOT(6), sb()->str(SANDBOX_SLOT(0)));); } else { SANDBOX_AWAIT_S(2, rb_num2int, sb()->ref(argv, 5)); - SANDBOX_GUARD(get_private_data(self)->drawText(sb().e, SANDBOX_SLOT(3), SANDBOX_SLOT(4), SANDBOX_SLOT(5), SANDBOX_SLOT(6), sb()->str(SANDBOX_SLOT(0)), SANDBOX_SLOT(2));); + SANDBOX_GUARD_L(get_private_data(self)->drawText(sb().e, SANDBOX_SLOT(3), SANDBOX_SLOT(4), SANDBOX_SLOT(5), SANDBOX_SLOT(6), sb()->str(SANDBOX_SLOT(0)), SANDBOX_SLOT(2));); } } } @@ -410,7 +406,7 @@ static VALUE get_raw_data(VALUE self) { SANDBOX_AWAIT_S(1, rb_str_new_cstr, ""); SANDBOX_AWAIT(rb_str_resize, SANDBOX_SLOT(1), SANDBOX_SLOT(2)); SANDBOX_AWAIT_S(0, rb_string_value_ptr, &SANDBOX_SLOT(1)); - SANDBOX_GUARD(bitmap->getRaw(sb().e, sb()->ptr(SANDBOX_SLOT(0)), SANDBOX_SLOT(2))); + SANDBOX_GUARD_L(bitmap->getRaw(sb().e, sb()->ptr(SANDBOX_SLOT(0)), SANDBOX_SLOT(2))); } return SANDBOX_SLOT(1); @@ -428,7 +424,7 @@ static VALUE set_raw_data(VALUE self, VALUE value) { BOOST_ASIO_CORO_REENTER (this) { SANDBOX_AWAIT_S(0, rb_string_value_ptr, &value); SANDBOX_AWAIT_S(1, get_bytesize, value); - SANDBOX_GUARD(get_private_data(self)->replaceRaw(sb().e, sb()->ptr(SANDBOX_SLOT(0)), SANDBOX_SLOT(1))); + SANDBOX_GUARD_L(get_private_data(self)->replaceRaw(sb().e, sb()->ptr(SANDBOX_SLOT(0)), SANDBOX_SLOT(1))); } return self; @@ -445,7 +441,7 @@ static VALUE to_file(VALUE self, VALUE value) { VALUE operator()(VALUE self, VALUE value) { BOOST_ASIO_CORO_REENTER (this) { SANDBOX_AWAIT_S(0, rb_string_value_cstr, &value); - SANDBOX_GUARD(get_private_data(self)->saveToFile(sb().e, sb()->str(SANDBOX_SLOT(0)))); + SANDBOX_GUARD_L(get_private_data(self)->saveToFile(sb().e, sb()->str(SANDBOX_SLOT(0)))); } return SANDBOX_NIL; @@ -470,7 +466,7 @@ static VALUE snap_to_bitmap(int32_t argc, wasm_ptr_t argv, VALUE self) { SANDBOX_AWAIT_S(0, rb_obj_alloc, bitmap_class); - SANDBOX_GUARD(set_private_data(SANDBOX_SLOT(0), new Bitmap(sb().e, *get_private_data(self), SANDBOX_SLOT(1)))); + SANDBOX_GUARD_L(set_private_data(SANDBOX_SLOT(0), new Bitmap(sb().e, *get_private_data(self), SANDBOX_SLOT(1)))); SANDBOX_AWAIT(bitmap_init_props, SANDBOX_SLOT(0)); } @@ -494,7 +490,7 @@ static VALUE gradient_fill_rect(int32_t argc, wasm_ptr_t argv, VALUE self) { } else { SANDBOX_SLOT(4) = false; } - SANDBOX_GUARD(get_private_data(self)->gradientFillRect(sb().e, get_private_data(sb()->ref(argv, 0))->toIntRect(), get_private_data(sb()->ref(argv, 1))->norm, get_private_data(sb()->ref(argv, 2))->norm, SANDBOX_SLOT(4))); + SANDBOX_GUARD_L(get_private_data(self)->gradientFillRect(sb().e, get_private_data(sb()->ref(argv, 0))->toIntRect(), get_private_data(sb()->ref(argv, 1))->norm, get_private_data(sb()->ref(argv, 2))->norm, SANDBOX_SLOT(4))); } else { SANDBOX_AWAIT_S(0, rb_num2int, sb()->ref(argv, 0)); SANDBOX_AWAIT_S(1, rb_num2int, sb()->ref(argv, 1)); @@ -505,7 +501,7 @@ static VALUE gradient_fill_rect(int32_t argc, wasm_ptr_t argv, VALUE self) { } else { SANDBOX_SLOT(4) = false; } - SANDBOX_GUARD(get_private_data(self)->gradientFillRect(sb().e, SANDBOX_SLOT(0), SANDBOX_SLOT(1), SANDBOX_SLOT(2), SANDBOX_SLOT(3), get_private_data(sb()->ref(argv, 4))->norm, get_private_data(sb()->ref(argv, 5))->norm, SANDBOX_SLOT(4))); + SANDBOX_GUARD_L(get_private_data(self)->gradientFillRect(sb().e, SANDBOX_SLOT(0), SANDBOX_SLOT(1), SANDBOX_SLOT(2), SANDBOX_SLOT(3), get_private_data(sb()->ref(argv, 4))->norm, get_private_data(sb()->ref(argv, 5))->norm, SANDBOX_SLOT(4))); } } @@ -523,13 +519,13 @@ static VALUE clear_rect(int32_t argc, wasm_ptr_t argv, VALUE self) { VALUE operator()(int32_t argc, wasm_ptr_t argv, VALUE self) { BOOST_ASIO_CORO_REENTER (this) { if (argc == 1) { - SANDBOX_GUARD(get_private_data(self)->clearRect(sb().e, get_private_data(sb()->ref(argv, 0))->toIntRect())); + SANDBOX_GUARD_L(get_private_data(self)->clearRect(sb().e, get_private_data(sb()->ref(argv, 0))->toIntRect())); } else { SANDBOX_AWAIT_S(0, rb_num2int, sb()->ref(argv, 0)); SANDBOX_AWAIT_S(1, rb_num2int, sb()->ref(argv, 1)); SANDBOX_AWAIT_S(2, rb_num2int, sb()->ref(argv, 2)); SANDBOX_AWAIT_S(3, rb_num2int, sb()->ref(argv, 3)); - SANDBOX_GUARD(get_private_data(self)->clearRect(sb().e, SANDBOX_SLOT(0), SANDBOX_SLOT(1), SANDBOX_SLOT(2), SANDBOX_SLOT(3))); + SANDBOX_GUARD_L(get_private_data(self)->clearRect(sb().e, SANDBOX_SLOT(0), SANDBOX_SLOT(1), SANDBOX_SLOT(2), SANDBOX_SLOT(3))); } } @@ -544,7 +540,7 @@ static VALUE blur(VALUE self) { struct coro : boost::asio::coroutine { VALUE operator()(VALUE self) { BOOST_ASIO_CORO_REENTER (this) { - SANDBOX_GUARD(get_private_data(self)->blur(sb().e)); + SANDBOX_GUARD_L(get_private_data(self)->blur(sb().e)); } return SANDBOX_NIL; @@ -562,7 +558,7 @@ static VALUE radial_blur(VALUE self, VALUE angle, VALUE divisions) { BOOST_ASIO_CORO_REENTER (this) { SANDBOX_AWAIT_S(0, rb_num2int, angle); SANDBOX_AWAIT_S(1, rb_num2int, divisions); - SANDBOX_GUARD(get_private_data(self)->radialBlur(sb().e, SANDBOX_SLOT(0), SANDBOX_SLOT(1))); + SANDBOX_GUARD_L(get_private_data(self)->radialBlur(sb().e, SANDBOX_SLOT(0), SANDBOX_SLOT(1))); } return SANDBOX_NIL; @@ -577,7 +573,7 @@ static VALUE mega(VALUE self) { VALUE operator()(VALUE self) { typedef decl_slots slots; BOOST_ASIO_CORO_REENTER (this) { - SANDBOX_GUARD(SANDBOX_SLOT(0) = get_private_data(self)->getIsMega(sb().e)); + SANDBOX_GUARD_L(SANDBOX_SLOT(0) = get_private_data(self)->getIsMega(sb().e)); } return SANDBOX_BOOL_TO_VALUE(SANDBOX_SLOT(0)); } @@ -595,7 +591,7 @@ static VALUE get_animated(VALUE self) { VALUE operator()(VALUE self) { typedef decl_slots slots; BOOST_ASIO_CORO_REENTER (this) { - SANDBOX_GUARD(SANDBOX_SLOT(0) = get_private_data(self)->getIsAnimated(sb().e)); + SANDBOX_GUARD_L(SANDBOX_SLOT(0) = get_private_data(self)->getIsAnimated(sb().e)); } return SANDBOX_BOOL_TO_VALUE(SANDBOX_SLOT(0)); } @@ -610,7 +606,7 @@ static VALUE play(VALUE self) { struct coro : boost::asio::coroutine { VALUE operator()(VALUE self) { BOOST_ASIO_CORO_REENTER (this) { - SANDBOX_GUARD(get_private_data(self)->play(sb().e)); + SANDBOX_GUARD_L(get_private_data(self)->play(sb().e)); } return SANDBOX_NIL; @@ -624,7 +620,7 @@ static VALUE stop(VALUE self) { struct coro : boost::asio::coroutine { VALUE operator()(VALUE self) { BOOST_ASIO_CORO_REENTER (this) { - SANDBOX_GUARD(get_private_data(self)->stop(sb().e)); + SANDBOX_GUARD_L(get_private_data(self)->stop(sb().e)); } return SANDBOX_NIL; @@ -641,7 +637,7 @@ static VALUE goto_and_play(VALUE self, VALUE value) { VALUE operator()(VALUE self, VALUE value) { BOOST_ASIO_CORO_REENTER (this) { SANDBOX_AWAIT_S(0, rb_num2int, value); - SANDBOX_GUARD(get_private_data(self)->gotoAndPlay(sb().e, SANDBOX_SLOT(0))); + SANDBOX_GUARD_L(get_private_data(self)->gotoAndPlay(sb().e, SANDBOX_SLOT(0))); } return SANDBOX_NIL; @@ -658,7 +654,7 @@ static VALUE goto_and_stop(VALUE self, VALUE value) { VALUE operator()(VALUE self, VALUE value) { BOOST_ASIO_CORO_REENTER (this) { SANDBOX_AWAIT_S(0, rb_num2int, value); - SANDBOX_GUARD(get_private_data(self)->gotoAndStop(sb().e, SANDBOX_SLOT(0))); + SANDBOX_GUARD_L(get_private_data(self)->gotoAndStop(sb().e, SANDBOX_SLOT(0))); } return SANDBOX_NIL; @@ -712,7 +708,7 @@ static VALUE add_frame(int32_t argc, wasm_ptr_t argv, VALUE self) { } } if (argc >= 1) { - SANDBOX_GUARD(SANDBOX_SLOT(1) = get_private_data(self)->addFrame(sb().e, *get_private_data(sb()->ref(argv, 0)), SANDBOX_SLOT(1))); + SANDBOX_GUARD_L(SANDBOX_SLOT(1) = get_private_data(self)->addFrame(sb().e, *get_private_data(sb()->ref(argv, 0)), SANDBOX_SLOT(1))); } SANDBOX_AWAIT_S(0, rb_ll2inum, SANDBOX_SLOT(1)); } @@ -738,7 +734,7 @@ static VALUE remove_frame(int32_t argc, wasm_ptr_t argv, VALUE self) { SANDBOX_SLOT(0) = 0; } } - SANDBOX_GUARD(get_private_data(self)->removeFrame(sb().e, SANDBOX_SLOT(0))); + SANDBOX_GUARD_L(get_private_data(self)->removeFrame(sb().e, SANDBOX_SLOT(0))); } return SANDBOX_NIL; @@ -753,7 +749,7 @@ static VALUE next_frame(VALUE self) { VALUE operator()(VALUE self) { typedef decl_slots slots; BOOST_ASIO_CORO_REENTER (this) { - SANDBOX_GUARD(get_private_data(self)->nextFrame(sb().e)); + SANDBOX_GUARD_L(get_private_data(self)->nextFrame(sb().e)); SANDBOX_GUARD(SANDBOX_AWAIT_S(0, rb_ll2inum, get_private_data(self)->currentFrameI(sb().e))); } return SANDBOX_SLOT(0); @@ -768,7 +764,7 @@ static VALUE previous_frame(VALUE self) { VALUE operator()(VALUE self) { typedef decl_slots slots; BOOST_ASIO_CORO_REENTER (this) { - SANDBOX_GUARD(get_private_data(self)->previousFrame(sb().e)); + SANDBOX_GUARD_L(get_private_data(self)->previousFrame(sb().e)); SANDBOX_GUARD(SANDBOX_AWAIT_S(0, rb_ll2inum, get_private_data(self)->currentFrameI(sb().e))); } return SANDBOX_SLOT(0); @@ -792,7 +788,7 @@ static VALUE set_font(VALUE self, VALUE value) { VALUE operator()(VALUE self, VALUE value) { BOOST_ASIO_CORO_REENTER (this) { if (get_private_data(value) != nullptr) { - SANDBOX_GUARD(get_private_data(self)->setFont(sb().e, *get_private_data(value))); + SANDBOX_GUARD_L(get_private_data(self)->setFont(sb().e, *get_private_data(value))); SANDBOX_AWAIT_S(0, rb_iv_get, self, "font"); SANDBOX_AWAIT_S(1, rb_iv_get, value, "name"); diff --git a/binding-sandbox/graphics-binding.cpp b/binding-sandbox/graphics-binding.cpp index 1336a73d..ce7ba911 100644 --- a/binding-sandbox/graphics-binding.cpp +++ b/binding-sandbox/graphics-binding.cpp @@ -53,7 +53,7 @@ static VALUE update(VALUE self) { VALUE operator()(VALUE self) { BOOST_ASIO_CORO_REENTER (this) { - SANDBOX_GUARD(SANDBOX_SLOT(0) = shState->graphics().update(sb().e)); + SANDBOX_GUARD_L(SANDBOX_SLOT(0) = shState->graphics().update(sb().e)); if (SANDBOX_SLOT(0)) { SANDBOX_YIELD; } @@ -70,7 +70,7 @@ static VALUE freeze(VALUE self) { struct coro : boost::asio::coroutine { VALUE operator()(VALUE self) { BOOST_ASIO_CORO_REENTER (this) { - SANDBOX_GUARD(shState->graphics().freeze(sb().e)); + SANDBOX_GUARD_L(shState->graphics().freeze(sb().e)); } return SANDBOX_NIL; @@ -91,6 +91,8 @@ static VALUE transition(int32_t argc, wasm_ptr_t argv, VALUE self) { SANDBOX_SLOT(1) = 8; SANDBOX_SLOT(2) = 40; + GFX_LOCK; + if (!shState->graphics().frozen()) { return SANDBOX_NIL; } @@ -122,6 +124,7 @@ static VALUE transition(int32_t argc, wasm_ptr_t argv, VALUE self) { } ~coro() { + GFX_UNLOCK; sb().transitioning = false; if (sb().trans_map != nullptr) { delete sb().trans_map; @@ -147,7 +150,7 @@ static VALUE screenshot(VALUE self, VALUE value) { VALUE operator()(VALUE self, VALUE value) { BOOST_ASIO_CORO_REENTER (this) { SANDBOX_AWAIT_S(0, rb_string_value_cstr, &value); - SANDBOX_GUARD(shState->graphics().screenshot(sb().e, sb()->str(SANDBOX_SLOT(0)))); + SANDBOX_GUARD_L(shState->graphics().screenshot(sb().e, sb()->str(SANDBOX_SLOT(0)))); } return SANDBOX_NIL; @@ -161,7 +164,7 @@ static VALUE reset(VALUE self) { struct coro : boost::asio::coroutine { VALUE operator()(VALUE self) { BOOST_ASIO_CORO_REENTER (this) { - SANDBOX_GUARD(shState->graphics().reset(sb().e)); + SANDBOX_GUARD_L(shState->graphics().reset(sb().e)); } return SANDBOX_NIL; @@ -200,6 +203,8 @@ static VALUE wait_(VALUE self, VALUE value) { VALUE operator()(VALUE self, VALUE value) { BOOST_ASIO_CORO_REENTER (this) { + GFX_LOCK; + SANDBOX_AWAIT_S(0, rb_num2int, value); for (SANDBOX_SLOT(1) = 0; SANDBOX_SLOT(1) < SANDBOX_SLOT(0); ++SANDBOX_SLOT(1)) { @@ -210,6 +215,10 @@ static VALUE wait_(VALUE self, VALUE value) { return SANDBOX_NIL; } + + ~coro() { + GFX_UNLOCK; + } }; return sb()->bind()()(self, value); @@ -221,6 +230,8 @@ static VALUE fadeout(VALUE self, VALUE value) { VALUE operator()(VALUE self, VALUE value) { BOOST_ASIO_CORO_REENTER (this) { + GFX_LOCK; + SANDBOX_AWAIT_S(0, rb_num2int, value); SANDBOX_SLOT(2) = shState->graphics().getBrightness(); @@ -232,6 +243,10 @@ static VALUE fadeout(VALUE self, VALUE value) { return SANDBOX_NIL; } + + ~coro() { + GFX_UNLOCK; + } }; return sb()->bind()()(self, value); @@ -243,6 +258,8 @@ static VALUE fadein(VALUE self, VALUE value) { VALUE operator()(VALUE self, VALUE value) { BOOST_ASIO_CORO_REENTER (this) { + GFX_LOCK; + SANDBOX_AWAIT_S(0, rb_num2int, value); SANDBOX_SLOT(2) = shState->graphics().getBrightness(); @@ -254,6 +271,10 @@ static VALUE fadein(VALUE self, VALUE value) { return SANDBOX_NIL; } + + ~coro() { + GFX_UNLOCK; + } }; return sb()->bind()()(self, value); @@ -266,7 +287,7 @@ static VALUE snap_to_bitmap(VALUE self) { VALUE operator()(VALUE self) { BOOST_ASIO_CORO_REENTER (this) { SANDBOX_AWAIT_S(0, rb_obj_alloc, bitmap_class); - SANDBOX_GUARD(set_private_data(SANDBOX_SLOT(0), shState->graphics().snapToBitmap(sb().e))); + SANDBOX_GUARD_L(set_private_data(SANDBOX_SLOT(0), shState->graphics().snapToBitmap(sb().e))); SANDBOX_AWAIT(bitmap_init_props, SANDBOX_SLOT(0)); } @@ -335,6 +356,8 @@ static VALUE play_movie(int32_t argc, wasm_ptr_t argv, VALUE self) { VALUE operator()(int32_t argc, wasm_ptr_t argv, VALUE self) { BOOST_ASIO_CORO_REENTER (this) { + GFX_LOCK; + // TODO: require at least 1 argument SANDBOX_AWAIT_S(0, rb_string_value_cstr, &sb()->ref(argv, 0)); if (argc >= 2) { @@ -355,7 +378,8 @@ static VALUE play_movie(int32_t argc, wasm_ptr_t argv, VALUE self) { } ~coro() { - GFX_GUARD_EXC(sb().set_movie(nullptr);); + sb().set_movie(nullptr); + GFX_UNLOCK; } }; diff --git a/binding-sandbox/plane-binding.cpp b/binding-sandbox/plane-binding.cpp index d50526f4..01d620d9 100644 --- a/binding-sandbox/plane-binding.cpp +++ b/binding-sandbox/plane-binding.cpp @@ -38,14 +38,18 @@ static VALUE initialize(int32_t argc, wasm_ptr_t argv, VALUE self) { VALUE operator()(int32_t argc, wasm_ptr_t argv, VALUE self) { BOOST_ASIO_CORO_REENTER (this) { GFX_LOCK; + SANDBOX_AWAIT(viewportelement_initialize, argc, argv, self); SANDBOX_GUARD(SANDBOX_AWAIT(wrap_property, self, &get_private_data(self)->getColor(sb().e), "color", color_class)); SANDBOX_GUARD(SANDBOX_AWAIT(wrap_property, self, &get_private_data(self)->getTone(sb().e), "tone", tone_class)); - GFX_UNLOCK; } return SANDBOX_NIL; } + + ~coro() { + GFX_UNLOCK; + } }; return sb()->bind()()(argc, argv, self); diff --git a/binding-sandbox/sprite-binding.cpp b/binding-sandbox/sprite-binding.cpp index 2e5cc031..79521a93 100644 --- a/binding-sandbox/sprite-binding.cpp +++ b/binding-sandbox/sprite-binding.cpp @@ -38,15 +38,19 @@ static VALUE initialize(int32_t argc, wasm_ptr_t argv, VALUE self) { VALUE operator()(int32_t argc, wasm_ptr_t argv, VALUE self) { BOOST_ASIO_CORO_REENTER (this) { GFX_LOCK; + SANDBOX_AWAIT(viewportelement_initialize, argc, argv, self); SANDBOX_GUARD(SANDBOX_AWAIT(wrap_property, self, &get_private_data(self)->getSrcRect(sb().e), "src_rect", rect_class)); SANDBOX_GUARD(SANDBOX_AWAIT(wrap_property, self, &get_private_data(self)->getColor(sb().e), "color", color_class)); SANDBOX_GUARD(SANDBOX_AWAIT(wrap_property, self, &get_private_data(self)->getTone(sb().e), "tone", tone_class)); - GFX_UNLOCK; } return SANDBOX_NIL; } + + ~coro() { + GFX_UNLOCK; + } }; return sb()->bind()()(argc, argv, self); diff --git a/binding-sandbox/tilemap-binding.cpp b/binding-sandbox/tilemap-binding.cpp index a3137661..052791e6 100644 --- a/binding-sandbox/tilemap-binding.cpp +++ b/binding-sandbox/tilemap-binding.cpp @@ -58,21 +58,25 @@ struct tilemap_autotiles_binding_init : boost::asio::coroutine { VALUE operator()(VALUE self, VALUE i, VALUE obj) { BOOST_ASIO_CORO_REENTER (this) { + GFX_LOCK; + if (get_private_data(self) == nullptr) { return self; } SANDBOX_AWAIT_S(0, rb_num2ulong, i); - GFX_LOCK; get_private_data(self)->set(SANDBOX_SLOT(0), get_private_data(obj)); SANDBOX_AWAIT_S(1, rb_iv_get, self, "array"); SANDBOX_AWAIT(rb_ary_store, SANDBOX_SLOT(1), SANDBOX_SLOT(0), obj); - GFX_UNLOCK; } return self; } + + ~coro() { + GFX_UNLOCK; + } }; return sb()->bind()()(self, i, obj); @@ -98,6 +102,8 @@ static VALUE initialize(int32_t argc, wasm_ptr_t argv, VALUE self) { VALUE operator()(int32_t argc, wasm_ptr_t argv, VALUE self) { BOOST_ASIO_CORO_REENTER (this) { + GFX_LOCK; + { SANDBOX_SLOT(0) = SANDBOX_NIL; Viewport *viewport = nullptr; @@ -108,7 +114,6 @@ static VALUE initialize(int32_t argc, wasm_ptr_t argv, VALUE self) { } } - GFX_LOCK; Tilemap *tilemap = new Tilemap(viewport); set_private_data(self, tilemap); @@ -138,12 +143,14 @@ static VALUE initialize(int32_t argc, wasm_ptr_t argv, VALUE self) { /* Circular reference so both objects are always * alive at the same time */ SANDBOX_AWAIT(rb_iv_set, SANDBOX_SLOT(1), "tilemap", self); - - GFX_UNLOCK; } return SANDBOX_NIL; } + + ~coro() { + GFX_UNLOCK; + } }; return sb()->bind()()(argc, argv, self); @@ -157,9 +164,7 @@ static VALUE update(VALUE self) { struct coro : boost::asio::coroutine { VALUE operator()(VALUE self) { BOOST_ASIO_CORO_REENTER (this) { - GFX_LOCK; - SANDBOX_GUARD_F(GFX_UNLOCK, get_private_data(self)->update(sb().e)); - GFX_UNLOCK; + SANDBOX_GUARD_L(get_private_data(self)->update(sb().e)); } return SANDBOX_NIL; diff --git a/binding-sandbox/tilemapvx-binding.cpp b/binding-sandbox/tilemapvx-binding.cpp index be65141b..1f237885 100644 --- a/binding-sandbox/tilemapvx-binding.cpp +++ b/binding-sandbox/tilemapvx-binding.cpp @@ -57,21 +57,25 @@ struct bitmap_array_binding_init : boost::asio::coroutine { VALUE operator()(VALUE self, VALUE i, VALUE obj) { BOOST_ASIO_CORO_REENTER (this) { + GFX_LOCK; + if (get_private_data(self) == nullptr) { return self; } SANDBOX_AWAIT_S(0, rb_num2ulong, i); - GFX_LOCK; get_private_data(self)->set(SANDBOX_SLOT(0), get_private_data(obj)); SANDBOX_AWAIT_S(1, rb_iv_get, self, "array"); SANDBOX_AWAIT(rb_ary_store, SANDBOX_SLOT(1), SANDBOX_SLOT(0), obj); - GFX_UNLOCK; } return self; } + + ~coro() { + GFX_UNLOCK; + } }; return sb()->bind()()(self, i, obj); @@ -149,9 +153,7 @@ static VALUE update(VALUE self) { struct coro : boost::asio::coroutine { VALUE operator()(VALUE self) { BOOST_ASIO_CORO_REENTER (this) { - GFX_LOCK; - SANDBOX_GUARD_F(GFX_UNLOCK, get_private_data(self)->update(sb().e)); - GFX_UNLOCK; + SANDBOX_GUARD_L(get_private_data(self)->update(sb().e)); } return SANDBOX_NIL; diff --git a/binding-sandbox/window-binding.cpp b/binding-sandbox/window-binding.cpp index 9b7485fa..f2e7480c 100644 --- a/binding-sandbox/window-binding.cpp +++ b/binding-sandbox/window-binding.cpp @@ -37,13 +37,17 @@ static VALUE initialize(int32_t argc, wasm_ptr_t argv, VALUE self) { VALUE operator()(int32_t argc, wasm_ptr_t argv, VALUE self) { BOOST_ASIO_CORO_REENTER (this) { GFX_LOCK; + SANDBOX_AWAIT(viewportelement_initialize, argc, argv, self); SANDBOX_GUARD(SANDBOX_AWAIT(wrap_property, self, &get_private_data(self)->getCursorRect(sb().e), "cursor_rect", rect_class)); - GFX_UNLOCK; } return SANDBOX_NIL; } + + ~coro() { + GFX_UNLOCK; + } }; return sb()->bind()()(argc, argv, self); @@ -53,7 +57,7 @@ static VALUE update(VALUE self) { struct coro : boost::asio::coroutine { VALUE operator()(VALUE self) { BOOST_ASIO_CORO_REENTER (this) { - SANDBOX_GUARD(get_private_data(self)->update(sb().e)); + SANDBOX_GUARD_L(get_private_data(self)->update(sb().e)); } return SANDBOX_NIL; diff --git a/binding-sandbox/windowvx-binding.cpp b/binding-sandbox/windowvx-binding.cpp index 9c1409ca..7dea153e 100644 --- a/binding-sandbox/windowvx-binding.cpp +++ b/binding-sandbox/windowvx-binding.cpp @@ -40,9 +40,10 @@ static VALUE initialize(int32_t argc, wasm_ptr_t argv, VALUE self) { VALUE operator()(int32_t argc, wasm_ptr_t argv, VALUE self) { BOOST_ASIO_CORO_REENTER (this) { + GFX_LOCK; + SANDBOX_SLOT(1) = SANDBOX_SLOT(2) = SANDBOX_SLOT(3) = SANDBOX_SLOT(4) = 0; - GFX_LOCK; if (rgssVer >= 3) { if (argc == 4) { SANDBOX_AWAIT_S(1, rb_num2int, sb()->ref(argv, 0)); @@ -67,11 +68,14 @@ static VALUE initialize(int32_t argc, wasm_ptr_t argv, VALUE self) { SANDBOX_GUARD(set_private_data(SANDBOX_SLOT(0), new Bitmap(sb().e, 1, 1))); SANDBOX_AWAIT(bitmap_init_props, SANDBOX_SLOT(0)); SANDBOX_AWAIT(rb_iv_set, self, "contents", SANDBOX_SLOT(0)); - GFX_UNLOCK; } return SANDBOX_NIL; } + + ~coro() { + GFX_UNLOCK; + } }; return sb()->bind()()(argc, argv, self); @@ -81,7 +85,7 @@ static VALUE update(VALUE self) { struct coro : boost::asio::coroutine { VALUE operator()(VALUE self) { BOOST_ASIO_CORO_REENTER (this) { - SANDBOX_GUARD(get_private_data(self)->update(sb().e)); + SANDBOX_GUARD_L(get_private_data(self)->update(sb().e)); } return SANDBOX_NIL; @@ -117,9 +121,7 @@ static VALUE move(VALUE self, VALUE x, VALUE y, VALUE w, VALUE h) { SANDBOX_AWAIT_S(1, rb_num2int, y); SANDBOX_AWAIT_S(2, rb_num2int, w); SANDBOX_AWAIT_S(3, rb_num2int, h); - GFX_LOCK; - SANDBOX_GUARD_F(GFX_UNLOCK, get_private_data(self)->move(sb().e, SANDBOX_SLOT(0), SANDBOX_SLOT(1), SANDBOX_SLOT(2), SANDBOX_SLOT(3))); - GFX_UNLOCK; + SANDBOX_GUARD_L(get_private_data(self)->move(sb().e, SANDBOX_SLOT(0), SANDBOX_SLOT(1), SANDBOX_SLOT(2), SANDBOX_SLOT(3))); } return SANDBOX_NIL; diff --git a/binding/tilemapvx-binding.cpp b/binding/tilemapvx-binding.cpp index 04041a0c..638b9dce 100644 --- a/binding/tilemapvx-binding.cpp +++ b/binding/tilemapvx-binding.cpp @@ -94,7 +94,7 @@ RB_METHOD(tilemapVXUpdate) { TilemapVX *t = getPrivateData(self); - BINDING_GUARD(t->update(e)); + BINDING_GUARD_L(t->update(e)); return Qnil; }