From 520df805a97989018d17e02c78ed8cb1c6f27fa1 Mon Sep 17 00:00:00 2001 From: dearblue Date: Sat, 30 Jul 2022 22:31:58 +0900 Subject: [PATCH] Check `MRB_GC_RED` with `mrb_gc_protect()` When `gc_protect()` is called from `mrb_obj_alloc()`, unnecessary overhead is eliminated. --- src/gc.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/gc.c b/src/gc.c index a3d496162..204c56e6b 100644 --- a/src/gc.c +++ b/src/gc.c @@ -449,7 +449,6 @@ mrb_gc_destroy(mrb_state *mrb, mrb_gc *gc) static void gc_protect(mrb_state *mrb, mrb_gc *gc, struct RBasic *p) { - if (is_red(p)) return; #ifdef MRB_GC_FIXED_ARENA if (gc->arena_idx >= MRB_GC_ARENA_SIZE) { /* arena overflow error */ @@ -472,7 +471,9 @@ MRB_API void mrb_gc_protect(mrb_state *mrb, mrb_value obj) { if (mrb_immediate_p(obj)) return; - gc_protect(mrb, &mrb->gc, mrb_basic_ptr(obj)); + struct RBasic *p = mrb_basic_ptr(obj); + if (is_red(p)) return; + gc_protect(mrb, &mrb->gc, p); } #define GC_ROOT_SYM MRB_SYM(_gc_root_)