diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2000-08-25 08:26:06 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2000-08-25 08:26:06 +0000 |
commit | df9d49d0881d9596b9b7d23dbd42950d5048bd9d (patch) | |
tree | 11dbf94b16c3de9756d62f43e113323d8d4d3883 /variable.c | |
parent | d68d1d15843125c6ae91055feb05f08b8c70e4f6 (diff) | |
download | ruby-df9d49d0881d9596b9b7d23dbd42950d5048bd9d.tar.gz |
matz
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@903 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'variable.c')
-rw-r--r-- | variable.c | 43 |
1 files changed, 17 insertions, 26 deletions
diff --git a/variable.c b/variable.c index 36882a3063..3885693d9a 100644 --- a/variable.c +++ b/variable.c @@ -1228,11 +1228,12 @@ rb_const_defined(klass, id) } static void -rb_mod_av_set(klass, id, val, dest) +mod_av_set(klass, id, val, dest, once) VALUE klass; ID id; VALUE val; char *dest; + int once; { if (!OBJ_TAINTED(klass) && rb_safe_level() >= 4) rb_raise(rb_eSecurityError, "Insecure: can't set %s", dest); @@ -1240,7 +1241,7 @@ rb_mod_av_set(klass, id, val, dest) if (!RCLASS(klass)->iv_tbl) { RCLASS(klass)->iv_tbl = st_init_numtable(); } - else if (st_lookup(RCLASS(klass)->iv_tbl, id, 0)) { + else if (once && st_lookup(RCLASS(klass)->iv_tbl, id, 0)) { rb_warn("already initialized %s %s", dest, rb_id2name(id)); } @@ -1253,7 +1254,7 @@ rb_const_set(klass, id, val) ID id; VALUE val; { - rb_mod_av_set(klass, id, val, "constant"); + mod_av_set(klass, id, val, "constant", Qtrue); } void @@ -1324,18 +1325,6 @@ rb_define_global_const(name, val) } void -rb_cvar_declare(klass, id, val) - VALUE klass; - ID id; - VALUE val; -{ - if (FL_TEST(klass, FL_SINGLETON)) { - klass = rb_iv_get(klass, "__attached__"); - } - rb_mod_av_set(klass, id, val, "class variable"); -} - -void rb_cvar_set(klass, id, val) VALUE klass; ID id; @@ -1345,9 +1334,6 @@ rb_cvar_set(klass, id, val) if (!OBJ_TAINTED(klass) && rb_safe_level() >= 4) rb_raise(rb_eSecurityError, "Insecure: can't modify class variable"); - if (FL_TEST(klass, FL_SINGLETON)) { - klass = rb_iv_get(klass, "__attached__"); - } tmp = klass; while (tmp) { if (RCLASS(tmp)->iv_tbl && st_lookup(RCLASS(tmp)->iv_tbl,id,0)) { @@ -1357,7 +1343,17 @@ rb_cvar_set(klass, id, val) tmp = RCLASS(tmp)->super; } - rb_raise(rb_eNameError,"uninitialized class variable %s",rb_id2name(id)); + rb_raise(rb_eNameError,"uninitialized class variable %s in %s", + rb_id2name(id), rb_class2name(klass)); +} + +void +rb_cvar_declare(klass, id, val) + VALUE klass; + ID id; + VALUE val; +{ + mod_av_set(klass, id, val, "class variable", Qfalse); } VALUE @@ -1368,9 +1364,6 @@ rb_cvar_get(klass, id) VALUE value; VALUE tmp; - if (FL_TEST(klass, FL_SINGLETON)) { - klass = rb_iv_get(klass, "__attached__"); - } tmp = klass; while (tmp) { if (RCLASS(tmp)->iv_tbl && st_lookup(RCLASS(tmp)->iv_tbl,id,&value)) { @@ -1379,7 +1372,8 @@ rb_cvar_get(klass, id) tmp = RCLASS(tmp)->super; } - rb_raise(rb_eNameError,"uninitialized class variable %s",rb_id2name(id)); + rb_raise(rb_eNameError,"uninitialized class variable %s in %s", + rb_id2name(id), rb_class2name(klass)); return Qnil; /* not reached */ } @@ -1390,9 +1384,6 @@ rb_cvar_defined(klass, id) { VALUE tmp; - if (FL_TEST(klass, FL_SINGLETON)) { - klass = rb_iv_get(klass, "__attached__"); - } tmp = klass; while (tmp) { if (RCLASS(tmp)->iv_tbl && st_lookup(RCLASS(tmp)->iv_tbl,id,0)) { |