diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1998-06-12 09:35:19 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1998-06-12 09:35:19 +0000 |
commit | 83687c4eb47e2bcbe463d097317d068d1dd0b734 (patch) | |
tree | 003e23f99c0a3e8587360aa2a6282c702b564fc5 | |
parent | 1bc6f594d3de8dbfb5c165835eaec99bd49327c8 (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-- | ChangeLog | 4 | ||||
-rw-r--r-- | eval.c | 57 | ||||
-rw-r--r-- | ext/Setup | 2 | ||||
-rw-r--r-- | parse.y | 4 | ||||
-rw-r--r-- | sample/test.rb | 12 |
5 files changed, 37 insertions, 42 deletions
@@ -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. @@ -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; @@ -9,5 +9,5 @@ #md5 #socket #tkutil -tcltklib +#tcltklib #gtk @@ -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 912f84e2d4..b3303959f2 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') |