diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | version.c | 3 | ||||
-rw-r--r-- | vm.c | 3 | ||||
-rw-r--r-- | vm_eval.c | 12 |
4 files changed, 22 insertions, 4 deletions
@@ -1,3 +1,11 @@ +Thu Apr 15 14:38:03 2010 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * vm.c (vm_backtrace_each): get rid of use of malloc from signal + handler by using ruby_engine_name. [ruby-core:29497] + + * vm_eval.c (print_backtrace): file may be nil when segfaulted in + very early stage. + Thu Apr 15 11:51:49 2010 NAKAMURA Usaku <usa@ruby-lang.org> * common.mk (help): small fix. @@ -57,6 +57,7 @@ const int ruby_patchlevel = RUBY_PATCHLEVEL; const char ruby_description[] = RUBY_DESCRIPTION; const char ruby_copyright[] = RUBY_COPYRIGHT; const char ruby_engine[] = "ruby"; +VALUE ruby_engine_name = Qnil; const char ruby_initial_load_paths[] = #ifndef NO_INITIAL_LOAD_PATH @@ -95,7 +96,7 @@ Init_version(void) rb_define_global_const("RUBY_REVISION", INT2FIX(RUBY_REVISION)); rb_define_global_const("RUBY_DESCRIPTION", MKSTR(description)); rb_define_global_const("RUBY_COPYRIGHT", MKSTR(copyright)); - rb_define_global_const("RUBY_ENGINE", MKSTR(engine)); + rb_define_global_const("RUBY_ENGINE", ruby_engine_name = MKSTR(engine)); } void @@ -732,8 +732,9 @@ vm_backtrace_each(rb_thread_t *th, int lev, rb_backtrace_iter_func *iter, void * } else if (RUBYVM_CFUNC_FRAME_P(cfp)) { ID id; + extern VALUE ruby_engine_name; - if (NIL_P(file)) file = rb_str_new_cstr("ruby"); + if (NIL_P(file)) file = ruby_engine_name; if (cfp->me->def) id = cfp->me->def->original_id; else @@ -1573,8 +1573,16 @@ rb_f_caller(int argc, VALUE *argv) static int print_backtrace(void *arg, VALUE file, int line, VALUE method) { - fprintf((FILE *)arg, "\tfrom %s:%d:in `%s'\n", - RSTRING_PTR(file), line, RSTRING_PTR(method)); + FILE *fp = arg; + const char *filename = NIL_P(file) ? "ruby" : RSTRING_PTR(file); + if (NIL_P(method)) { + fprintf(fp, "\tfrom %s:%d:in unknown method\n", + filename, line); + } + else { + fprintf(fp, "\tfrom %s:%d:in `%s'\n", + filename, line, RSTRING_PTR(method)); + } return FALSE; } |