summaryrefslogtreecommitdiff
path: root/variable.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-02-19 04:48:07 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-02-19 04:48:07 +0000
commitc08ebb301f304e316c853e210c2fbc7554de60f6 (patch)
treebdc775fbc992bfb9cf2f338460659bad216df497 /variable.c
parente2632074f272b236a2b4a71b74f9be01a584245f (diff)
* variable.c (rb_cvar_set): define new class variable if it's not
defined yet. * eval.c (rb_eval_string_wrap): should hide the toplevel local variable bindings by PUSH_SCOPE(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_6@2088 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'variable.c')
-rw-r--r--variable.c36
1 files changed, 17 insertions, 19 deletions
diff --git a/variable.c b/variable.c
index 44ce2a29e1..a1335eb443 100644
--- a/variable.c
+++ b/variable.c
@@ -1357,11 +1357,12 @@ rb_define_global_const(name, val)
rb_define_const(rb_cObject, name, val);
}
-void
-rb_cvar_set(klass, id, val)
+static void
+cvar_set(klass, id, val, warn)
VALUE klass;
ID id;
VALUE val;
+ int warn;
{
VALUE tmp;
@@ -1371,37 +1372,34 @@ rb_cvar_set(klass, id, val)
if (OBJ_FROZEN(tmp)) rb_error_frozen("class/module");
if (!OBJ_TAINTED(tmp) && rb_safe_level() >= 4)
rb_raise(rb_eSecurityError, "Insecure: can't modify class variable");
+ if (warn && ruby_verbose && klass != tmp) {
+ rb_warning("already initialized class variable %s", rb_id2name(id));
+ }
st_insert(RCLASS(tmp)->iv_tbl,id,val);
return;
}
tmp = RCLASS(tmp)->super;
}
- rb_raise(rb_eNameError,"uninitialized class variable %s in %s",
- rb_id2name(id), rb_class2name(klass));
+ mod_av_set(klass, id, val, Qfalse);
}
void
-rb_cvar_declare(klass, id, val)
+rb_cvar_set(klass, id, val)
VALUE klass;
ID id;
VALUE val;
{
- VALUE tmp;
-
- tmp = klass;
- while (tmp) {
- if (RCLASS(tmp)->iv_tbl && st_lookup(RCLASS(tmp)->iv_tbl,id,0)) {
- if (OBJ_FROZEN(tmp)) rb_error_frozen("class/module");
- if (!OBJ_TAINTED(tmp) && rb_safe_level() >= 4)
- rb_raise(rb_eSecurityError, "Insecure: can't modify class variable");
- st_insert(RCLASS(tmp)->iv_tbl,id,val);
- return;
- }
- tmp = RCLASS(tmp)->super;
- }
+ cvar_set(klass, id, val, Qfalse);
+}
- mod_av_set(klass, id, val, Qfalse);
+void
+rb_cvar_declare(klass, id, val)
+ VALUE klass;
+ ID id;
+ VALUE val;
+{
+ cvar_set(klass, id, val, Qtrue);
}
VALUE