From 432caf0670687bb1b8d45489305e5bdd398af951 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 8 Feb 2024 23:22:48 +0900 Subject: [PATCH] backtrace.c (pack_backtrace): refactor the function that called once --- src/backtrace.c | 46 ++++++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/src/backtrace.c b/src/backtrace.c index 291b20893..441159a5e 100644 --- a/src/backtrace.c +++ b/src/backtrace.c @@ -17,10 +17,28 @@ #include #include -typedef void (*each_backtrace_func)(mrb_state*, const struct mrb_backtrace_location*, void*); +static void +pack_backtrace_i(mrb_state *mrb, + const struct mrb_backtrace_location *loc, + void *data) +{ + struct mrb_backtrace_location **pptr = (struct mrb_backtrace_location**)data; + struct mrb_backtrace_location *ptr = *pptr; + + *ptr = *loc; + if (ptr->irep) { + if (ptr->irep->refcnt == UINT16_MAX) { + ptr->irep = NULL; + } + else { + mrb_irep_incref(mrb, (mrb_irep*)ptr->irep); + } + } + *pptr = ptr+1; +} static size_t -each_backtrace(mrb_state *mrb, ptrdiff_t ciidx, each_backtrace_func func, void *data) +pack_backtrace(mrb_state *mrb, ptrdiff_t ciidx, void *data) { size_t n = 0; @@ -71,32 +89,12 @@ each_backtrace(mrb_state *mrb, ptrdiff_t ciidx, each_backtrace_func func, void * break; } } - if (func) func(mrb, &loc, data); + pack_backtrace_i(mrb, &loc, data); n++; } return n; } -static void -pack_backtrace_i(mrb_state *mrb, - const struct mrb_backtrace_location *loc, - void *data) -{ - struct mrb_backtrace_location **pptr = (struct mrb_backtrace_location**)data; - struct mrb_backtrace_location *ptr = *pptr; - - *ptr = *loc; - if (ptr->irep) { - if (ptr->irep->refcnt == UINT16_MAX) { - ptr->irep = NULL; - } - else { - mrb_irep_incref(mrb, (mrb_irep*)ptr->irep); - } - } - *pptr = ptr+1; -} - static struct RObject* packed_backtrace(mrb_state *mrb) { @@ -112,7 +110,7 @@ packed_backtrace(mrb_state *mrb) void *ptr = mrb_malloc(mrb, len * sizeof(struct mrb_backtrace_location)); backtrace->locations = (struct mrb_backtrace_location*)ptr; - backtrace->len = each_backtrace(mrb, ciidx, pack_backtrace_i, &ptr); + backtrace->len = pack_backtrace(mrb, ciidx, &ptr); return (struct RObject*)backtrace; }