From: matz@... (Yukihiro Matsumoto) Date: 2000-09-20T14:04:50+09:00 Subject: [ruby-dev:10981] Re: [PATCH] require in require まつもと ゆきひろです In message "[ruby-dev:10978] [PATCH] require in require" on 00/09/20, "Nobuyoshi.Nakada" writes: | |なかだです。 | |$ cat a.rb |p __FILE__, $" |$ cat a/b.rb |p __FILE__, $" |require "a" |$ ruby -v -I. -ra/b -e0 |ruby 1.6.0 (2000-09-19) [i686-cygwin] |"./a/b.rb" |["a/b.rb"] |./a/b.rb:2:in `require': Interrupt | from ./a/b.rb:2 | | てな感じでデッドロックします。 | | 一応こんな風にしてみました。 そーゆーことまではしなくても直るようです。他の問題も合わせ、 以下のパッチが有効ではないでしょうか? --- /tmp/ruby-1.6.0/eval.c Tue Sep 19 01:28:34 2000 +++ eval.c Wed Sep 20 13:54:17 2000 @@ -3485,3 +3485,3 @@ struct RVarmap *vars = ruby_dyna_vars; - + while (vars && vars->id != 0) { @@ -5045,3 +5045,5 @@ } - goto load_wait; + if (strcmp(f+len, ".rb") == 0) { + goto load_wait; + } } @@ -5868,2 +5870,3 @@ for (vars = data->d_vars; vars; vars = vars->next) { + if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break; FL_SET(vars, DVAR_DONT_RECYCLE); @@ -5949,2 +5952,3 @@ for (vars = data->d_vars; vars; vars = vars->next) { + if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break; FL_SET(vars, DVAR_DONT_RECYCLE); @@ -7639,2 +7643,3 @@ rb_thread_t th; + struct RVarmap *vars; @@ -7656,2 +7661,6 @@ + for (vars = ruby_dyna_vars; vars; vars = vars->next) { + if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break; + FL_SET(vars, DVAR_DONT_RECYCLE); + } return th; @@ -8142,2 +8151,3 @@ struct tag *tag; + struct RVarmap *vars; @@ -8153,2 +8163,8 @@ th->thread = curr_thread->thread; + + for (vars = ruby_dyna_vars; vars; vars = vars->next) { + if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break; + FL_SET(vars, DVAR_DONT_RECYCLE); + } + if (THREAD_SAVE_CONTEXT(th)) {