Sha256: d6c89282b893c38eedf5ec85909be6e9deb9c09cf0829f58b5133ecdb30fa1c9

Contents?: true

Size: 1.16 KB

Versions: 3

Compression:

Stored size: 1.16 KB

Contents

#include "st_name.h"

static VALUE extract_st_name(VALUE object) {
  return rb_funcall(object, rb_intern("st_name"), 0);
}

VALUE get_cname(VALUE constant) {
  if(rb_obj_is_kind_of(constant, rb_cClass)) {
    return rb_class_name(constant);
  } else if(rb_obj_is_kind_of(constant, rb_cModule)) {
    return rb_mod_name(constant);
  } else {
    return Qundef; // This is still possible!
  }
}

static VALUE object_name_for_cBasicObject(VALUE object, VALUE klass) {
  VALUE cname = get_cname(klass);

  if(cname == Qundef) return Qundef;

  return rb_sprintf("#<%"PRIsVALUE":%p>", cname, (void*)object);
}

static VALUE object_name_for_cObject(VALUE object, VALUE klass) {
  int status;

  VALUE st_name = rb_protect(extract_st_name, object, &status);

  if(status != 0) {
    rb_set_errinfo(Qnil);

    return object_name_for_cBasicObject(object, klass);
  } else {
    return st_name;
  }
}

VALUE st_name(VALUE object, VALUE klass) {
  if(rb_obj_is_kind_of(object, rb_cObject)) {
    return object_name_for_cObject(object, klass);
  } else if(rb_obj_is_kind_of(object, rb_cBasicObject)) {
    return object_name_for_cBasicObject(object, klass);
  } else {
    return Qundef;
  }
}

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
stack_trace-0.8.0 ext/stack_trace/st_name.c
stack_trace-0.7.0 ext/stack_trace/st_name.c
stack_trace-0.6.0 ext/stack_trace/st_name.c