diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-09-24 16:58:51 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-09-24 16:58:51 +0000 |
commit | ebcde8399fca12b0dd79153eb790af1a816746b8 (patch) | |
tree | b33f125f0b9224721f25f7898ff9c4a17a029d53 /eval.c | |
parent | a35bdb2c7383adf3f744844563ac0106929b440f (diff) | |
download | ruby-ebcde8399fca12b0dd79153eb790af1a816746b8.tar.gz ruby-ebcde8399fca12b0dd79153eb790af1a816746b8.tar.xz ruby-ebcde8399fca12b0dd79153eb790af1a816746b8.zip |
* struct.c (rb_struct_s_members): wrong call of struct_members.
[ruby-dev:24333]
* eval.c (proc_invoke): propagate DVAR_DONT_RECYCLE on termination
to avoid double call to rb_gc_force_recycle(). [ruby-dev:24311]
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@6959 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 12 |
1 files changed, 10 insertions, 2 deletions
@@ -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; |