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);
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) {
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;
963 if (!generic_iv_tbl)
return;
1002 if (!iv_index_tbl)
break;
1004 if (len <= (
long)index)
break;
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);\
2045 if (front &&
target != front) {
2049 rb_warning(
"class variable %s of %s is overtaken by %s",
2082 if (front &&
target != front) {
2086 rb_warning(
"class variable %s of %s is overtaken by %s",
2100 if (!klass)
return Qfalse;
void rb_define_global_const(const char *, VALUE)
static int fc_i(ID key, rb_const_entry_t *ce, struct fc_result *res)
VALUE rb_cvar_get(VALUE, ID)
static int cv_i(ID key, VALUE value, VALUE ary)
static VALUE rb_const_get_0(VALUE klass, ID id, int exclude, int recurse, int visibility)
void rb_bug(const char *fmt,...)
void rb_cv_set(VALUE, const char *, VALUE)
size_t strlen(const char *)
static void uninitialized_constant(VALUE klass, ID id)
void rb_define_virtual_variable(const char *, VALUE(*)(ANYARGS), void(*)(ANYARGS))
static VALUE generic_ivar_defined(VALUE obj, ID id)
static st_table * generic_iv_tbl
void rb_define_class_variable(VALUE, const char *, VALUE)
SSL_METHOD *(* func)(void)
static void remove_trace(struct global_variable *var)
void rb_error_frozen(const char *what)
VALUE rb_mod_class_variables(VALUE)
#define TypedData_Wrap_Struct(klass, data_type, sval)
VALUE rb_gvar_set(struct rb_global_entry *, VALUE)
struct st_table * rb_generic_ivar_table(VALUE)
int rb_public_const_defined(VALUE klass, ID id)
static NODE * autoload_delete(VALUE mod, ID id)
void rb_vm_inc_const_missing_count(void)
void rb_autoload(VALUE, ID, const char *)
VALUE rb_ary_push(VALUE ary, VALUE item)
void rb_cvar_set(VALUE, ID, VALUE)
static VALUE trace_en(struct global_variable *var)
#define check_autoload_table(av)
static int obj_ivar_i(st_data_t key, st_data_t index, st_data_t arg)
VALUE rb_path_to_class(VALUE)
#define ROBJECT_IV_INDEX_TBL(o)
#define RSTRING_PTR(string)
void rb_raise(VALUE exc, const char *fmt,...)
VALUE rb_ivar_get(VALUE, ID)
int rb_const_defined(VALUE, ID)
VALUE rb_ary_new3(long n,...)
static VALUE autoload_provided(VALUE arg)
int rb_feature_provided(const char *, const char **)
int rb_public_const_defined_at(VALUE klass, ID id)
static void set_const_visibility(VALUE mod, int argc, VALUE *argv, rb_const_flag_t flag)
static int special_generic_ivar
void rb_vm_change_state(void)
VALUE rb_path2class(const char *)
int rb_const_defined_from(VALUE, ID)
int(* func)(ID key, VALUE val, st_data_t arg)
VALUE rb_ivar_defined(VALUE, ID)
VALUE rb_mod_remove_cvar(VALUE, VALUE)
void rb_ivar_foreach(VALUE, int(*)(ANYARGS), st_data_t)
static void rb_trace_eval(VALUE cmd, VALUE val)
const char * rb_obj_classname(VALUE)
VALUE rb_gv_set(const char *, VALUE)
void rb_name_error(ID id, const char *fmt,...)
#define CVAR_LOOKUP(v, r)
static int list_i(st_data_t key, st_data_t value, VALUE ary)
int rb_is_const_id(ID id)
int rb_is_instance_id(ID id)
return rb_str_append(rb_str_new2(cmd_id_head), id_num)
VALUE rb_gv_get(const char *)
void rb_free_generic_ivar(VALUE)
static void autoload_free(void *ptr)
VALUE rb_cvar_defined(VALUE, ID)
struct rb_global_entry * rb_global_entry(ID)
VALUE rb_class_name(VALUE)
void * rb_mod_const_at(VALUE, void *)
RUBY_EXTERN VALUE rb_cObject
VALUE rb_class_real(VALUE)
VALUE rb_str_cat2(VALUE, const char *)
void rb_clear_cache_by_class(VALUE)
static int mark_global_entry(ID key, struct global_entry *entry)
VALUE rb_mod_private_constant(int argc, VALUE *argv, VALUE obj)
VALUE rb_iv_get(VALUE, const char *)
static NODE * autoload_node(VALUE mod, ID id, const char **loadingpath)
void(* func)(VALUE arg, VALUE val)
static VALUE classname(VALUE klass)
void rb_define_const(VALUE, const char *, VALUE)
void rb_mark_generic_ivar_tbl(void)
int rb_public_const_defined_from(VALUE klass, ID id)
VALUE rb_require_safe(VALUE, int)
#define ALLOCA_N(type, n)
static VALUE generic_ivar_get(VALUE obj, ID id, int warn)
RUBY_EXTERN VALUE rb_cModule
#define RUBY_FUNC_EXPORTED
#define MEMCPY(p1, p2, type, n)
unsigned char buf[MIME_BUF_SIZE]
VALUE rb_mod_constants(int, VALUE *, VALUE)
void rb_gc_mark_global_tbl(void)
static ID global_id(const char *name)
static VALUE find_class_path(VALUE klass)
static int givar_i(VALUE obj, st_table *tbl)
VALUE rb_const_get(VALUE, ID)
void st_foreach_safe(st_table *table, int(*func)(ANYARGS), st_data_t a)
void rb_alias_variable(ID, ID)
return rb_eval_cmd(cmd, rest, 0)
void rb_define_readonly_variable(const char *, VALUE *)
#define REALLOC_N(var, type, n)
VALUE rb_sprintf(const char *format,...)
#define rb_node_newnode(type, a1, a2, a3)
#define RB_GC_GUARD(object)
VALUE rb_class_path(VALUE)
VALUE rb_iv_set(VALUE, const char *, VALUE)
void * rb_mod_const_of(VALUE, void *)
void Init_var_tables(void)
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
VALUE rb_mod_public_constant(int argc, VALUE *argv, VALUE obj)
VALUE rb_const_list(void *)
static VALUE const_missing(VALUE klass, ID id)
void rb_name_class(VALUE, ID)
const char * rb_class2name(VALUE)
void rb_mark_tbl(st_table *tbl)
void rb_mark_generic_ivar(VALUE)
register unsigned int len
VALUE rb_cv_get(VALUE, const char *)
#define rb_enc_asciicompat(enc)
static int generic_ivar_remove(VALUE obj, ID id, st_data_t *valp)
VALUE rb_ensure(VALUE(*b_proc)(ANYARGS), VALUE data1, VALUE(*e_proc)(ANYARGS), VALUE data2)
VALUE rb_str_new_cstr(const char *)
VALUE rb_obj_remove_instance_variable(VALUE, VALUE)
static void generic_ivar_set(VALUE obj, ID id, VALUE val)
void rb_define_hooked_variable(const char *, VALUE *, VALUE(*)(ANYARGS), void(*)(ANYARGS))
#define RCLASS_CONST_TBL(c)
void rb_set_safe_level_force(int)
struct rb_global_variable * var
int rb_const_defined_at(VALUE, ID)
rb_encoding * rb_enc_get(VALUE obj)
VALUE rb_public_const_get(VALUE klass, ID id)
static VALUE trace_ev(struct trace_data *data)
VALUE rb_block_proc(void)
size_t st_memsize(const st_table *)
VALUE rb_gvar_get(struct rb_global_entry *)
#define ROBJECT_EMBED_LEN_MAX
VALUE rb_obj_frozen_p(VALUE)
static int gvar_i(ID key, struct global_entry *entry, VALUE ary)
static int ivar_i(ID key, VALUE val, VALUE ary)
static const rb_data_type_t autoload_data_type
rb_ivar_set(einfo, ID_at_interp, interp)
VALUE rb_ary_includes(VALUE ary, VALUE item)
static int rb_special_const_p(VALUE obj)
VALUE rb_mod_remove_const(VALUE, VALUE)
static VALUE fc_path(struct fc_result *fc, ID name)
struct rb_encoding_entry * list
void rb_define_variable(const char *, VALUE *)
VALUE rb_mod_const_missing(VALUE, VALUE)
VALUE rb_f_global_variables(void)
VALUE rb_public_const_get_at(VALUE klass, ID id)
static int rb_const_defined_0(VALUE klass, ID id, int exclude, int recurse, int visibility)
VALUE rb_ary_new2(long capa)
int rb_is_class_id(ID id)
static int sv_i(ID key, rb_const_entry_t *ce, st_table *tbl)
VALUE rb_const_get_at(VALUE, ID)
rb_const_set(self, ID_SUBST_INFO, cbsubst_obj)
void rb_set_class_path(VALUE, VALUE, const char *)
void rb_gc_mark_maybe(VALUE obj)
#define RCLASS_IV_INDEX_TBL(c)
static VALUE reset_safe(VALUE safe)
static size_t autoload_memsize(const void *ptr)
const char * rb_id2name(ID id)
return rb_funcall(q->proc, ID_call, 0)
void check_before_mod_set(VALUE klass, ID id, VALUE val, const char *dest)
static int givar_mark_i(ID key, VALUE value)
VALUE rb_str_new_frozen(VALUE)
void rb_warning(const char *fmt,...)
#define rb_check_frozen(obj)
VALUE rb_f_untrace_var(int, VALUE *)
#define CONST_ID(var, str)
ID rb_intern3(const char *name, long len, rb_encoding *enc)
void rb_copy_generic_ivar(VALUE, VALUE)
static void obj_ivar_each(VALUE obj, int(*func)(ANYARGS), st_data_t arg)
VALUE rb_public_const_get_from(VALUE klass, ID id)
static VALUE ivar_get(VALUE obj, ID id, int warn)
VALUE rb_gvar_defined(struct rb_global_entry *)
VALUE rb_obj_instance_variables(VALUE)
VALUE rb_const_remove(VALUE, ID)
VALUE rb_f_trace_var(int, VALUE *)
VALUE rb_const_get_from(VALUE, ID)
ID rb_intern2(const char *name, long len)
size_t rb_generic_ivar_memsize(VALUE)
static VALUE original_module(VALUE c)
VALUE rb_str_new2(const char *)
void rb_warn(const char *fmt,...)
st_index_t rb_ivar_count(VALUE)
static void autoload_mark(void *ptr)
VALUE rb_autoload_load(VALUE, ID)
void rb_set_class_path_string(VALUE, VALUE, VALUE)
VALUE rb_attr_get(VALUE, ID)
static int autoload_node_id(VALUE mod, ID id)
VALUE rb_autoload_p(VALUE, ID)
VALUE rb_obj_class(VALUE)