diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2002-03-08 06:59:55 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2002-03-08 06:59:55 +0000 |
commit | 3e29ea9a7d319b43e3910f0e14eefa4f3104920b (patch) | |
tree | 0a646cf7fe974c93a7f912c4e1da6a7dab4a152b /eval.c | |
parent | cffe9928c4afb9dfbb5910a6b4f254cb3457470d (diff) |
* eval.c (cvar_cbase): utility function to find innermost non
singleton cbase.
* eval.c (is_defined): adopt new cvar behavior.
* eval.c (rb_eval): ditto.
* eval.c (assign): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_6@2168 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 51 |
1 files changed, 21 insertions, 30 deletions
@@ -1461,6 +1461,20 @@ ev_const_get(cref, id, self) } static VALUE +cvar_cbase() +{ + NODE *cref = RNODE(ruby_frame->cbase); + + while (cref && cref->nd_next && FL_TEST(cref->nd_clss, FL_SINGLETON)) { + cref = cref->nd_next; + if (!cref->nd_next) { + rb_warn("class variable access from toplevel singleton method"); + } + } + return cref->nd_clss; +} + +static VALUE rb_mod_nesting() { NODE *cbase = RNODE(ruby_frame->cbase); @@ -1837,19 +1851,7 @@ is_defined(self, node, buf) break; case NODE_CVAR: - if (NIL_P(ruby_cbase)) { - if (rb_cvar_defined(CLASS_OF(self), node->nd_vid)) { - return "class variable"; - } - break; - } - if (!FL_TEST(ruby_cbase, FL_SINGLETON)) { - if (rb_cvar_defined(ruby_cbase, node->nd_vid)) { - return "class variable"; - } - break; - } - if (rb_cvar_defined(rb_iv_get(ruby_cbase, "__attached__"), node->nd_vid)) { + if (rb_cvar_defined(cvar_cbase(), node->nd_vid)) { return "class variable"; } break; @@ -2724,15 +2726,12 @@ rb_eval(self, n) rb_raise(rb_eTypeError, "no class/module to define class variable"); } result = rb_eval(self, node->nd_value); - if (ruby_verbose && FL_TEST(ruby_cbase, FL_SINGLETON)) { - rb_warn("declaring singleton class variable"); - } - rb_cvar_declare(ruby_cbase, node->nd_vid, result); + rb_cvar_declare(cvar_cbase(), node->nd_vid, result); break; case NODE_CVASGN: result = rb_eval(self, node->nd_value); - rb_cvar_set(ruby_cbase, node->nd_vid, result); + rb_cvar_set(cvar_cbase(), node->nd_vid, result); break; case NODE_LVAR: @@ -2759,15 +2758,7 @@ rb_eval(self, n) break; case NODE_CVAR: - if (NIL_P(ruby_cbase)) { - result = rb_cvar_get(CLASS_OF(self), node->nd_vid); - break; - } - if (!FL_TEST(ruby_cbase, FL_SINGLETON)) { - result = rb_cvar_get(ruby_cbase, node->nd_vid); - break; - } - result = rb_cvar_get(rb_iv_get(ruby_cbase, "__attached__"), node->nd_vid); + result = rb_cvar_get(cvar_cbase(), node->nd_vid); break; case NODE_BLOCK_ARG: @@ -3014,7 +3005,7 @@ rb_eval(self, n) NODE *body = 0, *defn; if (rb_safe_level() >= 4 && !OBJ_TAINTED(recv)) { - rb_raise(rb_eSecurityError, "Insecure; can't define singleton method"); + rb_raise(rb_eSecurityError, "Insecure: can't define singleton method"); } if (FIXNUM_P(recv) || SYMBOL_P(recv)) { rb_raise(rb_eTypeError, @@ -3822,11 +3813,11 @@ assign(self, lhs, val, check) if (ruby_verbose && FL_TEST(ruby_cbase, FL_SINGLETON)) { rb_warn("declaring singleton class variable"); } - rb_cvar_declare(ruby_cbase, lhs->nd_vid, val); + rb_cvar_declare(cvar_cbase(), lhs->nd_vid, val); break; case NODE_CVASGN: - rb_cvar_set(ruby_cbase, lhs->nd_vid, val); + rb_cvar_set(cvar_cbase(), lhs->nd_vid, val); break; case NODE_MASGN: |