how to understand

H

Haoqi Haoqi

#object.c:
Init_Object()
{
rb_cObject = boot_defclass("Object", 0);
rb_cModule = boot_defclass("Module", rb_cObject);
rb_cClass = boot_defclass("Class", rb_cModule);

}
=======boot_defclass========
boot_defclass(name, super)
{
VALUE obj = rb_class_boot(super);
}
========rb_class_boot========
rb_class_boot(super)
{
OBJSETUP(klass, rb_cClass, T_CLASS);
}
####################################
when call "boot_defclass("Object", 0)","rb_cClass" is not defined,why
"rb_class_boot" can call "rb_cClass"?
 
W

Wisccal Wisccal

when call "boot_defclass("Object", 0)","rb_cClass" is not defined,why
"rb_class_boot" can call "rb_cClass"?

Dear Curious Friend

I'm not a Ruby expert, nor do I know much about C. But since your
curiosity infected me, I ventured into the Ruby source trying to figure
this out. The following are my findings.

rb_cObject, rb_cModule, rb_cClass all get allocated in NEWOBJ as struct
RClass.

NEWOBJ(obj, struct RClass);

In, OBJSETUP, they're cast to type struct RObject, and the structs
member klass gets assigned rb_cClass, which is a VALUE pointer:

OBJSETUP(obj, klass, flags);

#define OBJSETUP(obj,c,t) do {\
/*...*/
RBASIC(obj)->klass = (c);\
/*...*/
} while (0)

Here, rb_cClass gets assigned an RClass type like rb_cObject, and
rb_cModule. But it will also have a klass member that still holds a
pointer to the same struct, which rb_cClass pointed to before:
rb_cClass = boot_defclass("Class", rb_cModule);

As pointed out in the beginning, I'm not an expert on this, so the above
might very well be incorrect or incomplete. I would very much appreciate
it if someone with better insight could provide a more thorough
explanation and elaborate on why rb_cClass is needed.

Regards
wisccal
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,167
Messages
2,570,913
Members
47,455
Latest member
Delilah Code

Latest Threads

Top