From 8e50a45f3e4de8086058be933e147e0509f40497 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Fri, 14 Nov 2025 00:49:55 +0900 Subject: [PATCH] mrb_print_error: handle NULL gracefully to simplify error checking made mrb_print_error() handle NULL by printing "Failed to allocate mrb_state" when mrb is NULL. since mrb_close() already handles NULL, this allows simplified error checking pattern: if (!MRB_OPEN_SUCCESS(mrb)) { mrb_print_error(mrb); // handles NULL mrb_close(mrb); // handles NULL return EXIT_FAILURE; } updated all binary tools (mruby, mirb, mrdb, mrbtest) to use this simplified pattern, removing nested if checks. Co-authored-by: Claude --- mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c | 11 ++--------- mrbgems/mruby-bin-mirb/tools/mirb/mirb.c | 11 ++--------- mrbgems/mruby-bin-mruby/tools/mruby/mruby.c | 11 ++--------- mrbgems/mruby-test/driver.c | 11 ++--------- src/error.c | 5 +++++ 5 files changed, 13 insertions(+), 36 deletions(-) diff --git a/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c b/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c index a135b0fa7..c2f736871 100644 --- a/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +++ b/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c @@ -674,15 +674,8 @@ main(int argc, char **argv) l_restart: if (!MRB_OPEN_SUCCESS(mrb)) { - if (mrb) { - /* Initialization failed - print exception details */ - mrb_print_error(mrb); - mrb_close(mrb); - } - else { - /* Allocation failed */ - fputs("Failed to allocate mrb_state, exiting mrdb\n", stderr); - } + mrb_print_error(mrb); /* handles NULL */ + mrb_close(mrb); /* handles NULL */ return EXIT_FAILURE; } diff --git a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c index 77ab8ce6b..c26dcfdd3 100644 --- a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +++ b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c @@ -476,15 +476,8 @@ main(int argc, char **argv) /* new interpreter instance */ mrb = mrb_open(); if (!MRB_OPEN_SUCCESS(mrb)) { - if (mrb) { - /* Initialization failed - print exception details */ - mrb_print_error(mrb); - mrb_close(mrb); - } - else { - /* Allocation failed */ - fputs("Failed to allocate mrb_state, exiting mirb\n", stderr); - } + mrb_print_error(mrb); /* handles NULL */ + mrb_close(mrb); /* handles NULL */ return EXIT_FAILURE; } diff --git a/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c b/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c index 38274c399..fc56900c3 100644 --- a/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +++ b/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c @@ -283,15 +283,8 @@ main(int argc, char **argv) mrb_value v; if (!MRB_OPEN_SUCCESS(mrb)) { - if (mrb) { - /* Initialization failed - print exception details */ - mrb_print_error(mrb); - mrb_close(mrb); - } - else { - /* Allocation failed */ - fprintf(stderr, "%s: Failed to allocate mrb_state, exiting mruby\n", *argv); - } + mrb_print_error(mrb); /* handles NULL */ + mrb_close(mrb); /* handles NULL */ return EXIT_FAILURE; } diff --git a/mrbgems/mruby-test/driver.c b/mrbgems/mruby-test/driver.c index d1decad8b..7caecd54e 100644 --- a/mrbgems/mruby-test/driver.c +++ b/mrbgems/mruby-test/driver.c @@ -291,15 +291,8 @@ main(int argc, char **argv) /* new interpreter instance */ mrb = mrb_open(); if (!MRB_OPEN_SUCCESS(mrb)) { - if (mrb) { - /* Initialization failed - print exception details */ - mrb_print_error(mrb); - mrb_close(mrb); - } - else { - /* Allocation failed */ - fputs("Failed to allocate mrb_state, exiting test driver", stderr); - } + mrb_print_error(mrb); /* handles NULL */ + mrb_close(mrb); /* handles NULL */ return EXIT_FAILURE; } diff --git a/src/error.c b/src/error.c index ffb9e4792..487e1afc7 100644 --- a/src/error.c +++ b/src/error.c @@ -845,6 +845,11 @@ MRB_API void mrb_print_error(mrb_state *mrb) { #ifndef MRB_NO_STDIO + if (!mrb) { + /* mrb_open() returned NULL - allocation failed */ + fputs("Failed to allocate mrb_state\n", stderr); + return; + } if (mrb->jmp == NULL) { struct mrb_jmpbuf c_jmp; MRB_TRY(&c_jmp) {