summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-06-12 09:35:19 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-06-12 09:35:19 +0000
commit83687c4eb47e2bcbe463d097317d068d1dd0b734 (patch)
tree003e23f99c0a3e8587360aa2a6282c702b564fc5
parent1bc6f594d3de8dbfb5c165835eaec99bd49327c8 (diff)
nested local variables
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@240 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog4
-rw-r--r--eval.c57
-rw-r--r--ext/Setup2
-rw-r--r--parse.y4
-rw-r--r--sample/test.rb12
5 files changed, 37 insertions, 42 deletions
diff --git a/ChangeLog b/ChangeLog
index b1b2f8fa47d..f699abe1243 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Fri Jun 12 17:58:18 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
+
+ * eval.c (eval): write back the_dyna_var into the block.
+
Thu Jun 11 18:19:18 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
* experimental release 1.1b9_25.
diff --git a/eval.c b/eval.c
index aa83d7533ee..a50b3f5659b 100644
--- a/eval.c
+++ b/eval.c
@@ -454,24 +454,25 @@ new_dvar(id, value)
return vars;
}
-static struct RVarmap*
+static void
push_dvar(id, value)
ID id;
VALUE value;
{
- struct RVarmap* vars = new_dvar(id, value);
+ the_dyna_vars = new_dvar(id, value);
+}
- if (the_dyna_vars) {
- vars->next = the_dyna_vars->next;
+static void
+mark_dvar(vars)
+ struct RVarmap* vars;
+{
+ if (!vars) {
+ the_dyna_vars = new_dvar(0, 0);
the_dyna_vars->next = vars;
}
else {
- vars->id = id;
- vars->val = 0;
the_dyna_vars = vars;
}
-
- return vars;
}
VALUE
@@ -502,42 +503,21 @@ dyna_var_ref(id)
return Qnil;
}
-static void
-dvar_add_compiling(id)
+VALUE
+dyna_var_asgn(id, value)
ID id;
+ VALUE value;
{
struct RVarmap *vars = the_dyna_vars;
while (vars) {
- if (vars->id == 0) break;
if (vars->id == id) {
- return;
+ vars->val = value;
+ return value;
}
vars = vars->next;
}
- the_dyna_vars = new_dvar(id, 0);
-}
-
-VALUE
-dyna_var_asgn(id, value)
- ID id;
- VALUE value;
-{
- if (id == 0) {
- dvar_add_compiling((ID)value);
- }
- else {
- struct RVarmap *vars = the_dyna_vars;
-
- while (vars) {
- if (vars->id == id) {
- vars->val = value;
- return value;
- }
- vars = vars->next;
- }
- push_dvar(id, value);
- }
+ push_dvar(id, value);
return value;
}
@@ -2844,8 +2824,7 @@ rb_yield_0(val, self)
old_scope = the_scope;
the_scope = block->scope;
the_block = block->prev;
- the_dyna_vars = new_dvar(0, 0);
- the_dyna_vars->next = block->d_vars;
+ mark_dvar(block->d_vars);
the_class = block->klass;
if (!self) self = block->self;
node = block->body;
@@ -3018,7 +2997,6 @@ rb_iterate(it_proc, data1, bl_proc, data2)
iter_retry:
PUSH_ITER(ITER_PRE);
PUSH_BLOCK(0, node);
- _block.d_vars = new_dvar(0,0);
PUSH_TAG(PROT_NONE);
state = EXEC_TAG();
@@ -3819,7 +3797,7 @@ eval(self, src, scope, file, line)
old_block = the_block;
the_block = data->prev;
old_d_vars = the_dyna_vars;
- the_dyna_vars = data->d_vars;
+ mark_dvar(data->d_vars);
old_vmode = scope_vmode;
scope_vmode = data->vmode;
@@ -3856,6 +3834,7 @@ eval(self, src, scope, file, line)
the_frame = the_frame->prev;
the_scope = old_scope;
the_block = old_block;
+ data->d_vars = the_dyna_vars;
the_dyna_vars = old_d_vars;
data->vmode = scope_vmode; /* write back visibility mode */
scope_vmode = old_vmode;
diff --git a/ext/Setup b/ext/Setup
index 2eb11c7ade4..9e3a2474c3a 100644
--- a/ext/Setup
+++ b/ext/Setup
@@ -9,5 +9,5 @@
#md5
#socket
#tkutil
-tcltklib
+#tcltklib
#gtk
diff --git a/parse.y b/parse.y
index a070f4470a0..13a0264b222 100644
--- a/parse.y
+++ b/parse.y
@@ -236,6 +236,7 @@ static void top_local_setup();
%%
program : {
+ $<vars>$ = the_dyna_vars;
lex_state = EXPR_BEG;
top_local_init();
NEW_CREF0(); /* initialize constant c-ref */
@@ -248,6 +249,7 @@ program : {
top_local_setup();
cur_cref = 0;
class_nest = 0;
+ the_dyna_vars = $<vars>1;
}
compstmt : stmts opt_terms
@@ -3424,7 +3426,7 @@ assignable(id, val)
}
else{
if (!dyna_var_defined(id)) {
- dyna_var_asgn(0, id);
+ dyna_var_asgn(id, 0);
}
lhs = NEW_DASGN(id, val);
}
diff --git a/sample/test.rb b/sample/test.rb
index 912f84e2d48..b3303959f24 100644
--- a/sample/test.rb
+++ b/sample/test.rb
@@ -653,7 +653,6 @@ ok(!defined?(iii)) # out of scope
$x=0
$proc.call(5)
$proc2.call
-p $x
ok($x == 5)
if defined? Process.kill
@@ -739,6 +738,17 @@ rescue NameError # must raise error
end
ok(!$bad)
+x = proc{}
+eval "i = 1", x
+ok(eval("i", x) == 1)
+x = proc{proc{}}.call
+eval "i = 22", x
+ok(eval("i", x) == 22)
+$x = []
+x = proc{proc{}}.call
+eval "(0..9).each{|i4| $x[i4] = proc{i4*2}}", x
+ok($x[4].call == 8)
+
check "system"
ok(`echo foobar` == "foobar\n")
ok(`./ruby -e 'print "foobar"'` == 'foobar')