From c36d9b77326da5ff400f94d6020abe3eb89a6929 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 7 May 2025 12:32:12 +0900 Subject: [PATCH] mruby-bin-mirb: should not use Exception#inspect to print errors Use mrb_exc_get_output() instead. --- mrbgems/mruby-bin-mirb/tools/mirb/mirb.c | 34 +++++++++++++++++------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c index 5f32539d8..1ea9d33a2 100644 --- a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +++ b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c @@ -112,19 +112,17 @@ get_history_path(mrb_state *mrb) #endif static void -p(mrb_state *mrb, mrb_value obj, int prompt) +p(mrb_state *mrb, mrb_value obj) { mrb_value val; char* msg; val = mrb_funcall_argv(mrb, obj, MRB_SYM(inspect), 0, NULL); - if (prompt) { - if (!mrb->exc) { - fputs(" => ", stdout); - } - else { - val = mrb_funcall_id(mrb, mrb_obj_value(mrb->exc), MRB_SYM(inspect), 0); - } + if (!mrb->exc) { + fputs(" => ", stdout); + } + else { + val = mrb_exc_get_output(mrb, mrb->exc); } if (!mrb_string_p(val)) { val = mrb_obj_as_string(mrb, obj); @@ -135,6 +133,22 @@ p(mrb_state *mrb, mrb_value obj, int prompt) putc('\n', stdout); } +static void +p_error(mrb_state *mrb, struct RObject* exc) +{ + mrb_value val; + char* msg; + + val = mrb_exc_get_output(mrb, exc); + if (!mrb_string_p(val)) { + val = mrb_obj_as_string(mrb, val); + } + msg = mrb_locale_from_utf8(RSTRING_PTR(val), (int)RSTRING_LEN(val)); + fwrite(msg, strlen(msg), 1, stdout); + mrb_locale_free(msg); + putc('\n', stdout); +} + /* Guess if the user might want to enter more * or if they wants an evaluation of their code now */ static mrb_bool @@ -672,7 +686,7 @@ main(int argc, char **argv) /* did an exception occur? */ if (mrb->exc) { MRB_EXC_CHECK_EXIT(mrb, mrb->exc); - p(mrb, mrb_obj_value(mrb->exc), 0); + p_error(mrb, mrb->exc); mrb->exc = 0; } else { @@ -680,7 +694,7 @@ main(int argc, char **argv) if (!mrb_respond_to(mrb, result, MRB_SYM(inspect))){ result = mrb_any_to_s(mrb, result); } - p(mrb, result, 1); + p(mrb, result); #ifndef MRB_NO_MIRB_UNDERSCORE *(mrb->c->ci->stack + 1) = result; #endif