mruby-bin-mirb: should not use Exception#inspect to print errors

Use mrb_exc_get_output() instead.
This commit is contained in:
Yukihiro "Matz" Matsumoto
2025-05-07 12:32:12 +09:00
parent 6eb969ff04
commit c36d9b7732
+24 -10
View File
@@ -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