6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
# File 'ext/change_class/change_class.c', line 6
static VALUE
rb_change_class(VALUE self, VALUE klass)
{
VALUE actual_class = KLASS_OF(self);;
VALUE cl;
if (TYPE(klass) != T_CLASS)
rb_raise(rb_eArgError, "Must provide a class.");
cl = actual_class;
if (cl == rb_class_real(cl))
KLASS_OF(self) = klass;
else {
while ((RBASIC(RCLASS_SUPER(cl))->flags & FL_SINGLETON) || BUILTIN_TYPE(RCLASS_SUPER(cl)) == T_ICLASS)
cl = RCLASS_SUPER(cl);
RCLASS_SUPER(cl) = klass;
}
rb_clear_cache();
return klass;
}
|