summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-02-18 06:59:36 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-02-18 06:59:36 +0000
commit3d6fde336547463461180b9be5b1730194764d9c (patch)
treec268af56267dcc487f65cec821380293b37f4749 /eval.c
parentf0886df4a4d017ed3655b1e1a4a4df2ebaa8c71e (diff)
2000-02-18
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@621 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/eval.c b/eval.c
index e597ea00ae..b913680eb0 100644
--- a/eval.c
+++ b/eval.c
@@ -1316,6 +1316,8 @@ superclass(self, node)
return val;
}
+#define ruby_cbase (((NODE*)ruby_frame->cbase)->nd_clss)
+
static VALUE
ev_const_defined(cref, id)
NODE *cref;
@@ -1400,7 +1402,7 @@ rb_mod_s_constants()
cbase = cbase->nd_next;
}
- rb_mod_const_of(((NODE*)ruby_frame->cbase)->nd_clss, ary);
+ rb_mod_const_of(ruby_cbase, ary);
return ary;
}
@@ -2510,6 +2512,22 @@ rb_eval(self, node)
rb_const_set(ruby_class, node->nd_vid, result);
break;
+ case NODE_SHASGN:
+ if (NIL_P(ruby_class)) {
+ rb_raise(rb_eTypeError, "no class/module to define shared variable");
+ }
+ result = rb_eval(self, node->nd_value);
+ rb_shared_variable_set(ruby_cbase, node->nd_vid, result);
+ break;
+
+ case NODE_SHDECL:
+ if (NIL_P(ruby_class)) {
+ rb_raise(rb_eTypeError, "no class/module to define shared variable");
+ }
+ result = rb_eval(self, node->nd_value);
+ rb_shared_variable_declare(ruby_class, node->nd_vid, result);
+ break;
+
case NODE_LVAR:
if (ruby_scope->local_vars == 0) {
rb_bug("unexpected local variable");
@@ -2533,6 +2551,10 @@ rb_eval(self, node)
result = ev_const_get((NODE*)ruby_frame->cbase, node->nd_vid);
break;
+ case NODE_SHVAR:
+ result = rb_shared_variable_get(ruby_cbase, node->nd_vid);
+ break;
+
case NODE_BLOCK_ARG:
if (ruby_scope->local_vars == 0)
rb_bug("unexpected block argument");
@@ -3486,6 +3508,11 @@ assign(self, lhs, val, check)
rb_const_set(ruby_class, lhs->nd_vid, val);
break;
+ case NODE_SHDECL:
+ case NODE_SHASGN:
+ rb_shared_variable_set(ruby_cbase, lhs->nd_vid, val);
+ break;
+
case NODE_MASGN:
massign(self, lhs, val, check);
break;
@@ -4433,7 +4460,7 @@ eval(self, src, scope, file, line)
}
}
PUSH_CLASS();
- ruby_class = ((NODE*)ruby_frame->cbase)->nd_clss;
+ ruby_class = ruby_cbase;
ruby_in_eval++;
if (TYPE(ruby_class) == T_ICLASS) {