diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-11-17 07:30:37 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-11-17 07:30:37 +0000 |
commit | 8e48dc16e97a783a69f0972b4882ad2faae561ea (patch) | |
tree | c25927a4f286e4ed5f3c7637076332e99287b089 /variable.c | |
parent | 943e99e62746388456955729e9f8417f3df5f8b5 (diff) |
19991117
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@564 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'variable.c')
-rw-r--r-- | variable.c | 204 |
1 files changed, 170 insertions, 34 deletions
diff --git a/variable.c b/variable.c index 7b273933ac..d66fa9915b 100644 --- a/variable.c +++ b/variable.c @@ -44,7 +44,7 @@ fc_i(key, value, res) VALUE path; char *name; - if (!rb_is_const_id(key)) return ST_CONTINUE; + if (!rb_is_shared_id(key)) return ST_CONTINUE; name = rb_id2name(key); if (res->path) { @@ -216,7 +216,7 @@ rb_autoload_id(id, filename) ID id; const char *filename; { - if (!rb_is_const_id(id)) { + if (!rb_is_shared_id(id)) { rb_raise(rb_eNameError, "autoload must be constant name", rb_id2name(id)); } @@ -630,7 +630,7 @@ rb_gvar_set(entry, val) } VALUE -rb_gvar_set2(name, val) +rb_gv_set(name, val) const char *name; VALUE val; { @@ -641,6 +641,16 @@ rb_gvar_set2(name, val) } VALUE +rb_gv_get(name) + const char *name; +{ + struct global_entry *entry; + + entry = rb_global_entry(global_id(name)); + return rb_gvar_get(entry); +} + +VALUE rb_gvar_defined(entry) struct global_entry *entry; { @@ -973,7 +983,7 @@ rb_obj_remove_instance_variable(obj, name) } VALUE -rb_const_get_at(klass, id) +rb_shvar_get_at(klass, id) VALUE klass; ID id; { @@ -983,7 +993,7 @@ rb_const_get_at(klass, id) return value; } if (klass == rb_cObject) { - return rb_const_get(klass, id); + return rb_shvar_get(klass, id); } rb_raise(rb_eNameError, "uninitialized constant %s::%s", RSTRING(rb_class_path(klass))->ptr, @@ -993,7 +1003,15 @@ rb_const_get_at(klass, id) VALUE -rb_const_get(klass, id) +rb_const_get_at(klass, id) + VALUE klass; + ID id; +{ + return rb_shvar_get_at(klass, id); +} + +VALUE +rb_shvar_get(klass, id) VALUE klass; ID id; { @@ -1008,7 +1026,7 @@ rb_const_get(klass, id) tmp = RCLASS(tmp)->super; } if (BUILTIN_TYPE(klass) == T_MODULE) { - return rb_const_get(rb_cObject, id); + return rb_shvar_get(rb_cObject, id); } /* pre-defined class */ @@ -1023,7 +1041,7 @@ rb_const_get(klass, id) module = rb_str_new2(modname); free(modname); rb_f_require(Qnil, module); - return rb_const_get(klass, id); + return rb_shvar_get(klass, id); } /* Uninitialized constant */ @@ -1037,13 +1055,21 @@ rb_const_get(klass, id) return Qnil; /* not reached */ } +VALUE +rb_const_get(klass, id) + VALUE klass; + ID id; +{ + return rb_shvar_get(klass, id); +} + static int -const_i(key, value, ary) +sv_i(key, value, ary) ID key; VALUE value; VALUE ary; { - if (rb_is_const_id(key)) { + if (rb_is_shared_id(key)) { VALUE kval = rb_str_new2(rb_id2name(key)); if (!rb_ary_includes(ary, kval)) { rb_ary_push(ary, kval); @@ -1053,20 +1079,20 @@ const_i(key, value, ary) } VALUE -rb_mod_remove_const(mod, name) +rb_mod_remove_shvar(mod, name) VALUE mod, name; { ID id = rb_to_id(name); VALUE val; - if (!rb_is_const_id(id)) { - rb_raise(rb_eNameError, "`%s' is not constant", rb_id2name(id)); + if (!rb_is_shared_id(id)) { + rb_raise(rb_eNameError, "`%s' is not shared variable", rb_id2name(id)); } if (RCLASS(mod)->iv_tbl && st_delete(ROBJECT(mod)->iv_tbl, &id, &val)) { return val; } - if (rb_const_defined_at(mod, id)) { + if (rb_shvar_defined_at(mod, id)) { rb_raise(rb_eNameError, "cannot remove %s::%s", rb_class2name(mod), rb_id2name(id)); } @@ -1075,6 +1101,13 @@ rb_mod_remove_const(mod, name) return Qnil; /* not reached */ } +VALUE +rb_mod_remove_const(mod, name) + VALUE mod, name; +{ + return rb_mod_remove_shvar(mod, name); +} + static int autoload_i(key, name, ary) ID key; @@ -1089,16 +1122,16 @@ autoload_i(key, name, ary) } VALUE -rb_mod_const_at(mod, ary) +rb_mod_shvar_at(mod, ary) VALUE mod, ary; { if (!FL_TEST(mod, FL_TAINT) && rb_safe_level() >= 4) rb_raise(rb_eSecurityError, "Insecure: can't get metainfo"); if (RCLASS(mod)->iv_tbl) { - st_foreach(RCLASS(mod)->iv_tbl, const_i, ary); + st_foreach(RCLASS(mod)->iv_tbl, sv_i, ary); } if ((VALUE)mod == rb_cObject) { - st_foreach(rb_class_tbl, const_i, ary); + st_foreach(rb_class_tbl, sv_i, ary); if (autoload_tbl) { st_foreach(autoload_tbl, autoload_i, ary); } @@ -1107,28 +1140,50 @@ rb_mod_const_at(mod, ary) } VALUE -rb_mod_constants(mod) - VALUE mod; +rb_mod_const_at(mod, ary) + VALUE mod, ary; { - return rb_mod_const_at(mod, rb_ary_new()); + return rb_mod_shvar_at(mod, ary); } VALUE -rb_mod_const_of(mod, ary) +rb_mod_shvar_of(mod, ary) VALUE mod; VALUE ary; { - rb_mod_const_at(mod, ary); + rb_mod_shvar_at(mod, ary); for (;;) { mod = RCLASS(mod)->super; if (!mod) break; - rb_mod_const_at(mod, ary); + rb_mod_shvar_at(mod, ary); } return ary; } +VALUE +rb_mod_const_of(mod, ary) + VALUE mod; + VALUE ary; +{ + return rb_mod_shvar_of(mod, ary); +} + +VALUE +rb_mod_shvars(mod) + VALUE mod; +{ + return rb_mod_shvar_of(mod, rb_ary_new()); +} + +VALUE +rb_mod_constants(mod) + VALUE mod; +{ + return rb_mod_shvars(mod); +} + int -rb_const_defined_at(klass, id) +rb_shvar_defined_at(klass, id) VALUE klass; ID id; { @@ -1136,12 +1191,20 @@ rb_const_defined_at(klass, id) return Qtrue; } if (klass == rb_cObject) { - return rb_const_defined(klass, id); + return rb_shvar_defined(klass, id); } return Qfalse; } int +rb_const_defined_at(klass, id) + VALUE klass; + ID id; +{ + return rb_shvar_defined_at(klass, id); +} + +int rb_autoload_defined(id) ID id; { @@ -1151,7 +1214,7 @@ rb_autoload_defined(id) } int -rb_const_defined(klass, id) +rb_shvar_defined(klass, id) VALUE klass; ID id; { @@ -1164,15 +1227,23 @@ rb_const_defined(klass, id) tmp = RCLASS(tmp)->super; } if (BUILTIN_TYPE(klass) == T_MODULE) { - return rb_const_defined(rb_cObject, id); + return rb_shvar_defined(rb_cObject, id); } if (st_lookup(rb_class_tbl, id, 0)) return Qtrue; return rb_autoload_defined(id); } +int +rb_const_defined(klass, id) + VALUE klass; + ID id; +{ + return rb_shvar_defined(klass, id); +} + void -rb_const_set(klass, id, val) +rb_shvar_set(klass, id, val) VALUE klass; ID id; VALUE val; @@ -1182,14 +1253,62 @@ rb_const_set(klass, id, val) if (!RCLASS(klass)->iv_tbl) { RCLASS(klass)->iv_tbl = st_init_numtable(); } - else if (st_lookup(RCLASS(klass)->iv_tbl, id, 0)) { - rb_warn("already initialized constant %s", rb_id2name(id)); - } st_insert(RCLASS(klass)->iv_tbl, id, val); } void +rb_const_set(klass, id, val) + VALUE klass; + ID id; + VALUE val; +{ + return rb_shvar_set(klass, id, val); +} + +void +rb_shvar_assign(klass, id, val) + VALUE klass; + ID id; + VALUE val; +{ + VALUE tmp = klass; + + while (tmp) { + if (RCLASS(tmp)->iv_tbl && st_lookup(RCLASS(tmp)->iv_tbl,id,0)) { + st_insert(RCLASS(tmp)->iv_tbl, id, val); + return; + } + tmp = RCLASS(tmp)->super; + } + /* pre-defined class */ + if (st_lookup(rb_class_tbl, id, 0)) { + st_delete(rb_class_tbl, id, 0); + st_insert(RCLASS(rb_cObject)->iv_tbl, id, val); + return; + } + + /* autoload */ + if (autoload_tbl && st_lookup(autoload_tbl, id, 0)) { + char *modname; + + st_delete(autoload_tbl, &id, &modname); + free(modname); + st_insert(RCLASS(rb_cObject)->iv_tbl, id, val); + return; + } + + /* Uninitialized constant */ + if (klass && klass != rb_cObject) + rb_raise(rb_eNameError, "uninitialized constant %s::%s", + RSTRING(rb_class_path(klass))->ptr, + rb_id2name(id)); + else { + rb_raise(rb_eNameError, "uninitialized constant %s",rb_id2name(id)); + } +} + +void rb_define_const(klass, name, val) VALUE klass; const char *name; @@ -1200,10 +1319,19 @@ rb_define_const(klass, name, val) if (klass == rb_cObject) { rb_secure(4); } - if (!rb_is_const_id(id)) { - rb_raise(rb_eNameError, "wrong constant name %s", name); + if (!rb_is_shared_id(id)) { + rb_raise(rb_eNameError, "wrong shared variable name %s", name); } - rb_const_set(klass, id, val); + rb_shvar_set(klass, id, val); +} + +void +rb_define_shvar(klass, name, val) + VALUE klass; + const char *name; + VALUE val; +{ + return rb_define_const(klass, name, val); } void @@ -1214,6 +1342,14 @@ rb_define_global_const(name, val) rb_define_const(rb_cObject, name, val); } +void +rb_define_global_shvar(name, val) + const char *name; + VALUE val; +{ + rb_define_global_const(name, val); +} + VALUE rb_iv_get(obj, name) VALUE obj; |