From: Koji Arai Date: 2000-01-17T04:55:00+09:00 Subject: [ruby-dev:8941] [BUG] recycle the ruby_dyna_vars 新井です。 バグ報告(ruby-1.5.0)です。 以下のコードで、2回目の p x がnilを表示します。 #!/usr/local/bin/ruby loop {|x| x = 1 v = 1 if nil v = 1 loop {break} p x p x break } __END__ ruby 1.5.0 (2000-01-08) [i586-linux] 1 nil どうやら、loop {break}で、ruby_dyna_vars が、freelistに入れ られているようです。 修正してみましたが、ちょっとズルイ気がします。より良い修正方 法があれば教えてください。 ruby_dyna_vars->id == 0なエントリの意味もついでに教えていた だければうれしいです。 (スコープの区切りってことかな?だとすると、2番目のv=1で dvar_asgn_push()が呼ばれるような修正をしないといけない??) Index: eval.c =================================================================== RCS file: /home/cvs/ruby/eval.c,v retrieving revision 1.24 diff -u -p -u -r1.24 eval.c --- eval.c 2000/01/05 04:36:59 1.24 +++ eval.c 2000/01/16 19:46:00 @@ -3336,7 +3336,7 @@ rb_yield_0(val, self, klass, acheck) do { rb_gc_force_recycle((VALUE)vars); vars = vars->next; - } while (vars && vars->id != 0); + } while (vars && vars->id != 0 && vars != block->d_vars); } POP_VARS(); ruby_block = block; -- 新井康司 (Koji Arai)