mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
19991117
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@564 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
943e99e627
commit
8e48dc16e9
19 changed files with 370 additions and 136 deletions
212
variable.c
212
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;
|
||||
{
|
||||
|
@ -640,6 +640,16 @@ rb_gvar_set2(name, val)
|
|||
return rb_gvar_set(entry, 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,10 +1140,24 @@ 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_shvar_of(mod, ary)
|
||||
VALUE mod;
|
||||
VALUE ary;
|
||||
{
|
||||
rb_mod_shvar_at(mod, ary);
|
||||
for (;;) {
|
||||
mod = RCLASS(mod)->super;
|
||||
if (!mod) break;
|
||||
rb_mod_shvar_at(mod, ary);
|
||||
}
|
||||
return ary;
|
||||
}
|
||||
|
||||
VALUE
|
||||
|
@ -1118,17 +1165,25 @@ rb_mod_const_of(mod, ary)
|
|||
VALUE mod;
|
||||
VALUE ary;
|
||||
{
|
||||
rb_mod_const_at(mod, ary);
|
||||
for (;;) {
|
||||
mod = RCLASS(mod)->super;
|
||||
if (!mod) break;
|
||||
rb_mod_const_at(mod, ary);
|
||||
}
|
||||
return 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,11 +1191,19 @@ 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,13 +1253,61 @@ 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;
|
||||
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue