matz - disappointing fixes

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@949 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2000-09-20 09:16:32 +00:00
parent 5039daaf2e
commit fc57cd59ff
5 changed files with 46 additions and 11 deletions

View File

@ -1,3 +1,16 @@
Wed Sep 20 14:01:45 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
* eval.c (rb_provided): detect infnite load loop.
* eval.c (rb_provided): too weak filename comparison.
* eval.c (rb_thread_alloc): avoid recycling still referenced
dvar structures.
* eval.c (rb_callcc): ditto.
* eval.c (THREAD_ALLOC): fiil dyna_vars field by ruby_dyna_vars.
Tue Sep 19 17:47:03 2000 Yukihiro Matsumoto <matz@ruby-lang.org> Tue Sep 19 17:47:03 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
* stable version 1.6.0 released. * stable version 1.6.0 released.

28
eval.c
View File

@ -5043,8 +5043,10 @@ rb_provided(feature)
if (strcmp(f+len, ".so") == 0) { if (strcmp(f+len, ".so") == 0) {
return Qtrue; return Qtrue;
} }
if (strcmp(f+len, ".rb") == 0) {
goto load_wait; goto load_wait;
} }
}
p++; p++;
} }
return Qfalse; return Qfalse;
@ -5053,7 +5055,12 @@ rb_provided(feature)
if (loading_tbl) { if (loading_tbl) {
char *ext = strrchr(f, '.'); char *ext = strrchr(f, '.');
if (strcmp(ext, ".rb") == 0) { if (strcmp(ext, ".rb") == 0) {
while (st_lookup(loading_tbl, f, 0)) { rb_thread_t th;
while (st_lookup(loading_tbl, f, &th)) {
if (th == curr_thread) {
rb_raise(rb_eLoadError, "infinite load loop -- %s", f);
}
CHECK_INTS; CHECK_INTS;
rb_thread_schedule(); rb_thread_schedule();
} }
@ -5186,7 +5193,8 @@ rb_f_require(obj, fname)
if (!loading_tbl) { if (!loading_tbl) {
loading_tbl = st_init_strtable(); loading_tbl = st_init_strtable();
} }
st_insert(loading_tbl, strdup(feature), 0); /* partial state */ /* partial state */
st_insert(loading_tbl, strdup(feature), curr_thread);
PUSH_TAG(PROT_NONE); PUSH_TAG(PROT_NONE);
if ((state = EXEC_TAG()) == 0) { if ((state = EXEC_TAG()) == 0) {
@ -5866,6 +5874,7 @@ rb_f_binding(self)
} }
for (vars = data->d_vars; vars; vars = vars->next) { for (vars = data->d_vars; vars; vars = vars->next) {
if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
FL_SET(vars, DVAR_DONT_RECYCLE); FL_SET(vars, DVAR_DONT_RECYCLE);
} }
scope_dup(data->scope); scope_dup(data->scope);
@ -5947,6 +5956,7 @@ proc_new(klass)
data->flags |= BLOCK_DYNAMIC; data->flags |= BLOCK_DYNAMIC;
for (vars = data->d_vars; vars; vars = vars->next) { for (vars = data->d_vars; vars; vars = vars->next) {
if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
FL_SET(vars, DVAR_DONT_RECYCLE); FL_SET(vars, DVAR_DONT_RECYCLE);
} }
scope_dup(data->scope); scope_dup(data->scope);
@ -7617,7 +7627,7 @@ rb_thread_abort_exc_set(thread, val)
th->scope = 0;\ th->scope = 0;\
th->klass = 0;\ th->klass = 0;\
th->wrapper = 0;\ th->wrapper = 0;\
th->dyna_vars = 0;\ th->dyna_vars = ruby_dyna_vars;\
th->block = 0;\ th->block = 0;\
th->iter = 0;\ th->iter = 0;\
th->tag = 0;\ th->tag = 0;\
@ -7637,6 +7647,7 @@ rb_thread_alloc(klass)
VALUE klass; VALUE klass;
{ {
rb_thread_t th; rb_thread_t th;
struct RVarmap *vars;
THREAD_ALLOC(th); THREAD_ALLOC(th);
th->thread = Data_Wrap_Struct(klass, thread_mark, thread_free, th); th->thread = Data_Wrap_Struct(klass, thread_mark, thread_free, th);
@ -7654,6 +7665,10 @@ rb_thread_alloc(klass)
th->status = THREAD_RUNNABLE; th->status = THREAD_RUNNABLE;
} }
for (vars = th->dyna_vars; vars; vars = vars->next) {
if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
FL_SET(vars, DVAR_DONT_RECYCLE);
}
return th; return th;
} }
@ -8140,6 +8155,7 @@ rb_callcc(self)
volatile VALUE cont; volatile VALUE cont;
rb_thread_t th; rb_thread_t th;
struct tag *tag; struct tag *tag;
struct RVarmap *vars;
THREAD_ALLOC(th); THREAD_ALLOC(th);
cont = Data_Wrap_Struct(rb_cCont, thread_mark, cont = Data_Wrap_Struct(rb_cCont, thread_mark,
@ -8151,6 +8167,12 @@ rb_callcc(self)
} }
th->prev = th->next = 0; th->prev = th->next = 0;
th->thread = curr_thread->thread; th->thread = curr_thread->thread;
for (vars = th->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)) { if (THREAD_SAVE_CONTEXT(th)) {
return th->result; return th->result;
} }

View File

@ -223,7 +223,7 @@ class SizedQueue<Queue
def max=(max) def max=(max)
Thread.critical = true Thread.critical = true
if @max >= max if max >= @max
@max = max @max = max
Thread.critical = false Thread.critical = false
else else

View File

@ -115,7 +115,7 @@ class ThreadsWait
@threads.delete(th = @wait_queue.pop(nonblock)) @threads.delete(th = @wait_queue.pop(nonblock))
th th
rescue ThreadError rescue ThreadError
ThreadsWait.fail ErrNoFinshedThread ThreadsWait.fail ErrNoFinishedThread
end end
end end

View File

@ -1,4 +1,4 @@
#define RUBY_VERSION "1.6.0" #define RUBY_VERSION "1.6.1"
#define RUBY_RELEASE_DATE "2000-09-19" #define RUBY_RELEASE_DATE "2000-09-20"
#define RUBY_VERSION_CODE 160 #define RUBY_VERSION_CODE 161
#define RUBY_RELEASE_CODE 20000919 #define RUBY_RELEASE_CODE 20000920