summaryrefslogtreecommitdiff
path: root/variable.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-08-25 08:26:06 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-08-25 08:26:06 +0000
commitdf9d49d0881d9596b9b7d23dbd42950d5048bd9d (patch)
tree11dbf94b16c3de9756d62f43e113323d8d4d3883 /variable.c
parentd68d1d15843125c6ae91055feb05f08b8c70e4f6 (diff)
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.c43
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)) {