diff --git a/ChangeLog b/ChangeLog index 4eeeb261ce..01a40a942e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Sat Sep 25 01:52:49 2004 Yukihiro Matsumoto + + * struct.c (rb_struct_s_members): wrong call of struct_members. + [ruby-dev:24333] + +Fri Sep 24 16:09:42 2004 Yukihiro Matsumoto + + * eval.c (proc_invoke): propagate DVAR_DONT_RECYCLE on termination + to avoid double call to rb_gc_force_recycle(). [ruby-dev:24311] + Fri Sep 24 08:29:45 2004 Yukihiro Matsumoto * parse.y (rb_parser_append_print): should handle prelude. diff --git a/eval.c b/eval.c index be872baa8c..d2b28a8f44 100644 --- a/eval.c +++ b/eval.c @@ -8090,6 +8090,14 @@ proc_invoke(proc, args, self, klass) POP_ITER(); ruby_block = old_block; ruby_wrapper = old_wrapper; + if (FL_TEST(ruby_dyna_vars, DVAR_DONT_RECYCLE)) { + struct RVarmap *vars; + + for (vars = old_dvars; vars; vars = vars->next) { + if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break; + FL_SET(vars, DVAR_DONT_RECYCLE); + } + } ruby_dyna_vars = old_dvars; if (proc_safe_level_p(proc)) ruby_safe_level = safe; @@ -12136,6 +12144,7 @@ rb_callcc(self) volatile rb_thread_t th_save; struct tag *tag; struct RVarmap *vars; + struct BLOCK *blk; THREAD_ALLOC(th); cont = Data_Wrap_Struct(rb_cCont, thread_mark, thread_free, th); @@ -12146,11 +12155,10 @@ rb_callcc(self) } th->thread = curr_thread->thread; - for (vars = th->dyna_vars; vars; vars = vars->next) { + for (vars = ruby_dyna_vars; vars; vars = vars->next) { if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break; FL_SET(vars, DVAR_DONT_RECYCLE); } - th_save = th; if (THREAD_SAVE_CONTEXT(th)) { return th_save->result; diff --git a/struct.c b/struct.c index 4d5ca452fe..77a5dc128a 100644 --- a/struct.c +++ b/struct.c @@ -33,11 +33,23 @@ rb_struct_iv_get(c, name) } } +static VALUE +struct_s_members(klass) + VALUE klass; +{ + VALUE members = rb_struct_iv_get(klass, "__members__"); + + if (NIL_P(members)) { + rb_bug("non-initialized struct"); + } + return members; +} + static VALUE struct_members(s) VALUE s; { - VALUE members = rb_struct_iv_get(rb_obj_class(s), "__members__"); + VALUE members = struct_s_members(rb_obj_class(s)); if (NIL_P(members)) { rb_bug("non-initialized struct"); @@ -50,13 +62,13 @@ struct_members(s) } static VALUE -rb_struct_s_members(obj) - VALUE obj; +rb_struct_s_members(klass) + VALUE klass; { VALUE members, ary; VALUE *p, *pend; - members = struct_members(obj); + members = struct_s_members(klass); ary = rb_ary_new2(RARRAY(members)->len); p = RARRAY(members)->ptr; pend = p + RARRAY(members)->len; while (p < pend) {