mruby error messages should be directed to stderr

parent d78f23d2
......@@ -317,6 +317,7 @@ void mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...);
void mrb_warn(mrb_state *mrb, const char *fmt, ...);
void mrb_bug(mrb_state *mrb, const char *fmt, ...);
void mrb_print_backtrace(mrb_state *mrb);
void mrb_print_error(mrb_state *mrb);
/* macros to get typical exception objects
note:
......
......@@ -198,8 +198,7 @@ main(int argc, char **argv)
mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));
n = 0;
if (mrb->exc) {
mrb_print_backtrace(mrb);
p(mrb, mrb_obj_value(mrb->exc));
mrb_print_error(mrb);
n = -1;
}
}
......@@ -230,8 +229,7 @@ main(int argc, char **argv)
mrbc_context_free(mrb, c);
if (mrb->exc) {
if (!mrb_undef_p(v)) {
mrb_print_backtrace(mrb);
p(mrb, mrb_obj_value(mrb->exc));
mrb_print_error(mrb);
}
n = -1;
}
......
......@@ -17,7 +17,7 @@ mrb_print_backtrace(mrb_state *mrb)
const char *filename, *method, *sep;
int i, line;
printf("trace:\n");
fputs("trace:\n", stderr);
ciidx = mrb_fixnum(mrb_obj_iv_get(mrb, mrb->exc, mrb_intern(mrb, "ciidx")));
if (ciidx >= mrb->c->ciend - mrb->c->cibase)
ciidx = 10; /* ciidx is broken... */
......@@ -59,14 +59,14 @@ mrb_print_backtrace(mrb_state *mrb)
const char *cn = mrb_class_name(mrb, ci->proc->target_class);
if (cn) {
printf("\t[%d] %s:%d:in %s%s%s\n", i, filename, line, cn, sep, method);
fprintf(stderr, "\t[%d] %s:%d:in %s%s%s\n", i, filename, line, cn, sep, method);
}
else {
printf("\t[%d] %s:%d:in %s\n", i, filename, line, method);
fprintf(stderr, "\t[%d] %s:%d:in %s\n", i, filename, line, method);
}
}
else {
printf("\t[%d] %s:%d\n", i, filename, line);
fprintf(stderr, "\t[%d] %s:%d\n", i, filename, line);
}
}
#endif
......
......@@ -34,6 +34,22 @@ mrb_p(mrb_state *mrb, mrb_value obj)
#endif
}
void
mrb_print_error(mrb_state *mrb)
{
#ifdef ENABLE_STDIO
mrb_value s;
mrb_print_backtrace(mrb);
s = mrb_funcall(mrb, mrb_obj_value(mrb->exc), "inspect", 0);
if (mrb_string_p(s)) {
struct RString *str = mrb_str_ptr(s);
fwrite(str->ptr, str->len, 1, stderr);
putc('\n', stderr);
}
#endif
}
void
mrb_show_version(mrb_state *mrb)
{
......
......@@ -136,8 +136,7 @@ module MRuby
unless rbfiles.empty?
f.puts %Q[ mrb_load_irep(mrb, gem_mrblib_irep_#{funcname});]
f.puts %Q[ if (mrb->exc) {]
f.puts %Q[ mrb_print_backtrace(mrb);]
f.puts %Q[ mrb_p(mrb, mrb_obj_value(mrb->exc));]
f.puts %Q[ mrb_print_error(mrb);]
f.puts %Q[ exit(EXIT_FAILURE);]
f.puts %Q[ }]
end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment