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;
}
Beispiel #2
0
 conversion_type *operator ()(value_type *pv)
 {
     return convert_pointer(pv);
 }