Module: Drx::Core

Defined in:
ext/drx_core.c

Constant Summary collapse

FL_SINGLETON =
INT2FIX(FL_SINGLETON)
T_OBJECT =
INT2FIX(T_OBJECT)
T_CLASS =
INT2FIX(T_CLASS)
T_ICLASS =
INT2FIX(T_ICLASS)
T_MODULE =
INT2FIX(T_MODULE)

Class Method Summary collapse

Class Method Details

.get_address(obj) ⇒ Object

Returns the object’s “id”.

This is an alternative to Object#__id__ because the latter doesn’t work for T_ICLASS.



135
136
137
138
# File 'ext/drx_core.c', line 135

static VALUE t_get_address(VALUE self, VALUE obj)
{
  return INT2NUM(obj);
}

.get_flags(obj) ⇒ Object

Returns an object’s flags.



97
98
99
100
# File 'ext/drx_core.c', line 97

static VALUE t_get_flags(VALUE self, VALUE obj)
{
  return INT2NUM(RBASIC(obj)->flags);
}

.get_iv_tbl(obj) ⇒ Object

Gets the iv_tbl of the object, as a Ruby hash.



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'ext/drx_core.c', line 32

static VALUE t_get_iv_tbl(VALUE self, VALUE obj)
{
  VALUE hash;
  hash = rb_hash_new();

  if (TYPE(obj) != T_OBJECT && TYPE(obj) != T_CLASS && TYPE(obj) != T_ICLASS && TYPE(obj) != T_MODULE) {
    rb_raise(rb_eTypeError, "Only T_OBJECT/T_CLASS/T_MODULE is expected as the argument (got %d)", TYPE(obj));
  }

#ifdef RUBY_1_8
  if (ROBJECT(obj)->iv_tbl) {
    st_foreach(ROBJECT(obj)->iv_tbl, record_var, (st_data_t)hash);
  }
#else
  rb_ivar_foreach(obj, record_var, hash);
#endif

  return hash;
}

.get_ivar(obj, var_name) ⇒ Object

Extracts one varibale from an object iv_tbl.



55
56
57
58
59
60
61
62
63
# File 'ext/drx_core.c', line 55

static VALUE t_get_ivar(VALUE self, VALUE obj, VALUE var_name)
{
  const char *c_name;
  if (TYPE(obj) != T_OBJECT && TYPE(obj) != T_CLASS && TYPE(obj) != T_ICLASS && TYPE(obj) != T_MODULE) {
    rb_raise(rb_eTypeError, "Only T_OBJECT/T_CLASS/T_MODULE is expected as the argument (got %d)", TYPE(obj));
  }
  c_name = StringValuePtr(var_name);
  return rb_iv_get(obj, c_name);
}

.get_klass(obj) ⇒ Object

Returns an object’s klass.

In contrast to Object#class, this function doesn’t skip singletons and T_ICLASS.



88
89
90
91
92
# File 'ext/drx_core.c', line 88

static VALUE t_get_klass(VALUE self, VALUE obj)
{
  return CLASS_OF(obj);
  // Note: we can't simply do 'RBASIC(obj)->klass', because obj may be an 'immediate'.
}

.get_m_tbl(obj) ⇒ Object

Gets the m_tbl of a class.



116
117
118
119
120
121
122
123
124
125
126
127
# File 'ext/drx_core.c', line 116

static VALUE t_get_m_tbl(VALUE self, VALUE obj)
{
  VALUE hash;

  if (TYPE(obj) != T_CLASS && TYPE(obj) != T_ICLASS && TYPE(obj) != T_MODULE) {
    rb_raise(rb_eTypeError, "Only T_CLASS/T_MODULE is expected as the argument (got %d)", TYPE(obj));
  }

  hash = rb_hash_new();
  st_foreach(RCLASS(obj)->m_tbl, record_method, (st_data_t)hash);
  return hash;
}

.get_super(obj) ⇒ Object

Returns a class’s super.

In contrast to Class#superclass, this function doesn’t skip singletons and T_ICLASS.



70
71
72
73
74
75
76
77
78
79
80
81
# File 'ext/drx_core.c', line 70

static VALUE t_get_super(VALUE self, VALUE obj)
{
  if (TYPE(obj) != T_CLASS && TYPE(obj) != T_ICLASS && TYPE(obj) != T_MODULE) {
    rb_raise(rb_eTypeError, "Only T_CLASS/T_MODULE is expected as the argument (got %d)", TYPE(obj));
  }
#ifdef RCLASS_SUPER
  // Ruby 1.8.7 and above have this macro.
  return RCLASS_SUPER(obj) ? RCLASS_SUPER(obj) : Qnil;
#else
  return RCLASS(obj)->super ? RCLASS(obj)->super : Qnil;
#endif
}

.get_type(obj) ⇒ Object

Gets the Ruby’s engine type of a variable.



16
17
18
19
# File 'ext/drx_core.c', line 16

static VALUE t_get_type(VALUE self, VALUE obj)
{
  return INT2NUM(TYPE(obj));
}

.Drx::Core::locate_method(Date, "to_s") ⇒ Object

Locates the filename and line-number where a method was defined.

Returns one of:

- [ "/path/to/file.rb", 89 ]
- A string of the form "<identifier>" if the method isn't written
  in Ruby. Possibilities are <c>, <alias>, <attr reader>, and more.
- raises NameError if the method doesn't exist.


237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
# File 'ext/drx_core.c', line 237

static VALUE t_locate_method(VALUE self, VALUE obj, VALUE method_name)
{
  const char *c_name;
  NODE *method_node;

  if (TYPE(obj) != T_CLASS && TYPE(obj) != T_ICLASS && TYPE(obj) != T_MODULE) {
    rb_raise(rb_eTypeError, "Only T_CLASS/T_MODULE is expected as the argument (got %d)", TYPE(obj));
  }
  c_name = StringValuePtr(method_name);
  ID id = rb_intern(c_name);
  if (RCLASS(obj)->m_tbl && st_lookup(RCLASS(obj)->m_tbl, id, (st_data_t *)&method_node))  {
    return t_do_locate_method(method_node);
  } else {
    rb_raise(rb_eNameError, "method not found");
  }
}