From 7d85092bc4e1b3d2a204af50906adb144502571f Mon Sep 17 00:00:00 2001 From: dearblue Date: Sun, 13 Mar 2022 15:20:12 +0900 Subject: [PATCH] Reorganize the `struct RException::mesg` member There is no need to limit the type to `struct RString`. Also, the `MRB_EXC_MESG_STRING_FLAG` flag can be eliminated by checking if `struct RException::mesg` is `NULL` or not. ref. #2485 --- include/mruby/error.h | 3 +-- src/error.c | 17 ++++++----------- src/gc.c | 4 ++-- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/include/mruby/error.h b/include/mruby/error.h index fb3557405..01082f931 100644 --- a/include/mruby/error.h +++ b/include/mruby/error.h @@ -17,11 +17,10 @@ MRB_BEGIN_DECL struct RException { MRB_OBJECT_HEADER; struct iv_tbl *iv; - struct RString *mesg; + struct RObject *mesg; // NULL or probably RString }; #define mrb_exc_ptr(v) ((struct RException*)mrb_ptr(v)) -#define MRB_EXC_MESG_STRING_FLAG 0x100 MRB_API void mrb_sys_fail(mrb_state *mrb, const char *mesg); MRB_API mrb_value mrb_exc_new_str(mrb_state *mrb, struct RClass* c, mrb_value str); diff --git a/src/error.c b/src/error.c index 46d26bece..1a8f65dbf 100644 --- a/src/error.c +++ b/src/error.c @@ -20,26 +20,21 @@ void mrb_exc_mesg_set(mrb_state *mrb, struct RException *exc, mrb_value mesg) { - if (mrb_string_p(mesg)) { - exc->flags |= MRB_EXC_MESG_STRING_FLAG; - exc->mesg = RSTRING(mesg); + if (!mrb_immediate_p(mesg)) { + exc->mesg = mrb_obj_ptr(mesg); mrb_field_write_barrier_value(mrb, (struct RBasic*)exc, mesg); + mrb_iv_remove(mrb, mrb_obj_value(exc), MRB_SYM(mesg)); } else { - exc->flags &= ~MRB_EXC_MESG_STRING_FLAG; - if (mrb_nil_p(mesg)) { - exc->mesg = 0; - } - else { - mrb_obj_iv_set(mrb, (struct RObject*)exc, MRB_SYM(mesg), mesg); - } + exc->mesg = NULL; + mrb_obj_iv_set(mrb, (struct RObject*)exc, MRB_SYM(mesg), mesg); } } mrb_value mrb_exc_mesg_get(mrb_state *mrb, struct RException *exc) { - if ((exc->flags & MRB_EXC_MESG_STRING_FLAG) != 0) { + if (exc->mesg) { return mrb_obj_value(exc->mesg); } else { diff --git a/src/gc.c b/src/gc.c index a6ff0c588..1a139fcf9 100644 --- a/src/gc.c +++ b/src/gc.c @@ -760,7 +760,7 @@ gc_mark_children(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj) case MRB_TT_EXCEPTION: mrb_gc_mark_iv(mrb, (struct RObject*)obj); - if ((obj->flags & MRB_EXC_MESG_STRING_FLAG) != 0) { + if (((struct RException*)obj)->mesg) { mrb_gc_mark(mrb, (struct RBasic*)((struct RException*)obj)->mesg); } break; @@ -1049,7 +1049,7 @@ gc_gray_counts(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj) case MRB_TT_EXCEPTION: children += mrb_gc_mark_iv_size(mrb, (struct RObject*)obj); - if ((obj->flags & MRB_EXC_MESG_STRING_FLAG) != 0) { + if (((struct RException*)obj)->mesg) { children++; } break;