78 if (value == res->
klass) {
82 switch (
TYPE(value)) {
103 res->
path = arg.path;
165 rb_bug(
"class path is not set properly");
194 if (!
NIL_P(path))
return path;
200 const char *s =
"Class";
210 path =
rb_sprintf(
"#<%s:%p>", s, (
void*)klass);
264 if (path[0] ==
'#') {
268 while (*p && *p !=
':') p++;
271 if (p[1] !=
':')
goto undefined_class;
323 #define global_variable rb_global_variable
324 #define global_entry rb_global_entry
326 #define gvar_getter_t rb_gvar_getter_t
327 #define gvar_setter_t rb_gvar_setter_t
328 #define gvar_marker_t rb_gvar_marker_t
347 #define undef_getter rb_gvar_undef_getter
348 #define undef_setter rb_gvar_undef_setter
349 #define undef_marker rb_gvar_undef_marker
351 #define val_getter rb_gvar_val_getter
352 #define val_setter rb_gvar_val_setter
353 #define val_marker rb_gvar_val_marker
355 #define var_getter rb_gvar_var_getter
356 #define var_setter rb_gvar_var_setter
357 #define var_marker rb_gvar_var_marker
359 #define readonly_setter rb_gvar_readonly_setter
404 var->
data = (
void*)val;
421 var->
data = (
void*)val;
435 if (!var)
return Qnil;
442 *(
VALUE *)data = val;
484 if (name[0] ==
'$')
id =
rb_intern(name);
489 memcpy(buf+1, name, len);
506 gvar->
data = (
void*)var;
585 trace->
next = entry->var->trace;
589 entry->var->trace = trace;
603 while (trace->
next) {
642 trace = (entry = (
struct global_entry *)data)->var->trace;
658 if (trace->
data == cmd) {
673 return (*var->
getter)(entry->id, var->
data, var);
709 (*var->
setter)(val, entry->id, var->
data, var);
770 for (i = 1; i <= 9; ++
i) {
771 buf[1] = (char)(i +
'0');
792 else if ((entry1 = (
struct global_entry *)data1)->var != entry2->var) {
811 entry2->var->counter++;
812 entry1->var = entry2->var;
824 if (!generic_iv_tbl)
return 0;
834 if (generic_iv_tbl) {
855 special_generic_ivar = 1;
857 if (!generic_iv_tbl) {
876 if (!generic_iv_tbl)
return Qfalse;
892 if (!generic_iv_tbl)
return 0;
909 if (!generic_iv_tbl)
return;
934 if (!generic_iv_tbl)
return;
935 if (special_generic_ivar == 0)
return;
944 if (!generic_iv_tbl)
return;
945 if (
st_delete(generic_iv_tbl, &key, &tbl))
963 if (!generic_iv_tbl)
return;
1002 if (!iv_index_tbl)
break;
1004 if (len <= (
long)index)
break;
1012 return (
VALUE)index;
1048 switch (
TYPE(obj)) {
1051 if (!iv_index_tbl) {
1054 if (!iv_index_tbl) {
1065 if (len <= (
long)index) {
1076 long newsize = (index+1) + (index+1)/4;
1077 if (!ivar_extended &&
1085 ROBJECT(obj)->as.heap.ivptr = newptr;
1089 newptr =
ROBJECT(obj)->as.heap.ivptr;
1091 for (; len < newsize; len++)
1093 ROBJECT(obj)->as.heap.numiv = newsize;
1094 ROBJECT(obj)->as.heap.iv_index_tbl = iv_index_tbl;
1117 switch (
TYPE(obj)) {
1120 if (!iv_index_tbl)
break;
1153 return (data->
func)((
ID)key, val, data->
arg);
1179 switch (
TYPE(obj)) {
1190 if (!generic_iv_tbl)
break;
1206 switch (
TYPE(obj)) {
1211 for (i = count = 0; i < num; ++
i) {
1212 if (ivptr[i] !=
Qundef) {
1226 if (!generic_iv_tbl)
break;
1314 switch (
TYPE(obj)) {
1317 if (!iv_index_tbl)
break;
1434 #define check_autoload_table(av) \
1435 (struct st_table *)rb_check_typeddata((av), &autoload_data_type)
1447 if (!file || !*file) {
1491 return (
NODE *)load;
1497 const char **
p = (
const char **)arg;
1515 const char *loading;
1523 file = load->nd_lit;
1534 if (loadingpath && loading) {
1535 *loadingpath = loading;
1558 const char *loading = 0, *src;
1562 if (!load)
return Qfalse;
1564 if (src && loading && strcmp(src, loading) == 0)
return Qfalse;
1565 file = load->nd_lit;
1574 const char *loading = 0;
1578 if (!mod)
return Qnil;
1581 if (!load)
return Qnil;
1582 return load && (file = load->nd_lit) ? file :
Qnil;
1593 while (
RTEST(tmp)) {
1603 if (am == tmp)
break;
1609 rb_warn(
"toplevel constant %s referenced by %s::%s",
1614 if (!recurse)
break;
1801 if (
RTEST(inherit)) {
1829 if (!recurse)
break;
1907 visibility = ce->
flag;
1928 rb_warn(
"rb_define_const: invalid name `%s' for constant", name);
1951 "Insecure: can't change constant visibility");
1958 for (i = 0; i <
argc; i++) {
2010 #define CVAR_LOOKUP(v,r) do {\
2011 if (RCLASS_IV_TBL(klass) && st_lookup(RCLASS_IV_TBL(klass),(st_data_t)id,(v))) {\
2014 if (FL_TEST(klass, FL_SINGLETON) ) {\
2015 VALUE obj = rb_iv_get(klass, "__attached__");\
2016 switch (TYPE(obj)) {\
2022 klass = RCLASS_SUPER(klass);\
2027 klass = RCLASS_SUPER(klass);\
2030 if (RCLASS_IV_TBL(klass) && st_lookup(RCLASS_IV_TBL(klass),(st_data_t)id,(v))) {\
2033 klass = RCLASS_SUPER(klass);\
2040 VALUE tmp, front = 0, target = 0;
2043 CVAR_LOOKUP(0, {
if (!front) front = klass; target = klass;});
2045 if (front && target != front) {
2049 rb_warning(
"class variable %s of %s is overtaken by %s",
2073 VALUE tmp, front = 0, target = 0;
2077 CVAR_LOOKUP(&value, {
if (!front) front = klass; target = klass;});
2082 if (front && target != front) {
2086 rb_warning(
"class variable %s of %s is overtaken by %s",
2094 return (
VALUE)value;
2100 if (!klass)
return Qfalse;