static VALUE thread_backtrace(VALUE self) { rb_thread_t t = find_thread(self); struct FRAME *frame, *prev_frame; char buf[BUFSIZ]; VALUE ary; NODE *n; if (t == rb_curr_thread) { frame = ruby_frame; } else { frame = convert_pointer(t, t->frame); } ary = rb_ary_new(); if (frame->last_func == ID_ALLOCATOR) { frame = convert_pointer(t, frame->prev); } for (; frame && (n = frame->node); frame = prev_frame) { prev_frame = convert_pointer(t, frame->prev); if (prev_frame && prev_frame->last_func) { if (prev_frame->node == n) { if (prev_frame->last_func == frame->last_func) continue; } snprintf(buf, BUFSIZ, "%s:%d:in `%s'", n->nd_file, nd_line(n), rb_id2name(prev_frame->last_func)); } else { snprintf(buf, BUFSIZ, "%s:%d", n->nd_file, nd_line(n)); } rb_ary_push(ary, rb_str_new2(buf)); } return ary; }
conversion_type *operator ()(value_type *pv) { return convert_pointer(pv); }