summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-03-08 06:59:55 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-03-08 06:59:55 +0000
commit3e29ea9a7d319b43e3910f0e14eefa4f3104920b (patch)
tree0a646cf7fe974c93a7f912c4e1da6a7dab4a152b /eval.c
parentcffe9928c4afb9dfbb5910a6b4f254cb3457470d (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.c51
1 files changed, 21 insertions, 30 deletions
diff --git a/eval.c b/eval.c
index f546f03dfe..d12a9dc8ba 100644
--- a/eval.c
+++ b/eval.c
@@ -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: