From 683ecc09b5a7807d3ed0400dde48ff9cf9aca6a9 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 30 Apr 2025 07:54:40 +0900 Subject: [PATCH] codedump.c: do not print extra ';' if operands are not local vars --- src/codedump.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/codedump.c b/src/codedump.c index e421f903b..91c1149f0 100644 --- a/src/codedump.c +++ b/src/codedump.c @@ -8,6 +8,16 @@ #include #ifndef MRB_NO_STDIO +static mrb_bool +print_r_p(mrb_state *mrb, const mrb_irep *irep, size_t n) +{ + if (n == 0) return FALSE; + if (!irep->lv) return FALSE; + if (n >= irep->nlocals) return FALSE; + if (!irep->lv[n-1]) return FALSE; + return TRUE; +} + static void print_r(mrb_state *mrb, const mrb_irep *irep, size_t n, FILE *out) { @@ -20,25 +30,21 @@ print_r(mrb_state *mrb, const mrb_irep *irep, size_t n, FILE *out) static void print_lv_a(mrb_state *mrb, const mrb_irep *irep, uint16_t a, FILE *out) { - if (!irep->lv || a >= irep->nlocals || a == 0) { - fprintf(out, "\n"); - return; + if (print_r_p(mrb, irep, a)) { + fprintf(out, "\t;"); + print_r(mrb, irep, a, out); } - fprintf(out, "\t;"); - print_r(mrb, irep, a, out); fprintf(out, "\n"); } static void print_lv_ab(mrb_state *mrb, const mrb_irep *irep, uint16_t a, uint16_t b, FILE *out) { - if (!irep->lv || (a >= irep->nlocals && b >= irep->nlocals) || a+b == 0) { - fprintf(out, "\n"); - return; + if (print_r_p(mrb, irep, a) || print_r_p(mrb, irep, b)) { + fprintf(out, "\t;"); + print_r(mrb, irep, a, out); + print_r(mrb, irep, b, out); } - fprintf(out, "\t;"); - if (a > 0) print_r(mrb, irep, a, out); - if (b > 0) print_r(mrb, irep, b, out); fprintf(out, "\n"); }