diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2002-02-19 04:48:07 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2002-02-19 04:48:07 +0000 |
commit | c08ebb301f304e316c853e210c2fbc7554de60f6 (patch) | |
tree | bdc775fbc992bfb9cf2f338460659bad216df497 /variable.c | |
parent | e2632074f272b236a2b4a71b74f9be01a584245f (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.c | 36 |
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 |