print exceptions like MRI
This commit is contained in:
parent
2d7d3d14ab
commit
a3326b099b
35
src/main.cc
35
src/main.cc
@ -6,11 +6,40 @@ using namespace std;
|
|||||||
|
|
||||||
RUBY_GLOBAL_SETUP
|
RUBY_GLOBAL_SETUP
|
||||||
|
|
||||||
|
static const char * ruby_string(VALUE obj)
|
||||||
|
{
|
||||||
|
VALUE s = rb_funcall(obj, rb_intern("to_s"), 0);
|
||||||
|
return StringValueCStr(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void print_exception(VALUE e)
|
||||||
|
{
|
||||||
|
VALUE c = rb_funcall(e, rb_intern("class"), 0);
|
||||||
|
VALUE m = rb_funcall(e, rb_intern("message"), 0);
|
||||||
|
VALUE bt = rb_funcall(e, rb_intern("backtrace"), 0);
|
||||||
|
if ((TYPE(bt) == T_ARRAY) && (RARRAY_LEN(bt) > 0))
|
||||||
|
{
|
||||||
|
fprintf(stderr,
|
||||||
|
"%s: %s (%s)\n",
|
||||||
|
ruby_string(rb_ary_entry(bt, 0)),
|
||||||
|
ruby_string(m),
|
||||||
|
ruby_string(c));
|
||||||
|
for (int i = 1; i < RARRAY_LEN(bt); i++)
|
||||||
|
{
|
||||||
|
fprintf(stderr,
|
||||||
|
" from %s\n",
|
||||||
|
ruby_string(rb_ary_entry(bt, i)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s (%s)\n", ruby_string(m), ruby_string(c));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void handle_bootstrap_error()
|
static void handle_bootstrap_error()
|
||||||
{
|
{
|
||||||
VALUE e = rb_errinfo();
|
print_exception(rb_errinfo());
|
||||||
VALUE s = rb_funcall(e, rb_intern("message"), 0);
|
|
||||||
fprintf(stderr, "%s\n", StringValueCStr(s));
|
|
||||||
rb_set_errinfo(Qnil);
|
rb_set_errinfo(Qnil);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user