From 39855a330453ea90296b0df86af1472633f095d1 Mon Sep 17 00:00:00 2001 From: dearblue Date: Sun, 29 Sep 2019 13:57:22 +0900 Subject: Restore GC arena frequently --- mrbgems/mruby-error/src/exception.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'mrbgems/mruby-error') diff --git a/mrbgems/mruby-error/src/exception.c b/mrbgems/mruby-error/src/exception.c index 170abb699..ec4870dc0 100644 --- a/mrbgems/mruby-error/src/exception.c +++ b/mrbgems/mruby-error/src/exception.c @@ -8,6 +8,7 @@ mrb_protect(mrb_state *mrb, mrb_func_t body, mrb_value data, mrb_bool *state) struct mrb_jmpbuf *prev_jmp = mrb->jmp; struct mrb_jmpbuf c_jmp; mrb_value result = mrb_nil_value(); + mrb_int ai = mrb_gc_arena_save(mrb); if (state) { *state = FALSE; } @@ -22,6 +23,7 @@ mrb_protect(mrb_state *mrb, mrb_func_t body, mrb_value data, mrb_bool *state) if (state) { *state = TRUE; } } MRB_END_EXC(&c_jmp); + mrb_gc_arena_restore(mrb, ai); mrb_gc_protect(mrb, result); return result; } @@ -32,6 +34,7 @@ mrb_ensure(mrb_state *mrb, mrb_func_t body, mrb_value b_data, mrb_func_t ensure, struct mrb_jmpbuf *prev_jmp = mrb->jmp; struct mrb_jmpbuf c_jmp; mrb_value result; + mrb_int ai = mrb_gc_arena_save(mrb); MRB_TRY(&c_jmp) { mrb->jmp = &c_jmp; @@ -39,11 +42,15 @@ mrb_ensure(mrb_state *mrb, mrb_func_t body, mrb_value b_data, mrb_func_t ensure, mrb->jmp = prev_jmp; } MRB_CATCH(&c_jmp) { mrb->jmp = prev_jmp; + mrb_gc_arena_restore(mrb, ai); ensure(mrb, e_data); MRB_THROW(mrb->jmp); /* rethrow catched exceptions */ } MRB_END_EXC(&c_jmp); + mrb_gc_arena_restore(mrb, ai); + mrb_gc_protect(mrb, result); ensure(mrb, e_data); + mrb_gc_arena_restore(mrb, ai); mrb_gc_protect(mrb, result); return result; } @@ -64,6 +71,7 @@ mrb_rescue_exceptions(mrb_state *mrb, mrb_func_t body, mrb_value b_data, mrb_fun mrb_value result; mrb_bool error_matched = FALSE; mrb_int i; + mrb_int ai = mrb_gc_arena_save(mrb); MRB_TRY(&c_jmp) { mrb->jmp = &c_jmp; @@ -82,9 +90,11 @@ mrb_rescue_exceptions(mrb_state *mrb, mrb_func_t body, mrb_value b_data, mrb_fun if (!error_matched) { MRB_THROW(mrb->jmp); } mrb->exc = NULL; + mrb_gc_arena_restore(mrb, ai); result = rescue(mrb, r_data); } MRB_END_EXC(&c_jmp); + mrb_gc_arena_restore(mrb, ai); mrb_gc_protect(mrb, result); return result; } -- cgit v1.2.3